进程管理
进程
进程是程序的一次执行过程,是系统进行资源调度和分配的一个独立单位。
特征
- 结构特征:对于其结构特征,进程=程序+数据+PCB。
- 静态描述:程序和数据集合
- 动态描述:进程控制块PCB
- 动态性:由于进程是程序的一次执行过程,具有生命期,创建产生,调度执行,等待得到资源阻塞,撤销消亡。
- 并发性:依赖于 PCB,共享资源让进程间相互约束、相互依赖。
- 独立性:进程是系统进行资源调度和分配的独立单位,独立运行、独立获得资源。
- 异步性 / 间断性:不可预知的速度
基本状态
若划分成三种,可以看成就绪、执行、阻塞。
加上创建和终止,就是五种。
进一步细化,还有被换出内存的挂起状态。当进程被挂起时称它为静止的,反之是活动的。
五状态进程模型和七状态进程模型:
进程管理中的数据结构 PCB
同一状态的 PCB 链接成队列,不同的队列表示不同状态。进程管理的索引依靠不同状态的索引表,索引表中存放了相应PCB的地址。
进程控制
进程管理中最基本的功能。用于创建一个新进程、终止已完成或因出现某事件而使其无法进行下去的进程、或负责进程运行中的状态转换。
由构成操作系统内核的各种原语实现。阻塞、唤醒一般由OS实现,而挂起、激活可由用户干预。
进程的并发性反映在对资源的竞争而产生的相互约束上。
进程同步
使并发进程有效地共享资源和相互合作,从而使程序执行具有可再现性。
并发进程间的制约关系
- 互斥关系:进程间排他使用资源(间接相互制约)
- 同步关系:进程间按某种时序执行(直接相互制约)
临界资源
凡以互斥方式使用的共享资源都称为临界资源,一次只允许一个进程使用。进程访问临界资源的代码称为临界区。
准则
- 空闲让进:无进程处于临界区内时,可让一个申请进入该临界区的进程进入。
- 忙则等待:临界区有进程,申请进入的进程必须等待。
- 有限等待:进程进入临界区请求必须在有限时间满足。
- 让权等待:等待(不能)进入临界区的进程必须立即释放 CPU。
信号量机制
信号量是资源的数量。定义:
Semaphore s;
不要拼错
原语
原语具有严格的不可分割性,执行过程中不允许中断。
- wait 操作(P 操作):减 1 操作,申请分配一个单位的资源。
- wait(s) - 对信号量 s 进行 wait 操作。
- signal 操作(V 操作):加 1 操作,释放一个单位的资源。
- signal(s) - 对信号量 s 进行 signal 操作。
整型信号量
即将 Semaphore 定义为一非负整数。
对应的操作描述:
wait(s):如果无可用资源,空转
cwhile (s <= 0); s -= 1;
问题在于空转操作违反了“让权等待”原则,严重拖累了CPU执行效率。
signal(s)
cs += 1;
记录型信号量
struct {
int value; // 资源数目
struct process_control_block *list; // 阻塞队列
} Semaphore;
Semaphore* s;
对应的操作描述:
wait(s)
cs->value--; if (s->value < 0) block(s->list);
signal(s)
cs->value++; if (s->value <= 0) wakeup(s->list);
其中,s->value
代表资源可用数量,或小于 0 时代表等待队列等待该资源的进程数。其初始值是资源数目。
AND 型信号量
当多个进程需要获得相同的多个资源时,容易产生死锁。使用 AND 信号量集机制,可以保证进程一次性获得所需的全部资源,从而避免死锁。这种机制允许进程在一个原子操作中请求多个资源,只有当所有请求的资源都可用时,才会分配资源给进程。
Swait 定义:
Swait(S1,S2,… Sn ){
while(TRUE){
if (S1 ≥1 && … && Sn ≥ 1){
for (i=1;i<n;i++) Si--;
break;
} else{
Place the process in the waiting queue associated with the first
Si <1, and set the program counter of this process to the beginning
of SP operation
}
}
}
对应的 Ssignal 操作定义如下:
Ssignal(S1,S2,… Sn){
while(TRUE){
for (i=1;i<=n;i++) {
Si++;
Remove all the process waiting in the queue associated with Si
into the ready queue.
}
}
}
一般信号量集机制
Si, ti, di
信号量机制的应用
实现进程互斥
设置一个初值为1的信号量 mutex,其wait、signal操作出现在同一进程临界区的头和尾部
描述前趋关系
同一信号量的wait、signal操作出现在不同进程,互发信号
考试
- 先定义信号量和初值;
- 写清各个进程和其过程;
- 加上 wait 和 signal;
- 检查。
考虑解决同步问题,然后检查是否有共享资源、处理进程互斥。
管程机制
管程 → 管理程序(monitor)
定义:一个数据结构和在该数据结构上能被并发进程所执行的一组操作,这组操作能同步进程和改变管程中的数据。
条件变量
请求临界资源不能满足时,使用条件变量说明等待原因。
Condition x, y;
x.wait(); // 将执行进程挂到与 x 对应的等待队列上
x.signal(); // ...
应用
- 变量声明;
- 定义过程;
- 初始化变量。
高级通信
信号量机制是一种低级通信,效率低、对用户不透明。高级通信反之。
- 共享存储器系统;
- 消息传递系统;
- 管道通信系统。
消息传递通信
直接通信
cSend(receiver, message); Receive(sender, message);
间接通信
cSend(mailbox, message); Receive(mailbox, message);
消息缓冲队列通信机制
消息缓冲区
ctypedef struct message_buffer { int sender; int size; char* text; struct message_buffer* next; } message_buffer;
PCB
ctypedef struct process_control_block { ... struct message_buffer* mq; // message queue Semaphore mutex; Semaphore sm; ... } PCB;
线程
线程作为调度和分派的基本单位,基本上不拥有资源。只有少量资源,但共享其所属进程所拥有的全部资源。