2.3.2临界区进程的软件实现方法

全知识整理目录

操作系统整理的目录,包括了整理的所有操作系统的知识。


概述

进程的软件实现方法,就是在进入区设置检查一些标志,来标明是否有进程在临界区中,如果已经有进程在临界区,那么通过循环检查进行等待,进程离开临界区后则在退出修改标志。

简而言之,就是入区循环检查,离开临界区则修改标志

目录

概述

单标志法 

双标志先检查法

双标志后检查法

Peterson算法


单标志法 

每个进程进入临界区都会被赋予权限,但是这个临界区只能赋予一个进程。

int turn = 0; //turn表示当前允许进入临界区的进程号
P0进程:
while(turn != 0){
    critical section;
    turn = 1;
    remainder section;
}
int turn = 0; //turn表示当前允许进入临界区的进程号
P0进程:
while(turn != 1){
    critical section;
    turn = 0;
    remainder section;
}

单标志法,就是使用turn来做出一定的标志,根据判断标志来判断,此刻应该让那个进程进入临界区。即一直要按照指定的顺序访问临界区,P0->P1->P0->P1........,如果此时P0出现访问不到临界的情况,那么P1也会一直访问不到临界区,违反了空闲让进的原则

双标志先检查法

设置一个Boolean类型的数组flag[],数组中各个元素用来,标记各进程想进入临界区的意愿,比如flag[0] = ture 就代表0号进程P0,现在想要进入临界区。每个进程在进入临界区前,先检查当前有没有别的进程想进入临界区,如果没有,则把自身对应的标志flag[i]设置为true,之后开始访问临界区。

bool flag[2];        //表示进入临界区的意愿组
flag[0] = false;
flag[1] = false;    //刚开始两个进程都想要进入临界区

P0进程:
    while(flag[1])      //循环等待

    flag[0] = true;    //想要进入临界区

    critical section;    //临界区
    
    flag[0] = false;     //退出区
    
    remainder section    //剩余区




P1进程:
    while(flag[0])       //循环等待

    flag[1] = true;    //想要进入临界区

    critical section;    //临界区
    
    flag[1] = false;     //退出区
    
    remainder section    //剩余区

双标志检查法的最大缺点是,检查和上锁两个处理不是一气呵成的。检查后,上锁可能发生进程的切换,那么此刻可能发生进程的却换。违反了忙则等待的原则

双标志后检查法

 这是为了解决双标志检查法的问题。为了解决双标志检查法,检查和上锁无法一气呵成,有可能导致进程切换的情况。那么就先上锁后检查,这就是双标志后检查法做的事情。

bool flag[2];        //表示进入临界区的意愿组
flag[0] = false;
flag[1] = false;    //刚开始两个进程都想要进入临界区

P0进程:

    flag[0] = true;    //进入区

    while(flag[1]);      //循环等待

    critical section;    //临界区
    
    flag[0] = false;     //退出区
    
    remainder section    //剩余区

P1进程:

    flag[1] = true;    //进入区

    while(flag[1])      //循环等待

    critical section;    //临界区
    
    flag[1] = false;     //退出区
    
    remainder section    //剩余区

如果,P0和P1都同事i想要进入临界区,那么都会进入循环等待对方的情况,这样就违反了,空闲让进和有限等待的原则。

Peterson算法

 双标志后检查法,遗留的问题是,两个进程都想要进入临界区,但是谁也不让谁,最后都会陷入等待的状态。peterson这个人想到了一个办法,如果双方都想要进入临界区,那么就互相让,主动让对方先使用临界区,谁后让谁就使用临界区。

bool flag[2];        //表示进入临界区的意愿组
int turn = 0;        //表示那个进程进入临界区

P0进程:
    flag[0] = true;    //进入区

    turn = 1;        //置换为对方的序号,表示可以让对方先进入

    while(flag[1] && trun ==1);      //循环等待

    critical section;    //临界区
    
    flag[0] = false;     //退出区
    
    remainder section    //剩余区

P1进程:
    flag[1] = true;    //进入区

    trun = 0;            //置换为对方的序号,表示可以让对方先进入
 
    while(flag[0] && turn == 0);      //循环等待

    critical section;    //临界区
    
    flag[1] = false;     //退出区
    
    remainder section    //剩余区

参考:https://www.bilibili.com/video/av70156862?p=19

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ybbgrain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值