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算法 解决多线程冲突,布布扣,bubuko.com

Operation System - Peterson's Solution算法 解决多线程冲突

时间: 2024-08-24 22:51:27

Operation System - Peterson's Solution算法 解决多线程冲突的相关文章

Operation System - Peterson's Solution算法 解决多线程冲突

Person's solution 是用来一种基于软件的解决关键区域问题的算法(critical-section). 它并非完美的,有可能不正确地工作.而且是限制解决两个进程同步的问题. 但是它很简单,很原始,学习起来也是很轻松的. 代码如下: do { flag[i] = true; turn = j; while (flag[j] && turn == j); critical section flag[i] = false; remainder section } while (tr

Lasvegas+回溯算法解决3SAT问题(C++实现代码)

转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46507919 1.SAT问题描述 命题逻辑中合取范式 (CNF) 的可满足性问题 (SAT)是当代理论计算机科学的核心问题, 是一典型的NP 完全问题.在定义可满足性问题SAT之前,先引进一些逻辑符号. 一个 SAT 问题是指: 对于给定的 CNF 是否存在一组关于命题变元的真值指派使得A 为真. 显然, 如果A 为真, 则 CNF 的每个子句中必有一个命题变元为 1 (真) .

模拟退火算法解决旅行商问题(matlab)

模拟退火算法解决旅行商问题. 根据概率产生新解主要包含两个途径:二交换和三交换 二交换是在TSP回路中选择两个城市直接交换 三交换是在TSP回路中选择三个点,p1,p2,p3,然后将p1,p2之间的城市直接与p3之前对应长度的城市交换 这里产生新解的方法不唯一,只要能够保证产生的新解可以包含最优解所在的解空间即可 是否接受新解主要包含两种情况: 新解比历史最优解好,则百分百接受新解 新解比当前解好,没历史最优解好,则以一定概率接受新解,并且随着温度的降低.接受的概率也会降低. 如下是TSP代码.

Conquer-Divide的经典例子之Strassen算法解决大型矩阵的相乘

在通过汉诺塔问题理解递归的精髓中我讲解了怎么把一个复杂的问题一步步recursively划分了成简单显而易见的小问题.其实这个解决问题的思路就是算法中常用的divide and conquer, 这篇日志通过解决矩阵的乘法,来了解另外一个基本divide and conque思想的strassen算法.矩阵A乘以B等于X, 则Xij = 注意左乘右乘的区别,AB 与BA是不同的.如果r = 1, 直接就是两个数的相乘.如果r = 2, 例如X = [ 1, 2;   3, 4];Y = [ 2,

可用贪心算法解决的几个基本问题

可用贪心算法解决的几个基本问题 分类: 算法2011-08-24 12:36 950人阅读 评论(0) 收藏 举报 算法活动作业c 关键:看问题有没有贪心选择性质和最优子结构性质.有些问题看似是可以用贪心算法,但是实际用贪心算法却得不到最优解.构造贪心算法后,需要一定的证明来确定它的正确性.常用证明方法:反证法.调整法. 几个基本问题: 1. 活动安排问题. 设有n个活动的集合e={1,2,-,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活动

匈牙利算法解决二分图匹配

匈牙利算法解决二分图匹配 [书本上的算法往往讲得非常复杂,我和我的朋友计划用一些简单通俗的例子来描述算法的流程] 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法. -------等等,看得头大?那么请看下面的版本: 通过数代人的努力,你终于赶上了剩男剩女的大潮,假设你是一位光荣的新世纪媒人,在你的手上有N个剩男,M个剩女,每个人都可

贪心算法解决加油站选择问题(未解决)

//贪心算法解决加油站选择问题 //# include<iostream> # include<stdio.h> using namespace std; # include<algorithm> struct Node { float p, d; }; bool cmp(Node a, Node b) { return a.d < b.d; } int main() { Node node[501]; float Cmax, D, Davg, distance,

遇到 Error creating the Web Proxy specified in the &#39;system.net/defaultProxy&#39; configuration section的解决办法

用记事本编辑*.EXE.config,在“<system.net>”节点加入<defaultProxy> <proxy usesystemdefault="False" /> </defaultProxy> 完整的: <?xml version="1.0"?> <configuration> <system.net> <settings> <httpWebReque

贪心算法解决会场安排问题

贪心算法解决会场安排问题. [问题描述] 假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场.(这个问题实际上是著名的图着色问题.若将每一个活动作为图的一个顶点,不相容活动间用边相连.使相邻顶点有不同颜色的最小着色数,相应于要找的最小会场数.) [数据输入] 由文件input.txt给出输入数据,第一行又一个正整数K,表示有K个待安排的活动. 接下来有K行数据,每行有两个正整数,分别表示K个待安排的活动的开始时间和结束时间. [结束输出] 输出最少会场数. input.txt