第二章 进程管理
第二章 进程管理
进程和线程相关概念
进程的定义和组成
进程的特征
在引入 线程 之后,进程不再是调度的基本单位。但是仍然是资源分配的基本单位
问:进程从运行态通过系统调用为什么会进入阻塞态?想问的是:为什么系统调用会使得进程阻塞?
当进程发起系统调用时,CPU 会从用户态切换到内核态,由内核处理请求。若内核无法立即完成请求(例如需要等待 I/O 设备响应、网络数据到达或锁释放),进程会进入阻塞态以释放 CPU 资源。
进程的组织-链接方式
就是操作系统是如何将进程的 PCB 进行组织和链接的?
两种:链式 和 索引 形式
链式:就是不同状态的队列
索引方式:(不常用)
进程控制
进程控制就是实现进程的状态转换
创建原语:
终止原语:
阻塞原语:阻塞和唤醒成对出现,由谁阻塞由谁唤醒
进程切换
进程通信
什么是进程间通信?涉及到两个及以上的进程间有操作关系。
进程间通信的方式:1. 共享内存方式 2. 消息传递方式
共享内存方式
-
操作系统通过提供一块共享内存块,让其他进程将共享内存块映射到我们的独立的虚拟空间。
-
消息通信,进程间通过发送消息
消息通信又分为两种方式:直接通信方式和间接通信方式
直接通信:
间接通信:
-
管道通信:通过一个内存共享区的缓冲区,但是和一般的内存共享区区别:一般的内存共享区可以在任意位置读写。但是管道只能按照队列的方式进行读写(先进先出)。而且从数据结构的角度看,这个管道其实是一个循环队列。
信号
信号如何发送?
通过调用发送信号的函数
信号是如何进行保存的?
通过位变量,对每种类型的信号进行保存。有待处理信号…
待处理信号和被阻塞信号是哪来的?
待处理信号就是通过其他进程进行传递的
被阻塞信号就是通过系统调用自行设置的(自行决定屏蔽)
哪些信号需要被处理?
通过待处理信号和被阻塞信号进行位运算:处理信号 = 待处理信号 & ~被阻塞信号 (其中为1的类型的信号将被处理)
信号处理的时机是什么时候?
当进程从内核态转用户态时
信号检查的时机和中断检查的时机分别在什么时候?
信号检查:当进程从内核态转用户态时
中断检查:当进程从用户态转内核态时
注意:
进程间进行信号发送时,只能父进程向子进程进行发送。
或者 内核级进程 向 任意进程进行发送
线程相关概念
线程实现方式:用户级线程和内核级线程
多线程模型:一对一、多对一、多对多
小结
调度
调度的概念和层次
进程调度的时机、切换以及切换过程、调度方式
闲逛进程
当就绪队列中没有就绪的进程时,那么 cpu 并不会空闲,而是会去执行默认的 闲逛进程。
调度算法的指标
调度算法
先来先服务(FCFS)
短作业优先(SJF)
那其实,当所有进程同时(或者说几乎同时到达),此时,非抢占式和抢占式的短作业优先算法的结果是相同的选择。
至于,为什么非抢占式并不是一定“最短的平均等待时间”?因为,非抢占式一定会局部出现“先来先服务”的情况。整体的短作业优先算法的规则:1. 先到达 2. 作业时间最短(两个条件)
高响应比优先算法(HRRN)
时间片轮转调度算法(RR)
分时、公平式、被动放弃(时钟中断) + 主动放弃(进程结束)
时间片过大,退化为先来先服务(一个时间片内足够所有任务完成)
时间片过小,cpu切换频繁,大量开销
优先级调度算法
优先级、抢占式 + 非抢占式 都有
多级反馈队列调度算法
多级队列调度算法
多处理机调度
进程互斥的软件实现方法
单标志:使用 turn 变量,表示谦让
双标志:使用 turn 变量,表示谦让;使用 flag数组 eg:表示flag[0]=true/false,表示0号进程想要处理机
互斥锁
出现忙等“自旋”
信号量
记录型信号量机制,需要等待的进程会自己调用阻塞原语进行自我阻塞操作
信号量机制实现互斥、同步、前驱关系
死锁
死锁的概念&死锁产生的条件&死锁的处理策略
小结
一、进程基本概念
-
定义:进程是程序在操作系统中的一次执行实例,是资源分配和调度的基本单位。它包含程序代码、数据集合、进程控制块(PCB)以及运行时的系统资源(如内存、打开文件等)。
-
进程控制块(PCB):操作系统用于管理进程的核心数据结构,存储进程 ID、状态、优先级、程序计数器、寄存器值、资源分配信息等关键信息,是进程存在的唯一标志。
-
进程与程序区别:程序是静态的代码文件,进程是动态的执行过程;同一程序可对应多个进程(如同时打开多个文本编辑器窗口)。
二、进程状态与转换
- 基本状态
-
- 就绪态:进程已获得除 CPU 外的所有必要资源,等待被调度执行。
-
- 运行态:进程正在 CPU 上执行。
-
- 阻塞态:因等待 I/O 操作、信号量或其他资源而暂停执行,处于非活动状态。
- 状态转换
-
- 就绪态→运行态:被进程调度器选中分配 CPU。
-
- 运行态→就绪态:时间片用完或被高优先级进程抢占。
-
- 运行态→阻塞态:发起 I/O 请求或等待资源时主动暂停。
-
- 阻塞态→就绪态:等待的事件完成(如 I/O 操作结束)。
三、进程调度
-
调度目标:提高 CPU 利用率、保证公平性、减少响应时间、提升吞吐量。
-
调度算法
-
- 先来先服务(FCFS):按进程到达顺序调度,实现简单但可能导致短作业等待长作业,不利于交互性任务。
-
- 短作业优先(SJF):优先调度预计执行时间最短的进程,可降低平均等待时间,但存在 “饥饿” 问题(长作业长期无法执行)。
-
- 时间片轮转(RR):为每个进程分配固定时间片,时间片耗尽后切换,适用于分时系统,保证公平性。
-
- 优先级调度:按进程优先级分配 CPU,可分为静态优先级(创建时确定)和动态优先级(运行中调整),可能导致低优先级进程饥饿。
-
- 多级反馈队列:设置多个优先级队列,新进程进入高优先级队列,按时间片轮转执行;未完成则降级至低一级队列,兼顾响应时间和资源利用率。
四、进程同步与互斥
-
临界资源与临界区:一次仅允许一个进程访问的资源称为临界资源,访问临界资源的代码段称为临界区。
-
同步机制
-
- 信号量:通过 P(等待)和 V(释放)操作实现进程同步与互斥,如用二元信号量实现互斥,用计数信号量控制资源数量。
-
- 管程:封装共享资源及对其操作的代码,通过条件变量实现进程同步,避免信号量使用中的复杂逻辑错误。
- 经典问题
-
- 生产者 - 消费者问题:通过信号量协调生产者和消费者对共享缓冲区的操作,解决同步与互斥问题。
-
- 读者 - 写者问题:允许多个读者同时访问共享资源,但写者访问时需独占,可通过读写锁优化性能。
-
- 哲学家就餐问题:避免多个进程因竞争资源导致死锁,可通过资源分配策略(如同时分配所有资源)或打破死锁必要条件解决。
五、死锁
-
定义:多个进程因竞争资源而形成循环等待链,导致所有进程无法继续执行。
-
死锁必要条件:互斥条件、占有并等待条件、不可剥夺条件、循环等待条件。
-
处理策略
-
- 预防死锁:打破死锁四个必要条件中的一个(如采用资源静态分配法破坏占有并等待条件)。
-
- 避免死锁:通过银行家算法动态评估资源分配安全性,拒绝可能导致死锁的分配请求。
-
- 检测与解除:定期检测系统是否存在死锁,发现后通过撤销进程、剥夺资源等方式解除死锁。
以上全面总结了进程管理核心知识。如果你想深入了解某个知识点,或是需要更多相关案例分析,欢迎随时告诉我。