操作系统学习笔记(8) 互斥和同步的实现算法
来源:互联网 发布:淘宝代购服务点 微信 编辑:程序博客网 时间:2024/05/22 14:18
============================
进程互斥与同步:
如何协调多个进程对资源的竞争和共享?
如何解决多个进程因为竞争资源而出现执行结果异常,甚至导致系统的不稳定、失效等问题?
采用多道程序并发设计技术的操作系统对诸多进程的并发控制是非常重要的。
并发控制:
(竞争资源)
1。并发进程竞争使用同一资源时,他们之间就会发生冲突。
2。不能同时使用临界资源,必须互斥使用。
3。实现互斥,就必须有阻塞。
4。被阻塞进程永远得不到申请的资源,就是死锁。
临界区使用原则:
1。忙则等待。
2。有限等待。(不能无限制的占据每个临界资源,让临界区外的进程无限等待)
3。空闲让进。
4。让权等待。(不能在临界区内长时间内阻塞等待某个事件)
竞争资源:
(饥饿)
并发控制:
(共同协作)
要保证写操作互斥地进行。
并发控制:
(通信协作)
进程的互斥与同步的解决策略:
1。软件方法(进程自己执行相应的程序指令,很难正确控制进程同步与互斥,增加系统开销。)
2。硬件方法(屏蔽中断等,硬件束缚条件)
3。信号量方法*
4。管程方法
5。消息传递方法
软件方法:
。Dekker算法、Peterson算法
初步设想:轮流进入临界区
var turn:0,1//共享全局变量
============P0=================
while(turn != 0){
nothing;
}
<临界区>
turn = 1;
==============P1===============
while(turn != 1){
nothing;
}
<临界区>
turn = 0;
分析:初步设想
问题1:“忙等”现象。
问题2:临界区不能充分利用,严重影响进程进度,降低系统性能。
问题3:进程没有修改turn 的值,将影响到其他进程推进。
修改算法:
1。设置临界区状态
var flag = array[0,1]:ture|false
============P0===============
while(flag[1]){
}
flag[0] = true;
<临界区>
flag[0] = false;
=============P1================
while(flag[0]){
}
flag[1] = ture;
<临界区>
flag[1] = false;
分析:这种算法不能实现互斥。
第二次改进:
============P0===============
flag[0] = true;
while(flag[1]){
}
<临界区>
flag[0] = false;
=============P1================
flag[1] = ture;
while(flag[0]){
}
<临界区>
flag[1] = false;
分析:死锁。
第三次改进:
============P0===============
flag[0] = ture;
while(flag[1]){
flag[0] = false;
<延迟一段时间>;
flag[0] = true;
}
<临界区>;
flag[0] = false;
=============P1================
flag[1] = ture;
while(flag[0]){
flag[1] = false;
<延迟一段时间>;
flag[1] = ture;
}
<临界区>;
flag[1] = false;
分析:僵局。
Dekker算法:
var flag[2] = {true, false}; //临界区状态
var turn: 0,1 //进入临界区的顺序
============P0==============
flag[0] = ture;
while(flag[1]){
if(turn = 1){
flag[0] = false;
while(turn = 1){
}
flag[0] = true;
}
}
<临界区>;
turn = 1;
flag[0] = false;
============P1==============
flag[1] = ture;
while(flag[0]){
if(turn = 0){
flag[1] = false;
while(turn = 0){
}
flag[1] = true;
}
}
<临界区>;
turn = 0;
flag[1] = false;
互斥与同步解决方法:(硬件方法)
1。屏蔽中断:
代价太大
2。专用机器指令:
testset指令
boolean testset(int i)
{
if(i = 0){
i = 1;
return true;
}else
return false;
}
P(int i)
{
while(testset(bolt)){
do nothing;
}
<临界区>;
bolt = 0;
}
int main()
{
bolt = 0;
P(1);
P(2);
...
P(n);
return 0;
}
exchange指令:
procedure exchange(register r, memory m)
{
//交换变量。
}
procedure P(int i)
{
int key;
while(true){
key = 1;
while(key = 1){
exchange(key, bolt);
}
<临界区>;
exchange(key, bolt);
}
}
int main()
{
bolt = 0;
P(1);
P(2);
...
P(n);
return 0;
}
分析:”忙等“仍然存在,可能出现“饥渴”现象。可能出现死锁现象。
- 操作系统学习笔记(8) 互斥和同步的实现算法
- 操作系统学习笔记(9) 互斥和同步的信号量算法
- 操作系统学习笔记(10) 互斥和同步的经典问题
- 操作系统学习笔记(11) 互斥和同步的解决方案-消息传递
- 【操作系统笔记】同步与互斥的区别和联系
- 操作系统精髓与设计原理学习笔记五:并发性(互斥和同步)
- 操作系统学习笔记(13) 互斥与同步的经典问题 -哲学家进餐问题
- 【操作系统学习】(二)同步互斥
- 操作系统学习笔记——进程互斥与同步
- 操作系统课程设计-线程和进程的同步与互斥
- 操作系统--进程间的通信,同步和互斥等
- 操作系统读书笔记-互斥和同步
- 操作系统清华向勇陈渝版笔记(九) 同步协同多道程序设计和并发问题,同步互斥,死锁,临界区
- 操作系统概论(3) --进程的同步与互斥
- 操作系统的互斥与同步
- 操作系统--进程的互斥与同步
- Linux学习笔记:内核同步和互斥机制的简要总结
- c# 多线程学习笔记(二)互斥,同步
- silverlight游戏开发教程
- 正则表达式过滤html标签
- 心理测验:你是不是大老板的命?-
- 简单的vimrc配置
- oracle批量绑定 forall bulk collect用法以及测试案例
- 操作系统学习笔记(8) 互斥和同步的实现算法
- VC下的光标移动函数
- CXGrid里面关于内容居中的方法
- 一个迷途的程序员
- C# 备份还原SQL Server数据库
- Loss weight
- 今天去超市
- FFilmation 手册(1)
- 用谷歌拼音输入法