Operation System - Peterson's Solution算法 解决多线程冲突
Person's solution 是用来一种基于软件的解决关键区域问题的算法(critical-section).
它并不是完美的,有可能不对地工作。并且是限制解决两个进程同步的问题。
可是它非常easy,非常原始,学习起来也是非常轻松的。
代码例如以下:
do {
flag[i] = true;
turn = j;
while (flag[j] && turn == j);
critical section
flag[i] = false;
remainder section
} while (true);
flag[]事实上是一个2个变量的数组。这里的i标志一个进程,而j标志还有一个进程。
critical section代表是须要相互排斥进入的一个区间,比方须要改动一些关键的共享数据,这个时候不能让两个进程同一时候改动,否则就会出现不可预知的结果了。记得好像见过阿里巴巴笔试有这种题目。
有remainder section并不是关键区域,所做的操作是能够并行操作的,结果互不影响。
这里基本的目的就是两个进程相互排斥地进入critical section。
那么为什么这个算法是可行的呢?
这种算法可行,须要满足三个条件:
1 Mutual exclusion: 相互排斥进入
2 Progress : 在非remaider section的进程能在一定时间内进入critical section
3 Bounded waiting: 保证一个进程的等待时间不会过长
分析:
如果1 : 两个进程P1, P2同一时候运行了do语句:语句运行为:P1 flag[i] = true; P2 flag[j] = true; P1 turn = j; P2 turn = i; P1 while(flag[j] && turn == j) ;
这个时候因为P2已经运行了turn = i语句,所以turn == i,那么P1的语句while(flag[j] && turn == j)的turn ==j就为假了,所以这个时候退出循环,P1进入critical section。
然后P2 while (flag[i] && turn == i);由于这个时候flag[i] 和turn ==i都为真,那么P2就处于等待状态。由于P1和P2是等同的,所以这个情况下,仅仅能有一个进程能够进入critical section的。条件1成立。
假设继续运行,那么就能够分析条件2也是成立的:由于P1进入了critical section之后运行完成,退出来,那么flag[i] = false,这个语句运行之后,P2 while(flag[i] && turn == i)的flag[i]就为假了。之歌时候P2就能够进入critical section了。
那么继续分析条件3,能够知道P2的等待时间仅仅是P1运行critical section的时间。这个等待时间一般不会过长。
其它情况就更加不会冲突了,能够列举全部语句运行的顺序知道,不管两个进程的语句怎样运行,这个算法都是成立的。
--參考资料:Operating System Concepts
Operation System - Peterson's Solution算法 解决多线程冲突的更多相关文章
- (转)调用System.gc没有立即执行的解决方法
调用System.gc没有立即执行的解决方法 查看源码 当我们调用System.gc()的时候,其实并不会马上进行垃圾回收,甚至不一定会执行垃圾回收,查看系统源码可以看到 /** * Indicate ...
- 找不到方法:“Boolean System.Runtime.Serialization.DataContractAttribute.get_IsReference()”的解决办法
找不到方法:“Boolean System.Runtime.Serialization.DataContractAttribute.get_IsReference()”.的解决办法站点发布后部署到了两 ...
- 遇到 Error creating the Web Proxy specified in the 'system.net/defaultProxy' configuration section的解决办法
用记事本编辑*.EXE.config,在“<system.net>”节点加入<defaultProxy> <proxy usesystemdefault="Fa ...
- 题目1437:To Fill or Not to Fill:贪心算法解决加油站选择问题(未解决)
//贪心算法解决加油站选择问题 //# include<iostream> # include<stdio.h> using namespace std; # include& ...
- xsank的快餐 » Python simhash算法解决字符串相似问题
xsank的快餐 » Python simhash算法解决字符串相似问题 Python simhash算法解决字符串相似问题
- 详解zkw算法解决最小费用流问题
网络流的一些基本概念 很多同学建立过网络流模型做题目, 也学过了各种算法, 但是对于基本的概念反而说不清楚. 虽然不同的模型在具体叫法上可能不相同, 但是不同叫法对应的思想是一致的. 下面的讨论力求规 ...
- SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题——Jason niu
%SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题——Jason niu X = [16.4700 96.1000 16.4700 94.4400 20.0900 92.5400 2 ...
- Hash算法解决冲突的方法
https://blog.csdn.net/feinik/article/details/54974293 Hash算法解决冲突的方法一般有以下几种常用的解决方法1, 开放定址法:所谓的开放定址法就是 ...
- Oracle system表空间满的暂定解决方法
Oracle system表空间满的暂定解决方法 数据库用的是Oracle Express 10.2版本的.利用Oracle Text做全文检索应用,创建用户yxl时没有初始化默认表空间,在系统开发过 ...
随机推荐
- 五、SolrJ、Request Handler
什么是SolrJ 既然Solr是以单独的WebApp形式存在的,那么Solr理应提供与Solr通信的Api吧,对的,这就是SolrJ,既然与solr通信是通过url,那么其实我们也可以不用SolrJ, ...
- REST深入浅出
不知你是否意识到,围绕着什么才是实现异构的应用到应用通信的“正确”方式,一场争论正进行的如火如荼:虽然当前主流的方式明显地集中在基于SOAP.WSDL和WS-*规范的Web Services领域,但也 ...
- jquery之onchange事件
$(function(){ $("#opreateHtml").window("close"); $("#deliveryGrid").da ...
- FreeMarker辅助
/** * FreeMarker 辅助类 * @author Rubekid * */ public class FreeMarkerHelper { /** * 模板文件存放目录 */ privat ...
- 毕业设计 ASP.Net+EasyUI开发 X X露天矿调度管理信息系统(一)
开篇介绍关于EasyUI技术,界面部分的一些使用知识,包括控件的赋值.取值.清空,以及相关的使用. 我们知道,一般Web界面包括的界面控件有:单行文本框.多行文本框.密码文本框.下拉列表Combobo ...
- lvm拉伸逻辑卷分区小总结
文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/vg_znl-lv_root ...
- 委托与Lambda-浅谈
委托概述 委托是寻址方法的.NET版本. 在C++中,函数指针只不过是一个指向内存位置的指针,它不是类型安全的.我们无法判断这个指针实际指向什么,更不知晓像参数和返回类型等项了. 而.NET委托完全不 ...
- Java系列--第三篇 基于Maven的Android开发CAIO
学习要打好基础,这里用一个项目来学习一下Android的组件,参考网址为这个但不限于这个.有些东西的学习,理解三遍理论还不如一遍操作,所谓理论来自实践,实践是检验真理的唯一标准.所以,虽然看懂了那篇文 ...
- Python学习笔记整理(三)Python中的动态类型简介
Python中只有一个赋值模型 一.缺少类型声明语句的情况 在Python中,类型是在运行过程中自动决定的,而不是通过代码声明.这意味着没有必要事声明变量.只要记住,这个概念实质上对变量,对象和它们之 ...
- OC 冒泡排序 -- 核心代码
//冒泡 核心代码 for (int i = 0; i < array.count - 1; i++) { int a = [array[i] intValue]; for (int j = i ...