操作系统自学(十)进程互斥 同步以及进程互斥的软件实现方法

在这里插入图片描述

进程同步

进程同步 :直接制约关系,为了完成某种任务,建立两个或者多个进程,这些进程因为需要在某些位置上协调他们的工作次序而产生
制约关系。进程之间直接制约关系就是源于它们之间的合作

举个例子
在之前我们学习进程通信的时候,其中有一个管道通信
其中包括两个步骤,一个是写数据,一个是读数据
但是在实际应用中必须按照 写数据在先 读数据在后的顺序执行

这就是进程同步所要讨论的内容

进程互斥

之前我们学过 两种资源共享方式 1.互斥共享方式 2.同时共享方式

我们把一个时间段内只允许一个进程使用的资源成为临界资源
许多物理设备(摄像头 打印机)都属于临界资源,此外还有许多变量,数据,内存缓冲区等都属于临界资源

对于临界资源的访问 必须互斥地执行

进程互斥 当一个进程访问某些临界资源的时候,另一个想要访问该临界资源的进程必须等待
当前访问两将诶资源的进程访问结束,释放该资源之后,另一个进程才能去访问临界资源

在这里插入图片描述
进入区负责检查是否可进入临界区 若可进入,则应设置正在访问临界资源的标志
临界区 访问临界资源的那段代码
退出区负责接触正在访问临界资源的标志(解锁)
剩余区做其他处理

临界区是进程中访问临界资源的代码段
进入区和退出区是负责实现互斥的代码段

为了实现临界资源的互斥访问,同时保证系统整体性能,需要遵循下面几条原则
**1.空闲让进 临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区
2.忙则等待 当已有进程进入临界区时,其他驶入进入临界区的进程必须等待
3.有限等待,对于请求访问的进程,应保证有闲时间内进入临界区(防止产生饥饿的情况)
**
4.让权等待,当进程不能进入临界区的时候 应立即释放处理机 防止进程忙等待

进程互斥的软件实现方法

在这里插入图片描述

单标志法

下面我给出一段代码

int turn=0;//turn表示当前允许进入临界区的进程号

po进程
while (turn!=0);
critical section;
turn =1;
remainder section;

p1进程
while(turn!=1);   //进入区
critical section ;//临界区
turn=0;			  //退出区
remainder section;//剩余区

可以看到turn初值为0 刚开始的时候只允许0号进程进入临界区
若p1先上处理机运行 则一直会卡在while( turn != 1 )
直到时间片用完,发生调度 切换p0上处理机运行

代码while( turn != 0) 不会卡主p0正常访问临界区,在P0访问临界区器件及时切换回P1,
P1依然会卡在while(turn != 1);
之后再P0退出区将turn修改为1之后P1才能进入临界区

因此该算法可以实现”同一时刻最多之循序一个进程访问临界区“

turn表示允许当前进入临界区的进程号,但是只有当前允许进入临界区的进程在访问了临界区之后,才会修改turn的值
也就是说 对于临界区的访问 必须按P0 P1 P0 P1……这样的顺序执行的
这种方式带来的问题是 如果此时允许进入临界区的是P0,而P0一直不访问临界区
那么虽然此时临界区处于
空闲状态
但是不允许P1的访问

这就违背了空闲让进的原则 这就是单标志法所存在的主要问题

双标志先检查法

双标志法的思想是 设置一个bool的数组flag[] 数组中各个元素用来标记各个进程想要进入临界区的意愿
比如flag[0]=true 这就表示0号进程现在想要进入临界区,每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区
如果没有,那自身对应的flag修改为true 之后便访问临界区

