博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Operating System-进程间互斥的方案-保证同一时间只有一个进程进入临界区(2)- Peterson解法...
阅读量:4325 次
发布时间:2019-06-06

本文共 1293 字,大约阅读时间需要 4 分钟。

本文接上一篇文章继续介绍如何实现同一时间只允许一个进程进入临界区的机制。本文主要介绍Peterson解法。

方案汇总

  1. 屏蔽中断
  2. 锁变量
  3. 严格轮换法
  4. TSL指令
  5. Peterson解法

一、Peterson解法

基于锁变量以及严格轮换的方法1981年,有位叫Peterson的大师提供了一个更加简单的方法来解决进程间互斥。

代码

#define N 2 //进程数为2int turn;  //现在轮到哪个进程?int interested[N]; //初始化置为false,即没有在临界区等待读写共享数据的void enter_region(int process) //进入临界区{     turn = process;     int other = 1 - turn; //另一个进程     interested[turn] = true;     while(turn == process && interested[other] == true)                ; //一直循环,直到other进程退出临界区}void leave_region(int process){     interested[process] = false;}

代码非常精炼,主要通过两个变量来配合完成,一个turn和一个interested[]数组。

二、 代码分析

  • 只有process 0进入的时候:turn=0,other=1,interested[0]=true,interested[1]= false.  enter_region马上返回,process 0马上进入临界区。
  • process 0进入临界区,但还没有离开临界区,这个时候process 1进入了临界区,turn变成了1,interested[1]= true。other=0. 但是由于process 0还没有离开临界区,所以interested[0]=interested[other]一直还是true。那么这个时候process 1就会一直在enter_region中执行while,一直等待,直到process 0离开临界区把interested[0]设置为false。

考虑一个极端情况,Process 0和Process 1几乎同时调用了enter_region, 最终肯定有个线程把另外一个线程的数据给覆盖了,假定process 1覆盖了 process 0,那么这个时候turn是1。interested[0]=interested[1]=true.

  • process 0 会马上进入临界区,不执行while循环
  • process 1则会被block,因为这个时候 turn=1 && interested[0]=true,满足while循环。

这个代码真的非常尤美,不知道怎么形容,只能一遍一遍的来体会。

 

转载于:https://www.cnblogs.com/Brake/p/Operating_System_Solution_Of_Mutual_Exclusion_Part2.html

你可能感兴趣的文章
dockerfile语法规则
查看>>
模块的导入
查看>>
《Inside C#》笔记(八) 接口
查看>>
kafka介绍
查看>>
java类加载机制及方法调用
查看>>
《大话西游》:我的意中人是一个盖世英雄
查看>>
iOS 清除xcode缓存和生成文件
查看>>
为什么幻灯片画布不居中
查看>>
flask模板应用-javaScript和CSS中jinja2 --
查看>>
react-native 调用原生方法
查看>>
查看Mac系统所有USB设备信息 解决android studio无法识别真机问题
查看>>
20145238 《信息安全系统设计基础》第2周学习总结
查看>>
android 获取日期
查看>>
HDU-1018 BigNumber(斯特林近似)
查看>>
Excel公式——单元格前加固定字符串
查看>>
BZOJ.4738.[清华集训2016]汽水(点分治 分数规划)
查看>>
testNG框架的四种传参方式
查看>>
stark组件开发之URL别名的设置
查看>>
npm总结
查看>>
css样式margin padding border
查看>>