进程的同步与通信
同步关系(直接制约):为了完成一个共同任务,相互协作的几个进程需要在某些确定点上协调他们的工作,等待来自其它进程的信息,以调整它们的推进速度,方可顺利执行完毕。
互斥关系(间接制约):把并发进程间存在的因相互竞争使用独占资源(共享资源)而产生的制约关系。
例如:打印机,共享内存;
临界资源:一次仅允许一个进程使用的硬件或软件资源。
注意:对于临界资源,必须互斥访问,否则会导致执行结果的不确定性。
临界段(区):指在进程中访问临界资源的那段代码。
访问过程:
1)在进入临界段之前,写一段代码以检查可否进入临界段,通常把这段代码称为进入区(申请,判断)。
2)在退出临界段后,必须有一段代码来清除“正在访问临界段”标志,或发出本进程已经退出临界段的信息,把这段代码称为退出区(释放)。
同步机构:指能实现进程同步的机制,该机制能把其它进程需要的信息发送出去,也能测试自己需要的信息是否到达。
同步机构应遵循4个准则:
- 空闲让进;2、忙则等待;3、有限等待;4、让权等待;
实现临界段的硬件方法(低级方法)(了解)
- 屏蔽中断法,如进程1的程序:
disableInterrupt();// 不准中断
balance=balance+amount; //执行指令
enableInterrupt(); //允许中断
- “Test_and_Set”指令
如果机器支持Test_and_Set,可用下列方法解决:(lock=false)
do
{ while(Test_and_Set(&lock)); //进入区
critical section; //临界区
lock=false; //退出区
non critical section; //其它部分
}while(1);
3、“Swap”指令
该指令功能描述为:
void Swap(boolean &a, boolean &b){
boolean temp=a;
a = b;
b = temp;
}
信号量(重点)
PV操作的实现
1. 信号量定义
typedef struct{
int:value; 一个数值型变量
struct process *L;一个PCB队列
} Semaphore
Semaphore S;
2. P操作
P(S): S.Value=S.value-1;
if S.value<0 then 保存现场,
将本进程挂入S.L队列,等待重新调度。
3. V操作
V(S): S.value:=value+1
if S.value≤0 then 从S.L队列
取一进程,挂入就绪队列。
4. P,V操作的优点:同步能力强
5. P,V操作的缺点:程序结构差,易产生死锁。
信号量的物理意义
P(s)操作:
①请求分配一个S代表的资源,执行S.value-1;
②若S.value<0,表示系统已无该类资源,申请者阻塞。此时,|S.value|表示该信号量上阻塞的进程数;
V(s)操作:
①进程释放一个S代表的资源,执行S.value+1;
②若S.value<=0,表示尚有进程因等待S代表的资源而处于阻塞状态,所以应唤醒其中之一。
使用PV 操作的几个经典案例,比如哲学家就餐问题