bool flag[2];//表示进入临界区意愿的数组
flag[0]=false;
flag[0]=false;
P0进程
while(flag[1]);//如果此时P1想进入临界区 P0就一直循环等待
flag[0]=true;//标记P0想进入临界区
critical section;//进入临界区
flag[0[=false;//访问临界区结束 修改P0为不想使用临界区
remainder section

P1进程
while(flag[0]);
flag[1]=true;
critical section;
flag[1]=false;
remainder section;

上述代码中大家看注释应该也可以理解

但是存在的问题就是P1和P0同时进入临界区

原因在于:如果两个进程并发执行 进入区的“检查”和“上锁”两个处理不是一气呵成的,“检查”之后“上锁”可能发生了进程切换
通俗点说就是只要我换的够快 我就可以混进去

所以双标志先检查法的主要问题是违反了“忙则等待”的原则

双标志后检查法

双标志先检查法的改版 前一个算法的问题是先检查后上锁 但是两个进程无法一气呵成 导致了可能两个进程同时进入临界区的问题
于是人们想到的先上锁 后检查的方法来避免上述问题

bool flag[2];//表示进入临界区意愿的数组
flag[0]=false;
flag[0]=false;
P0进程
flag[0]=true;//标记P0想进入临界区
while(flag[1]);//如果此时P1想进入临界区 P0就一直循环等待
critical section;//进入临界区
flag[0[=false;//访问临界区结束 修改P0为不想使用临界区
remainder section

P1进程
flag[1]=true;
while(flag[0]);
critical section;
flag[1]=false;
remainder section;

但是这次虽然解决了两个进程同时进入的问题
但是 又违背了空闲让进 和 有限等待的原则会导致长期无法访问临界区产生饥饿的现象
两个进程都想争着进入临界区,但是互不相让 最后谁都无法进入临界区
有点鹬蚌相争的意思

Peterson算法

这个算法超级超级厉害 很多人看了直呼内行
我们可以理解为孔融让梨的故事 (来自东方的神秘力量)
在前边几个算法中两个进程互不想让 最后争的头破血流 要不都进去了 要不都进不去
这个算法很完美的 避开了所有的问题 主动让对方进入临界区

bool flag[2];//表示进入临界区的意愿 初始值都是false
int turn=0;//turn表示优先让那个进程进入临界区
P0进程
flag[0]=true;//P0进程想进入临界区
turn=1;//让梨 表示可以先让对方进入临界区
while(flag[1]==true && turn==1);//如果对方想进 并且自己表示谦让对方就一直循环下去
//如果对方不想进 咱们就进去
critical section;
flag[0]=false;
remainder section;

P1进程
flag[1]=true;
turn=0;//表示可以让对方先进
while(flag[0]==true && turn==0);
critical section;
flag[1]=false;
remainder section;

如果并发进行 并且两个都想要进入 但是他们又互相谦让怎么办呢?
我们可以把它说成串行执行的 然后最后一个谦让的 后进入
不知道我这样说大家能不能明白(我尽力了)

举个有味道的例子
看完这个例子我想大家指定明白了 要是还没有明白老夫也无能为力了(狗头)

有一天你和舍友都想去上厕所(大号) 但是厕所只有一个空位
你虽然想上厕所 但是出于礼貌 你和舍友说要是着急你先上吧(谦让)
但是你的舍友不想上 那么理所应当的你就上了
这是最最基本的一种情况

假如你俩同时都想上大号
你虽然想上厕所 但是出于礼貌 你和舍友说要是着急你先上吧(谦让)
你的舍友也是个通情达理之人
舍友说:你要是想上你先上吧(谦让)
舍友的这次谦让把你高兴坏了
然后你就去上了(这就是两个进程并行执行,并且同时想进入的例子)
可以看出来最后一个谦让的 就是后上的
但是也能看出来你和舍友也只是表面兄弟(手动狗头)
这次我真的尽力了

Peterson算法用软件方式解决了进程互斥问题
遵循了空闲让进 忙则等待 有限等待的三个原则
但是依然未遵循让权等待的原则
讲个笑话:这个算法是Peterson在上厕所时想出来的(手动狗头)

这篇博客就介绍这么多吧 希望对大家有所帮助

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
关于哪个视频是最好的Linux操作系统自学教程,这个问题没有一个确定的答案,因为每个人的学习方式和需求不同。以下是几个可以考虑的方面: 1. 网络口碑和用户评价:在选择Linux操作系统自学教程视频时,重要的是查看其他用户的评价和评论。可以通过搜索引擎、IT技术论坛或社交媒体上的讨论来了解不同视频的受欢迎程度和用户反馈。 2. 视频内容:确定视频内容是否覆盖了你感兴趣的主题和技能水平,确保视频涵盖了Linux操作系统的基本概念、常用命令、文件系统、网络配置以及系统管理等关键知识点。 3. 教学风格:不同的讲师有不同的教学风格,你可以通过观看视频片段来了解他们的教学方法和语言表达是否适合你的学习风格。 4. 更新频率和内容质量:确定视频是最近发布的并且信息是最新的,因为Linux操作系统在不断发展,所以更新的资源对于学习来说是很重要的。 5. 适合初学者的教程:如果你是初学者,可以选择那些针对初学者提供基础知识和详细解释的教程。这些教程通常会有更多的细节和步骤,以帮助你更好地理解和掌握Linux操作系统。 总之,通过自我评估和参考他人评价,你可以找到最适合你的Linux操作系统自学教程视频。与此同时,不要依赖于单一的资源,多样化的学习方式可以帮助你更全面地理解和掌握Linux操作系统

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值