Operating System-进程间互斥的方案-保证同一时间只有一个进程进入临界区(1)- 屏蔽中断,锁变量,严格轮换法
2015-12-10 21:57
218 查看
上上篇文章提出了进程件的竞争条件,上一篇文章提出了临界区的概念,通过同一时间只允许一个进程进入临界区的机制从而避免了进程间的竞争条件,本文接上一篇文章主要介绍如何实现同一时间只允许一个进程进入临界区的机制。
方案汇总
屏蔽中断
锁变量
严格轮换法
Peterson解法
TSL指令
当所有屏蔽被屏蔽后,包括时钟中断也会被屏蔽,CPU只有在时钟中断或者其他中断产生的时候才会在各个进程之间进行轮回。SO当中断被屏蔽以后,CPU就不可能让其他进程在运行,当然不会再有其他进程进入临界区域。这是一个简单粗暴的方法来实现目的。且只能通过硬件指令完成。
如果系统是多核的,屏蔽中断只影响执行屏蔽中断的CPU,其他CPU照样可以运行其他进程,这个进程有可能就会和其他CPU的进程同时进入临界区域
内核可以用屏蔽中断的方式来实现一些中断操作(但是这个机制用的还是越来越少)
当Turn为0时,Process 0才能能进入临界区,否则等待。等Process 0离开临界区后,将Turn设置为1.
当Turn为1时,Process 1才能进入临界区,否则等待。等Process 1离开临界区后,将Turn设置为0.
turn==0时进入临界区域
离开临界区域后turn设置为1
当turn!=1时一直等待
turn==1时进入临界区域
离开临界区域后turn设置为0
下一篇文章介绍改进后的Peterson方案。
方案汇总
屏蔽中断
锁变量
严格轮换法
Peterson解法
TSL指令
一、屏蔽中断
1.1 介绍
在单CPU的系统中可以通过屏蔽中断达到进程间的互斥:当一个进程进入临界区之后马上将系统所有中断屏蔽,等离开临界区域后再打开中断。当所有屏蔽被屏蔽后,包括时钟中断也会被屏蔽,CPU只有在时钟中断或者其他中断产生的时候才会在各个进程之间进行轮回。SO当中断被屏蔽以后,CPU就不可能让其他进程在运行,当然不会再有其他进程进入临界区域。这是一个简单粗暴的方法来实现目的。且只能通过硬件指令完成。
1.2 缺点
如果让用户进程有屏蔽中断的权力,万一用户进程永远不打开中断怎么办?当然结果就是系统等于down机了如果系统是多核的,屏蔽中断只影响执行屏蔽中断的CPU,其他CPU照样可以运行其他进程,这个进程有可能就会和其他CPU的进程同时进入临界区域
1.3 优点
实现简单内核可以用屏蔽中断的方式来实现一些中断操作(但是这个机制用的还是越来越少)
二、锁变量
2.1 描述
锁变量的思想很简单,针对一个临界区域定义一个变量(N)。当一个进程进入这个临界区之前先判断这个N是不是0,如果是0,则也许进入,进入前先把N置为1(这样其他进程就不能进入临界区),离开临界区时再把N置为0(这样其他进程就可以进入临界区)。如下图所示。2.2 缺点
这个方案虽然相对简单,但是有一个致命的缺点,前面的文章里面的Spooler的例子就是个反例。假设Process A先进入了临界区域,再将N修改成1之前,CPU开始了一次切换,Process A停止运行,ProcessB开始运行,这个时候N还是0,所以Process B是可以进入这个临界区的,这样Process A和Process B同时进入了临界区,从而失去了进程间针对临界区域的互斥。所以该方案只是一个尝试,不能从根本上解决问题。三、严格轮换法
3.1 介绍
严格轮换法同样也是针对一个临界区设置一个变量,假设为Turn。以两个进程为例子:当Turn为0时,Process 0才能能进入临界区,否则等待。等Process 0离开临界区后,将Turn设置为1.
当Turn为1时,Process 1才能进入临界区,否则等待。等Process 1离开临界区后,将Turn设置为0.
3.2 算法表示
当turn!=0时一直等待turn==0时进入临界区域
离开临界区域后turn设置为1
while(true) { while(turn != 0); //loop critical_region(); turn = 1; noncritical_region(); }
当turn!=1时一直等待
turn==1时进入临界区域
离开临界区域后turn设置为0
while(true) { while(turn != 1); //loop critical_region(); turn = 0; noncritical_region(); }
3.3 缺点
当条件不满足时,进程进入一直循环状态,CPU处于忙等待(Spin Lock),严重浪费CPU资源下一篇文章介绍改进后的Peterson方案。
相关文章推荐
- linux系统inittab文件丢失故障
- shell变量数学运算
- Linux基本命令操作
- 网页切图的技巧及经验总结
- 为linux主机安装应用程序
- Shell学习--(2)变量
- Hadoop-2.2.0中国文献——MapReduce 下一代 —配置单节点集群
- Hadoop 配置文件存放位置
- 关于linux文件管理的学习
- mongoDB实践-docker实践-01
- linux 硬盘分区
- Red Hat Linux 6.0安装图解
- AOJ 0118 Property Distribution {深度优先搜索}
- centos samba/squid 配置 samba配置 smbclient mount fstab自动挂载samba curl -xlocalhost:3128 www.qq.com squid配置 3128 DNSPOD 第二十七节课
- -IPtraf网卡流量监控
- linux configure使用方法
- Apache与Tomcat的整合
- linux打包与压缩命令
- 自定义置顶TOP按钮
- tomcat使用axis2实现webservice问题小结