2024.06.01:操作系统PV学习笔记
实现的基本方法
软件实现
单标识法:选择“空闲让进”
双标志法先检查:选择忙则等待原则
双标志法后检查:会导致饥饿现象
皮特森算法:单标志法和双标志后检查法的结合
硬件实现
中断屏蔽算法:进区关中断,出区开中断
硬件指令算法:设置原子操作指令
信号量:利用PV操作实现互斥
1965年,荷兰科学家迪杰斯特拉提出的信号机制是一种进程同步工具。在长期且广泛的应用中,信号量机制得到了很大的发展,它从最开始的(整型信号量)发展为(记录型信号量),进而发展为“信号量集”机制。现在,信号量机制已被广泛地应用于单处理机和多处理机系统以及计算机网络中。
整型信号量
整型信号量被定义为一个用于表示资源数目的整型量S
wait(S){ //使用一个资源,资源数目减1
while(S<=0);
S=S-1;
}
注意:若S小于等于0,就会不断地测试,存在忙则等待现象
signal(S){ //归还一个资源,资源数目加1
S=S+1;
}
记录型信号量
typedef struct{
int value;//value是一种资源,与S类似
struct process* L
}semaphore
wait操作,S.value–表示进程请求一个该类资源
当S.value<0时,表示该类资源可分配完毕,因此进程应调用block原语,进行自我阻塞,放弃处理机,并插入该类资源的等待队列S.L,可见该机制遵循了“让权等待”的准则
void wait(semaphore S){
S.value--;
if(S.value<0){
add this process to S.L
block(S.L)
}
}
signal操作,表示进程释放一个资源,使系统中可供分配的该类资源数增1,因此有S.value++
若加1后仍是S.value小于等于0,则表示在SL中仍有等待该资源的进程被阻塞,因此还应调用wakeup原语,将S.L中的第一个等待进程唤醒
void signal(semaphore S){
S.value++;
if(S.value<=0){
remove a process P from S.L
wake up(P);
利用信号量实现同步
信号量机制能用于解决进程间的各种同步问题
设S实现进程P1、P2同步的公共信号量,初值为0
进程P2中的语句y要使用进程P1中语句x的运行结果
所以只有当语句x执行完成之后,语句y才能执行
其实现进程同步的算法如下
semaphore s=0;
P1(){
x;//语句x
V(s);//告诉进程P2,语句x已经完成
}
P2(){
......
P(s);//检查语句x是否运行完成
y;
}
前V后P
在前操作之后执行V(s)
在后操作之前执行P(s)
利用信号量实现互斥
信号量机制也能解决互斥问题。设s为实现进程P1,P2互斥的信号量,由于每次只允许一个进程进入临界区,所以s的初值应为1(即可用资源为1)。只需把临界区置于P(s)和V(s)之间,即可实现两个进程对临界资源的互斥访问。其算法如下:
semaphore s=1;
P1(){
......
P(s)
进程P1的临界区
V(s)
}
P2(){
......
P(s)
进程P2的临界区
V(S)
......
}
当没有进程在临界区时,任意一个进程要进入临界区,就要执行P操作,把S的值减为0,然后进入临界区
当有进程存在于临界区时,S的值为0,再有进程要进入临界区,执行P操作时就会被阻塞,直至在临界区中的进程退出,这样便实现了临界区的互斥
互斥是不同进程对同一信号量进行P,V操作实现的,一个进程成功对信号量进行了P操作后进入临界区,并在推出临界区后,由该进程本身对该信号量执行V操作,表示当前没有进程进入临界区,可以让其他进程进入
在同步问题中
- 若某个行为要用到某种资源,则在这个行为前面P这种资源一下;
- 若某个行为会提供某种资源,则在这个行为后面V这种资源一下;
在互斥问题中,P,V操作要紧夹使用互斥资源的那个行为,中间不能有其他冗余代码
利用信号量实现前驱关系
信号量也可以用来描述程序之间或语句之间的前驱关系

分析进程同步和互斥问题的方法步骤
- 关系分析
- 整理思路
- 设置信号量
PV操作缺点
在信号量机制中,每个要访问的临界资源的进程都必须自备同步的PV操作,大量分散的同步操作给系统管理带来了麻烦,且容易因同步操作不当导致系统死锁
523

被折叠的 条评论
为什么被折叠?



