进程同步与通信
互斥
多个进程不能同时使用同一个资源,当某个进程使用某种资源时,其他进程必须等待
同步
多个进程中发生的事件存在时序关系
进程通信
多个进程之间要传递信息
进程间的相互作用
无关进程:在逻辑上无任何联系的进程
相关进程:指多个并发进程在逻辑上有某种联系
进程的交互
互斥:指多个进程不能同时使用同一个资源
死锁:指多个进程互不相让,都得不到足够的资源
饥饿:指一个进程一直得不到资源
临界资源与临界区
临界资源:某段时间内仅允许一个进程使用的资源。
临界区:每个进程中访问临界资源的那段代码。
几个进程共享同一临界资源,它们必须以互斥的方式使用临界资源。
进入区
临界区
退出区
剩余区
临界区进入准则
空闲让进
忙则等待
有限等待
让权等待
互斥实现的硬件方法
硬件方法
禁止中断:禁止一个进程在进入临界区后被中断
缺点:
- 多处理机环境中,无法保证临界区被互斥访问。
- 将禁止中断的权利交给用户可能会导致系统终止。
专用机器指令
boolean lock(标志)
TS(Test and Set)指令
boolean lock;
boolean TS(boolean lock)
{
boolean temp;
temp=lock;
lock=true;
return temp;
}
Swap指令
boolean lock;
void Swap(boolean a, b)
{
boolean temp;
temp=a;
a=b;
b=temp;
}
采用硬件处理器指令能很好地把修改和检查操作结合在一起。
优点:
- 适用范围广。适用于任何数目的进程。单处理机和多处理机环境都能用。
- 简单。硬件方法的标志设置简单,容易验证其正确性。
- 支持多个临界区。
缺点:
- 由于进入临界区的进程是从等待进程中随机选择的,可能造成某个进程“饿死” 。
- 专用指令与硬件系统相关,很难成为一种通用的解决方案。
互斥实现的软件方法
int turn(标志)
单标志法
缺点:强制性轮流进入临界区,不能保证“空闲让进”。
boolean flag[2](标志)
双标志、先检查后修改算法
缺点:可能同时进入临界区,不能保证“忙则等待”。
双标志、先修改后检查算法
缺点:保证了不同时进入临界区,但又可能都进不去。不能保证“空闲让进”。
int turn
boolean flag[n](标志)
先修改、后检查、后修改者等待
信号量和PV操作
记录型信号量的定义
struct semaphore{
int value;
struct PCB *queue;
}
void wait(semaphore s)
{
s.value = s.value - 1;
if (s.value < 0)
block(s.queue);
/* 将进程阻塞,并将其投入等待队列s.queue */
}
void signal(semaphore s)
{
s.value = s.value + 1;
if (s.value <= 0)
wackup(s.queue);
/* 唤醒阻塞进程,将其从等待队列s.queue 取出,投入就绪队列*/
}