Operation System - Peterson's Solution算法 解决多线程冲突
来源:互联网 发布:哈尔滨师范大学知乎 编辑:程序博客网 时间:2024/06/09 20:02
Person's solution 是用来一种基于软件的解决关键区域问题的算法(critical-section).
它并非完美的,有可能不正确地工作。而且是限制解决两个进程同步的问题。
但是它很简单,很原始,学习起来也是很轻松的。
代码如下:
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算法 解决多线程冲突
- 多线程编程Peterson算法
- Peterson's solution for achieving mutual exclusion
- Peterson‘s solution for achieving mutual exclusion
- Dekker's算法和Peterson算法
- Operation System: Multi-thread 多线程 v.s. 多进程
- Operation System: 多线程笔记
- Peterson 算法
- Peterson算法
- Peterson算法
- Peterson算法
- Peterson算法
- 多线程互斥锁访问算法(上)------Peterson算法
- 操作系统(一)协作进程临界区一些代码理解--Peterson’s Solution
- 经典Peterson算法解决互斥锁的并发的Java实现
- Peterson和多线程版本
- Peterson算法(线程间互斥)
- Peterson算法感悟
- 向自由的人生前行
- 常用邮箱POP3和SMTP服务器
- memcache/memcached/memcachedb 配置、安装
- leetcode第一刷_Minimum Path Sum
- 0401-APP--Intents
- Operation System - Peterson's Solution算法 解决多线程冲突
- leetcode: Remove Duplicates from Sorted List II
- OPENGL学习系列——OPENGL的版本
- 面向GC的Java编程
- 怎样在cmd(命令提示符)下进行复制粘贴操作
- Loading configuration files的一些案例
- Codeforces Round #245 (Div. 2)
- asp.net 实现“九连环”小游戏
- 日程管理工具