操作系统(四)
四、进程同步与通信
4.1 进程间的相互作用
4.1.1进程间的联系
- 进程间的联系
- 资源共享关系
- 相互合作关系
- 临界资源
- 一种供多个进程互斥访问的资源 同一时刻只允许一个进程访问的资源叫临界资源
- 临界区 每个进程中访问临界资源的那段代码称为临界区(critical section)
- 同步机制应遵循的准则
- 空闲让进
- 忙则等待
- 有限等待
- 让权等待
- 解决进程互斥问题:
4.1.2 软件方法:
完全使用软件的方法 解决此问题有一定难度并且有很大的局限性。4.1.3 硬件方法:
- 利用Test-and-Set指令实现互斥
- 利用Swap指令实现进程互斥
4.1.4 信号量机制
-
对信号量的操作:信号量机制是一种非常有效的进程同步工具
- 1.记录型信号量机制
-
记录型数据结构描述
-
typedef struct { int value; //代表资源数 list of process *L; //进程链表L,用于链接所有等待该信号量代表资源的进程 } semaphore;
-
对信号量的操作:
信号量除初始化外,仅能通过两个标准的原子操作wait(s)和signal(s)来访问。这两个操作很长时间以来被称为P、V操作。 -
信号量的物理含义:
- S.value>0时 S.value表示可使用的资源数或表示可使用资源的进程数;
- S.value=0时 S.value表示无资源可供使用或表示不允许进程得到该资源;
- S.value<0时 S.value表示等待使用资源的进程个数或表示等待该资源的进程个数。
-
wait原语:申请一个资源,得到就继续,得不到就阻塞
void wait (static semaphore s) { s.value - -; if (s.value<0) block(s.L); }
-
singal原语: 释放一个资源,有进程等待则唤醒一个
void signal ( static semaphore s) { s.value++; if (s.value <= 0) wackup(s.L); }
-
利用信号量实现进程互斥的过程描述
为使多个进程互斥地访问某个临界资源,只需为该资源设置一个信号量,并设其初始值为1。此信号量可称为“互斥信号量”。
进程1,进程2 同时执行,并不存在顺序关系。
-
- 1.记录型信号量机制
-
2.信号量集机制
- AND型信号量集机制
.引入:
假定现有两个进程P和Q,它们都要求同时访问共享数据A和B。共享数据都应作为临界资源,为此,可为这两个数据分别设置用于互斥的信号量Amutex和Bmutex,并令它们的初值为1(表示可以被访问)。这时容易产生死锁的情况。
对若干个临界资源的分配采取原子操作方式,要么全部分配到进程,要么一个也不分配,这称为AND同步,可以通过信号量集机制实现(Swait,Ssignal)。-
Swait操作:
Swait(S1, S2, … , Sn) { if (S1≥1&&…&&Sn≥1) for (i=1; i<=n; i++) Si -- ; else { 阻塞该进程,并将其插入到 等待资源Si的阻塞队列中; 将程序计数器PC重新指向Swait 操作的第一条语句。 } }
-
Ssignal操作:
Ssignal (S1, S2, … , Sn) { for (i=1; i<=n; i++) { Si++; 将所有等待Si资源的进程唤醒; } }
-
- AND型信号量集机制