=================================== 操作系统 =================================== 0. 要点汇总 ==================== 本篇文章的要点整理如下 - 操作系统:管理计算机硬件与软件资源的系统软件,为用户提供服务 - 内核:操作系统的核心,负责资源管理和调度 - 系统调用:用户程序请求操作系统服务的接口 - 进程:正在执行的程序的实例,是资源分配的基本单位 - 线程:进程内的执行单元,是调度的基本单位 - 进程状态:就绪、运行、阻塞 - 进程调度:选择哪个进程占用CPU的策略 - 进程同步:协调多个进程的执行顺序,避免竞争条件 - 进程通信:进程之间交换信息的方式 - 进程控制块(PCB):存储进程信息的控制结构 - 上下文切换:保存当前进程状态,加载下一个进程状态 - 死锁:多个进程互相等待对方释放资源,导致都无法继续执行 - 内存管理:分配和管理内存资源 - 虚拟内存:将程序的一部分装入内存即可运行 - 分页:将内存和程序分成固定大小的页 - 分段:将程序按逻辑单位分段 - 页面置换算法:选择哪个页面换出内存的策略 - 文件系统:组织和存储文件的系统 - 文件:具有名称的一组相关信息的集合 - 目录:文件的集合,用于组织文件 - 文件描述符:内核维护的打开文件的索引 - IO管理:管理输入输出设备 - 设备驱动:控制硬件设备的软件 - 缓冲区:临时存储数据的区域 - 中断:CPU暂停当前程序,响应外部事件 1. 操作系统概述 =================================== 1.1 操作系统的定义与作用 -------------------------- **操作系统的定义** 操作系统(Operating System, OS)是管理计算机硬件与软件资源的系统软件,为用户和应用程序提供服务和接口。 **操作系统的作用** 1. **资源管理**:管理CPU、内存、磁盘、IO设备等硬件资源 2. **提供服务**:为用户和应用程序提供友好的接口和环境 3. **抽象硬件**:隐藏硬件细节,提供虚拟化的接口 4. **提高效率**:优化资源利用,提高系统性能 5. **保证安全**:保护系统资源和用户数据安全 **操作系统的主要功能** - 处理机管理 - 存储器管理 - 设备管理 - 文件管理 - 网络管理 - 用户接口 1.2 操作系统的发展 --------------------- **手工操作阶段** 用户直接操作计算机,效率低下。 **批处理系统** 将多个作业成批处理,提高CPU利用率。 - 单道批处理:内存中只有一个作业 - 多道批处理:内存中有多个作业 **分时系统** 多个用户通过终端同时使用计算机,响应时间短。 **实时系统** 对外部事件做出及时响应,保证确定性。 - 硬实时:必须在规定时间内完成 - 软实时:尽量在规定时间内完成 **网络操作系统** 管理网络资源,支持网络通信。 **分布式操作系统** 管理分布式系统中的资源,实现透明访问。 1.3 操作系统的分类 --------------------- **按应用场景分类** - 桌面操作系统:Windows、macOS、Linux - 服务器操作系统:Windows Server、Linux、Unix - 嵌入式操作系统:FreeRTOS、VxWorks - 移动操作系统:Android、iOS - 实时操作系统:QNX、VxWorks **按系统架构分类** - 批处理系统 - 分时系统 - 实时系统 - 网络操作系统 - 分布式操作系统 **按用户界面分类** - 命令行界面(CLI) - 图形用户界面(GUI) 1.4 操作系统的结构 --------------------- **单体结构** 整个操作系统作为一个单一的大程序,功能耦合紧密。 优点:效率高 缺点:难以维护和扩展 **分层结构** 将操作系统分为若干层,上层调用下层的服务。 优点:结构清晰,易于理解 缺点:效率较低 **微内核结构** 将核心功能移到用户空间,内核只保留最基本的功能。 优点:灵活、可靠、易于扩展 缺点:效率较低 **外核结构** 将硬件资源直接分配给应用程序,应用程序自行管理。 优点:灵活性极高 缺点:安全性较差 2. 进程管理 =================================== 2.1 进程的概念 --------------------- **进程的定义** 进程是正在执行的程序的实例,是资源分配和调度的基本单位。 **进程与程序的区别** 1. 程序是静态的,进程是动态的 2. 程序是永久的,进程是暂时的 3. 一个程序可以对应多个进程 **进程的组成** - 代码段:存放程序代码 - 数据段:存放程序数据 - 堆栈段:存放函数调用栈和动态分配的内存 **进程控制块(PCB)** 进程控制块(Process Control Block)是操作系统维护进程信息的结构。 包含内容: - 进程标识符(PID) - 进程状态 - 程序计数器 - 寄存器值 - 调度信息 - 内存管理信息 - IO状态信息 - 账户信息 2.2 进程状态 --------------------- **进程的三种基本状态** 1. **就绪态(Ready)**:进程已准备好执行,等待分配CPU 2. **运行态(Running)**:进程正在CPU上执行 3. **阻塞态(Blocked)**:进程等待某个事件完成 **进程状态转换** - 就绪态 → 运行态:调度器选中进程 - 运行态 → 就绪态:时间片用完或有更高优先级进程 - 运行态 → 阻塞态:等待IO或其他事件 - 阻塞态 → 就绪态:等待的事件完成 **其他状态** - 创建态(New):进程正在创建 - 终止态(Terminated):进程执行完成 2.3 进程控制 --------------------- **进程的创建** 创建进程的步骤: 1. 为新进程分配PCB 2. 分配内存资源 3. 初始化PCB 4. 插入就绪队列 **进程的终止** 终止进程的原因: - 正常结束 - 异常结束 - 用户终止 - 父进程终止 **进程的阻塞与唤醒** - 阻塞:进程请求资源或等待事件 - 唤醒:等待的事件完成 **进程的挂起与激活** - 挂起:将进程调出到外存 - 激活:将进程调入内存 2.4 进程调度 --------------------- **调度的层次** 1. **高级调度(作业调度)**:从外存选择作业调入内存 2. **中级调度**:将进程调出或调入内存 3. **低级调度(进程调度)**:从就绪队列选择进程占用CPU **进程调度算法** 1. **先来先服务(FCFS)** 按到达顺序调度,非抢占式。 优点:简单、公平 缺点:短作业等待时间长 2. **短作业优先(SJF)** 优先调度执行时间最短的作业。 优点:平均等待时间短 缺点:需要预知执行时间,长作业可能饥饿 3. **优先级调度** 按优先级调度,可以是抢占式或非抢占式。 优点:灵活 缺点:低优先级作业可能饥饿 4. **时间片轮转(RR)** 每个进程分配一个时间片,轮流执行。 优点:响应时间短 缺点:时间片大小难确定 5. **多级反馈队列** 多个就绪队列,优先级依次降低,时间片依次增大。 优点:兼顾各种作业 缺点:算法复杂 **调度算法的评估指标** - CPU利用率 - 吞吐量 - 周转时间 - 等待时间 - 响应时间 2.5 进程同步 --------------------- **临界资源** 一次只允许一个进程使用的资源。 **临界区** 访问临界资源的代码段。 **同步机制应满足的条件** 1. **空闲让进**:临界区空闲时,允许一个进程进入 2. **忙则等待**:临界区忙碌时,其他进程等待 3. **有限等待**:进程等待时间有限 4. **让权等待**:进程等待时释放CPU **同步机制** 1. **软件方法** - Dekker算法 - Peterson算法 2. **硬件方法** - 中断屏蔽 - Test-and-Set指令 - Swap指令 3. **信号量** 信号量是整型变量,只能通过P、V操作访问。 P操作(S): .. code-block:: python while S <= 0: 等待 S = S - 1 V操作(S): .. code-block:: python S = S + 1 4. **互斥锁** 互斥锁保证临界区只能由一个进程执行。 - lock():获取锁 - unlock():释放锁 5. **管程** 管程是高级同步机制,封装了共享数据和操作。 2.6 进程通信 --------------------- **进程通信的方式** 1. **共享内存** 进程共享同一块内存区域。 优点:速度快 缺点:需要同步 2. **消息传递** 进程通过发送和接收消息通信。 优点:灵活、安全 缺点:速度较慢 3. **管道** 管道是连接进程的数据流。 - 匿名管道:用于父子进程通信 - 命名管道:用于任意进程通信 4. **信号** 信号是异步通知机制。 5. **套接字** 套接字用于网络通信。 6. **共享文件** 进程通过共享文件通信。 3. 线程管理 =================================== 3.1 线程的概念 --------------------- **线程的定义** 线程是进程内的执行单元,是调度的基本单位。 **线程与进程的区别** +-------------+--------+---------+ | 特性 | 进程 | 线程 | +=============+========+=========+ | 资源分配 | 是 | 否 | +-------------+--------+---------+ | 调度单位 | 否 | 是 | +-------------+--------+---------+ | 地址空间 | 独立 | 共享 | +-------------+--------+---------+ | 通信 | 需要IPC| 直接通信| +-------------+--------+---------+ | 创建开销 | 大 | 小 | +-------------+--------+---------+ **线程的优势** - 响应快 - 并发性高 - 资源共享 - 开销小 **线程的类型** 1. **用户级线程** 由用户线程库管理,内核不可见。 优点:切换快 缺点:一个线程阻塞,所有线程阻塞 2. **内核级线程** 由操作系统内核管理。 优点:支持多核 缺点:切换慢 3. **混合线程** 结合用户级和内核级线程的优点。 3.2 线程同步 --------------------- **线程同步的问题** 1. **竞争条件** 多个线程同时访问共享资源,结果依赖于执行顺序。 2. **死锁** 多个线程互相等待对方释放资源,导致都无法继续执行。 3. **活锁** 线程不断改变状态,无法继续执行。 4. **饥饿** 线程长期得不到资源。 **线程同步机制** 1. **互斥锁(Mutex)** 保证临界区只能由一个线程执行。 2. **读写锁** 允许多个读操作同时进行,但写操作独占。 3. **条件变量** 线程等待特定条件满足。 4. **信号量** 控制同时访问资源的线程数量。 5. **屏障** 等待所有线程到达某一点后再继续执行。 3.3 线程池 --------------------- **线程池的概念** 线程池是预先创建一组线程,重复使用这些线程执行任务。 **线程池的优势** - 减少线程创建和销毁的开销 - 控制并发线程数量 - 提高响应速度 **线程池的实现** 线程池包含: - 工作线程队列 - 任务队列 - 管理线程 **线程池的应用** - Web服务器 - 数据库连接池 - 异步任务处理 4. 死锁 =================================== 4.1 死锁的定义与原因 --------------------- **死锁的定义** 死锁是两个或多个进程互相等待对方释放资源,导致都无法继续执行的状态。 **死锁产生的必要条件** 1. **互斥条件**:资源不能共享 2. **请求与保持条件**:进程请求新资源时保持已分配的资源 3. **不剥夺条件**:资源不能被强制剥夺 4. **循环等待条件**:存在进程资源的循环等待链 **死锁的例子** 进程P1和P2,资源R1和R2: P1: 获得R1,请求R2 P2: 获得R2,请求R1 如果同时发生,则产生死锁。 4.2 死锁的处理策略 --------------------- **死锁预防** 破坏死锁产生的必要条件: 1. 破坏互斥条件:资源可共享 2. 破坏请求与保持条件:一次性请求所有资源 3. 破坏不剥夺条件:允许剥夺资源 4. 破坏循环等待条件:资源有序分配 **死锁避免** 动态检测资源分配是否安全。 **银行家算法** 银行家算法用于判断资源分配是否安全。 **死锁检测** 检测系统是否发生死锁。 **死锁恢复** 解除死锁: 1. 终止进程 2. 剥夺资源 5. 内存管理 =================================== 5.1 内存管理概述 --------------------- **内存管理的目标** - 提高内存利用率 - 方便用户使用 - 保证内存安全 **内存管理的功能** - 内存分配与回收 - 地址映射 - 内存保护 - 内存扩充 **程序的装入** 1. **绝对装入** 程序装入到固定地址。 2. **可重定位装入** 根据内存情况装入到不同地址。 3. **动态运行时装入** 运行时装入,可动态移动。 5.2 连续分配 --------------------- **单一连续分配** 内存分为系统区和用户区。 优点:简单 缺点:利用率低 **分区分配** 将内存分成多个分区,每个分区分配给一个进程。 1. **固定分区** 分区大小固定。 优点:简单 缺点:内部碎片 2. **动态分区** 分区大小根据进程需求动态分配。 优点:利用率高 缺点:外部碎片 **分配算法** 1. 首次适应(First Fit) 2. 最佳适应(Best Fit) 3. 最坏适应(Worst Fit) 4. 循环首次适应(Next Fit) 5.3 非连续分配 --------------------- **分页** 将内存和程序分成固定大小的页和页框。 - 页:程序的单位 - 页框:内存的单位 **页表** 页表记录页到页框的映射。 **地址转换** 逻辑地址 = 页号 + 页内偏移 物理地址 = 页框号 + 页内偏移 **分段的优缺点** 优点: - 无外部碎片 - 便于共享和保护 缺点: - 有内部碎片 - 需要硬件支持 **分段** 将程序按逻辑单位分段。 - 段:程序的逻辑单位 - 段表:记录段到内存的映射 **段页式** 结合分页和分段的优点。 5.4 虚拟内存 --------------------- **虚拟内存的概念** 虚拟内存将程序的一部分装入内存即可运行,其余部分放在外存,按需调入。 **虚拟内存的优点** - 扩大可用内存 - 提高内存利用率 - 支持多道程序设计 - 方便程序开发 **页式虚拟内存** **缺页中断** 访问的页不在内存时,触发缺页中断,将该页调入内存。 **页面置换算法** 选择哪个页面换出内存。 1. 最佳置换(OPT) 置换未来最长时间不使用的页面。 2. 先进先出(FIFO) 置换最早调入的页面。 3. 最近最久未使用(LRU) 置换最近最久未使用的页面。 4. 时钟算法(Clock) 近似LRU的高效算法。 **Belady异常** 在某些情况下,增加内存反而增加缺页次数。 **抖动** 频繁缺页,系统忙于页面交换,无法正常工作。 5.5 内存分配策略 --------------------- **静态分配** 程序运行前分配内存,运行中不变。 **动态分配** 程序运行时动态分配和释放内存。 **内存分配算法** 1. 首次适应(First Fit) 2. 最佳适应(Best Fit) 3. 最坏适应(Worst Fit) 4. 循环首次适应(Next Fit) **内存回收** 回收内存时要合并相邻的空闲块。 6. 文件系统 =================================== 6.1 文件的概念 --------------------- **文件的定义** 文件是具有名称的一组相关信息的集合。 **文件的属性** - 文件名 - 文件类型 - 文件大小 - 创建时间 - 修改时间 - 访问时间 - 权限 **文件的类型** 1. 按用途分类: - 系统文件 - 用户文件 2. 按数据形式分类: - 源文件 - 目标文件 - 可执行文件 3. 按保护级别分类: - 只读文件 - 读写文件 - 可执行文件 6.2 文件的结构 --------------------- **文件的逻辑结构** 1. **顺序文件** 记录按顺序排列。 优点:顺序访问效率高 缺点:插入删除效率低 2. **索引文件** 通过索引表访问记录。 优点:随机访问效率高 缺点:索引占用额外空间 3. **索引顺序文件** 结合顺序文件和索引文件的优点。 **文件的物理结构** 1. **连续分配** 文件存储在连续的磁盘块中。 优点:顺序访问快 缺点:需要连续空间,外部碎片 2. **链接分配** 文件存储在不连续的磁盘块中,通过指针链接。 优点:不需要连续空间 缺点:随机访问慢 3. **索引分配** 通过索引块记录文件的磁盘块位置。 优点:随机访问快 缺点:索引块可能较大 6.3 文件目录 --------------------- **目录的概念** 目录是文件的集合,用于组织文件。 **目录的结构** 1. **单级目录** 整个系统只有一个目录。 缺点:文件名冲突 2. **两级目录** 分为主目录和用户目录。 3. **树形目录** 目录组织成树状结构。 4. **无环图目录** 允许目录共享和链接。 **目录的实现** - 线性表 - 哈希表 6.4 文件操作 --------------------- **基本文件操作** - 创建(create) - 删除(delete) - 读(read) - 写(write) - 打开(open) - 关闭(close) **文件共享** - 硬链接 - 软链接(符号链接) **文件保护** - 访问控制列表(ACL) - 权限位 7. IO管理 =================================== 7.1 IO设备 --------------------- **IO设备的分类** 1. 按传输速率分类: - 低速设备:键盘、鼠标 - 中速设备:打印机 - 高速设备:磁盘 2. 按信息交换单位分类: - 字符设备:键盘、终端 - 块设备:磁盘 3. 按共享属性分类: - 独占设备:打印机 - 共享设备:磁盘 **IO控制方式** 1. **程序IO方式** CPU主动查询IO设备状态。 优点:简单 缺点:CPU利用率低 2. **中断驱动IO方式** IO设备完成后向CPU发送中断。 优点:CPU利用率高 缺点:频繁中断 3. **DMA方式** 直接内存访问,IO设备直接与内存交换数据。 优点:效率高 缺点:需要DMA控制器 4. **通道控制方式** 通道专门负责IO操作。 优点:效率最高 缺点:复杂 7.2 设备驱动 --------------------- **设备驱动的概念** 设备驱动是控制硬件设备的软件。 **设备驱动的功能** - 初始化设备 - 处理IO请求 - 处理中断 - 错误处理 **设备驱动的分类** - 字符设备驱动 - 块设备驱动 - 网络设备驱动 7.3 缓冲技术 --------------------- **缓冲的概念** 缓冲是临时存储数据的区域,用于匹配速度差异。 **缓冲的类型** 1. **单缓冲** 一个缓冲区。 2. **双缓冲** 两个缓冲区,交替使用。 3. **循环缓冲** 多个缓冲区,循环使用。 4. **缓冲池** 一组缓冲区,动态分配。 **缓冲的目的** - 提高IO效率 - 减少CPU等待时间 - 解决速度不匹配问题 7.4 磁盘调度 --------------------- **磁盘调度的目标** - 减少寻道时间 - 提高磁盘利用率 **磁盘调度算法** 1. 先来先服务(FCFS) 2. 最短寻道时间优先(SSTF) 3. 扫描算法(SCAN) 4. 循环扫描算法(C-SCAN) 5. LOOK算法 6. C-LOOK算法 **磁盘缓存** 将磁盘数据缓存到内存,减少磁盘访问。 8. 操作系统接口 =================================== 8.1 用户接口 --------------------- **命令行接口(CLI)** 用户通过命令与系统交互。 优点:灵活、强大 缺点:学习曲线陡峭 **图形用户界面(GUI)** 用户通过图形元素与系统交互。 优点:直观、易用 缺点:效率相对较低 8.2 系统调用 --------------------- **系统调用的定义** 系统调用是用户程序请求操作系统服务的接口。 **系统调用的类型** - 进程控制 - 文件管理 - 设备管理 - 信息维护 - 通信 **系统调用的实现** 用户程序通过软中断或系统调用指令调用内核服务。 9. 系统安全与保护 =================================== 9.1 认证与授权 --------------------- **认证** 验证用户身份。 方法: - 密码 - 生物特征 - 智能卡 **授权** 确定用户权限。 方法: - 访问控制列表(ACL) - 能力列表 9.2 访问控制 --------------------- **访问控制模型** 1. **自主访问控制(DAC)** 资源所有者决定访问权限。 2. **强制访问控制(MAC)** 系统强制执行访问规则。 3. **基于角色的访问控制(RBAC)** 根据用户角色分配权限。 9.3 隔离 --------------------- **进程隔离** 进程之间相互隔离,保护系统安全。 **虚拟化** 通过虚拟化技术实现隔离。 10. 实际操作系统 =================================== 10.1 Windows --------------------- **特点** - 图形用户界面 - 即插即用 - 多任务 - 支持多平台 **架构** - 用户模式 - 内核模式 10.2 Linux --------------------- **特点** - 开源 - 稳定 - 安全 - 灵活 **架构** - 用户空间 - 内核空间 10.3 Unix --------------------- **特点** - 多用户 - 多任务 - 稳定 - 安全 **架构** - 用户层 - 内核层 11. 应用领域 =================================== 11.1 桌面系统 --------------------- - Windows - macOS - Linux 11.2 服务器 --------------------- - Windows Server - Linux - Unix 11.3 嵌入式系统 --------------------- - FreeRTOS - VxWorks - 嵌入式Linux 11.4 移动设备 --------------------- - Android - iOS 12. 总结与展望 =================================== 操作系统是计算机系统的核心软件,管理硬件资源,为用户提供服务。从进程管理到内存管理,从文件系统到IO管理,操作系统技术不断发展,为信息技术的进步提供了坚实的基础。 **核心价值** - 管理资源 - 提供服务 - 提高效率 - 保证安全 **学习建议** - 理解基本概念和原理 - 学习具体操作系统的实现 - 动手实践 - 关注前沿技术 **进阶方向** - 分布式操作系统 - 实时操作系统 - 虚拟化技术 - 容器技术 - 云计算 操作系统技术日新月异,掌握操作系统知识将让你在计算机领域拥有更深刻的理解。