为什么存在进程互斥?
程序是静态的,无法表达并发的动态运行特征,引出了进程;
进程具有独立性、异步性等并发运行的动态特征;
但是很多资源不能同时被访问,例如存储单元不能同时进行读操作和写操作,而大多数设备也不能同时操作(打印机、扫描仪);
因此,进程同时访问资源时,需要有规则,这就是间接制约,也就是进程互斥。
相关定义
临界资源:不允许同时多个进程访问的资源。
临界区:访问临界资源的程序,或者把不允许多个并发进程交叉执行的一段程序称为临界区。
注意:临界区不是资源,而是程序段。互斥:不允许两个以上的共享某公有资源的并发进程同时进入临界区称为互斥。
互斥的加锁实现
实现机制:进程进入临界区后,锁上临界区,直到退出临界区。并发进程在申请进入临界区时,首先测试是否上锁,如果临界区已经被锁住,则等待解锁后进入。
存在问题:(1)不断的循环测试状态,造成严重的CPU资源浪费。(2)不公平现象,会造成部分进程“永久饥饿”。
更好的解决方案:信号量与PV原语
信号量(Semaphore):一种特殊的变量,表现形式是一个整数附加一个队列。
struct semaphore
{
int value;
pointer_PCB queue;
}
P原语(Passeren)和V原语(Verhoog)

经典互斥问题:读者写者问题
有两组并发进程:读者和写者,共享一组数据区,要求:①允许多个读者同时执行读操作;②不允许读者、写者同时操作;③不允许多个写者同时操作。
第一类:读者优先
如果读者进程运行:
1)无读者、写者,新读者可以读;
2)有写者等,但有其它读者正在读,则新读者也可以读;
3)有写者写,新读者等。
如果写者进程运行:
1)无读者、写者,新写者可以写;
2)有读者读,新写者等待;
3)有其它写者写,新写者等待。
本节资料

