目录:
一、进程同步的基本概念
二 、临界资源(Critical Resouce)
三、信号量机制(重点)
一,进程同步的基本概
两种形式的制约关系
间接相互制约关系
如共享某临界资源(账号使用权),当有别人登录上自己账号的时候就会被挤下线,而我登录这一账号就会他挤下去属于互斥制约
直接相互制约关系(生产消费关系),必须要先生产再消费有顺序的进行,属于合作制约,如进程间的合作
二 、临界资源(Critical Resouce)
引入临界资源是为了让进程间能进行互斥访问的资源。
例如:
P1进程中有语句A=x;A=A+1;x=A
P2进程中有语句B=x;B=B-1;x=B;
假设x的初值为5,p1,p2同时进行,x=4和5发生冲突,就要引入临界资源的概念
一个访问临界资源的进程描述
临界区(Critical Section):
每个进程中访问临界资源的代码。
进入区(Entry Section):
在临界区前的一段用于检查临界资源正被访问标志的代码。
退出区(Exit Section):
在临界区后用于恢复检查临界资源未被访问标志的代码。
剩余区(RemainderSection):
进程中除上述三个区以外的代码。
同步机制应遵循的规则
空闲让进:当无进程处于临界区,允许一个进程进入;
忙则等待:当已有进程进入临界区,其它进程必须等待;
有限等待:对要求访问临界资源的进程,应保证在有限时间进入临界区;
让权等待:当进程不能进入临界区,应立即释放CPU。
三.信号量机制(重点)
信号量(Semaphore):为实现进程同步而设置的特殊变量
1. 整型信号量
与一般变量不同的是,对于信号量除初始化外,仅能通过两个标准的原子操作wait(s)和signal(s)来访问,分别称为P操作和V操作。
信号量的三种操作
(1)初始化
根据实际资源数,对s进行初始化(s≥0为非负整数)
可描述为:Semaphore s=5
(2)P操作, wait(s)
可描述为:
wait(s)
{ while (s≤0) { };
s=s-1;
}
(3)V操作, signal(s)
可描述为:
s=s+1;
说明:仅能通过wait(s)和signal(s)来访问s。wait(s)和signal(s)是两个原子操作(不可分割了),在执行时不可中断
例如:在上例中假设变量x初值为5。P1进程中有语句x=x+1;P2进程中有语句x=x-1;试利用整型信号量机制来解决进程间的并发,即
2.记录型信号量
记录型信号量采用记录型的数据结构,描述为:
typedef struct
{ int value;
struct
process_control_block *list;
} Semaphore;
其中: value:表示资源个数List:等待该资源而阻塞的进程链表
(1)wait(s)的描述
wait(Semaphore &s)
{
s.value=s.value-1;
if (s.value<0)
block(s.list);阻塞并插入到list阻塞队列
}
(2)signal(s)的描述
signal(Semaphore &s)
{
s.value=s.value+1;
if (s.value≤0)
wakeup(s.list);//唤醒list队列中的第一个进程
}
说明:
wait操作意味着请求一个单位的资源(进入区)。
signal操作意味着释放一个单位的资源(退出区)。
s.value<0表示该类资源已经分配完毕,此时s.value的绝对值就是等待链表s.list中的进程个数
若s.value的初值为1,则表示该资源为临界资源,此信号量成为互斥信号量。
例如:假设变量x初值为5。P1进程中有语句x=x+1;P2进程中有语句x=x-1; P3进程中有语句x=x+2,利用记录型信号量机制来避免在访问临界变量x时出现错误
篇幅有限,下期介绍AND型和信号量集,请大家多多关注啊!