操作系统知识
操作系统基础概念
操作系统是管理计算机硬件与软件资源的系统软件,为用户和应用程序提供接口。主要功能包括进程管理、内存管理、文件系统管理、设备管理和用户界面。
进程与线程
进程是程序的一次执行实例,拥有独立的地址空间和系统资源。线程是进程内的执行单元,共享进程资源但拥有独立的栈和寄存器。多线程能提高程序并发性,但需注意线程同步问题。
线程的运行状态:新建、就绪、运行、阻塞、等待、超时等待、死亡
内存管理
操作系统通过虚拟内存技术扩展物理内存空间。分页机制将内存划分为固定大小的页,通过页表实现虚拟地址到物理地址的映射。页面置换算法如LRU(最近最少使用)用于处理缺页中断。
文件系统
文件系统负责数据的存储和检索。常见结构包括FAT32、NTFS和ext4。文件系统通过目录树组织文件,提供权限控制和数据冗余机制。
设备管理
操作系统通过设备驱动程序与硬件交互。中断机制和DMA(直接内存访问)技术用于提高I/O效率。设备管理还包括缓冲区和SPOOLing技术。
同步与死锁
进程同步机制包括信号量、互斥锁和条件变量。
死锁指多个进程因争夺资源而相互等待的现象。
死锁预防策略包括资源有序分配和银行家算法。
死锁的发生必须同时满足以下四个必要条件:
互斥条件
资源一次只能被一个进程占用,其他进程必须等待该资源被释放。占有并等待
进程已经持有至少一个资源,同时又在等待获取其他被占用的资源。不可抢占条件
已分配给进程的资源不能被其他进程强行剥夺,必须由进程自行释放。循环等待条件
存在一个进程等待的循环链,每个进程都在等待下一个进程所占用的资源。
死锁解决方案
预防死锁
通过破坏死锁的四个必要条件之一来避免死锁的发生:
破坏互斥条件
允许某些资源被共享访问,例如只读文件。但许多资源(如打印机)无法共享。破坏占有并等待
要求进程在开始执行前一次性申请所有所需资源,或释放已有资源后再申请新资源。破坏不可抢占条件
若进程无法获取所需资源,则释放已占用的资源,等待后续重新申请。破坏循环等待
对资源类型进行线性排序,强制进程按顺序申请资源。
避免死锁
通过动态检查资源分配状态确保系统不会进入不安全状态:
- 银行家算法
模拟资源分配过程,仅当分配后系统仍处于安全状态时才允许分配。
检测与恢复
允许死锁发生,但定期检测并采取措施恢复:
资源分配图检测
通过图论方法检测是否存在循环等待。恢复方法
终止部分进程或强制释放资源以打破死锁。
忽略死锁
某些系统(如某些嵌入式系统)可能选择忽略死锁,认为其发生概率极低或影响较小。
实际应用建议
- 在编程中,尽量按固定顺序获取锁以减少循环等待的可能性。
- 使用超时机制,避免无限期等待资源。
- 减少锁的粒度,缩短持有锁的时间。
系统调用
系统调用是用户程序与操作系统内核交互的接口。常见调用包括文件操作(open/read/write)、进程控制(fork/exec)和网络通信(socket)。
常见操作系统架构
- 单体内核:如Linux,所有功能模块运行在内核空间
- 微内核:如QNX,仅核心功能在内核,其他模块运行在用户态
- 混合内核:如Windows NT,结合单体与微内核特点
性能优化技术
- 缓存机制:减少磁盘I/O操作
- 预读取:提前加载可能访问的数据
- 写时复制:减少内存复制开销
- 负载均衡:在多核系统中合理分配任务
安全机制
操作系统安全包括用户认证、访问控制列表(ACL)、能力机制和防火墙。现代系统还采用地址空间布局随机化(ASLR)和数据执行保护(DEP)防范攻击。
虚拟化技术
虚拟化通过Hypervisor创建多个虚拟机实例。类型1 Hypervisor直接运行在硬件上(如Xen),类型2运行在主机OS上(如VirtualBox)。容器技术(Docker)提供更轻量级的虚拟化方案。
虚拟机和Docker区别
Docker基于容器化技术,直接共享宿主机的操作系统内核,通过命名空间和控制组(cgroups)实现隔离。虚拟机(VM)依赖Hypervisor虚拟化硬件,每个VM运行独立的完整操作系统。
虚拟机提供完整的硬件级隔离,不同VM间完全独立。容器使用进程级隔离,共享操作系统内核,存在潜在安全风险(需配合Seccomp、AppArmor等增强)。
性能表现:容器因直接调用宿主机内核,性能接近原生。虚拟机需通过Hypervisor层转换,存在约5-15%的性能损耗。