一、同步与互斥的概念
进程的互斥关系
- 多个进程由于共享了独占性资源,必须协调各进程对资源的存取顺序:确保没有任何两个或以上的进程同时进行读取
- 互斥和资源共享相关
- 资源:临界资源
- 存取操作区域:临界区
进程的同步关系
- 若干合作进程为了完成一个共同的任务,需要相互协调运行步伐:一个进程开始某个操作之前必须要求另一个进程已经完成了某个操作,否则前面的进程只能等待。
- 另一种解释:合作进程中某些操作之间需要满足先后关系或某个操作能否进行需要满足某个前提关系,否则只能等待。
互斥关系属于特殊的同步关系
二、P-V操作概念
数据结构
- 变量定义为一个二元矢量(S,q)
- S:整数,初值为负
- q:PCB队列,初值为空集
struct
{
int s;
pointer_PCB q;
}
操作:
P操作:可能使进程在调用处阻塞
- S值减1
- 若差大于或等于0,该进程继续
- 若差小于0,则该进程阻塞并加入队列q中,并转调度函数
p(S,q)
{
S=S-1;
if (S<0)
{
Insert(Caller,q);
Block (Caller);
转调度函数();
}
}
V操作:可能会唤醒阻塞的进程
- S值加1
- 若和大于0,该进程继续
- 若和小于或等于0,该进程继续同时从q中唤醒一个进程
V(S,q)
{
S=S+1;
if (S<0)
{
Remove (q,pid);
Wakeup (pid);
}
}
三、P-V操作解决互斥问题
本质:实现对临界区的互斥访问(允许最多一个进程处于临界区)
应用过程:
- 进入临界区之前先执行P操作(相当于上锁操作)
- 离开临界区之后再执行V操作(相当于开锁操作)
S的初值要设计合理。
四、P-V操作解决同步问题
同步机制实质:
- 运行条件不满足时,能让进程暂停。
- 运行条件满足时,能让进程立即继续
基本思路:
- 暂停当前进程:在关键操作之前执行p操作(必要时可暂停)
- 继续进程:在关键操作之后执行V操作(必要时唤醒合作进程)
- 定义有意义的信号量S,并设置合适的初值。(S能明确地表示运行条件)