进程互斥软件实现之Lamport面包店算法
一. 进程互斥的实现方式
1. 软件方式:
保护临界区, 自己编写代码来实现对进程的控制.
Dekker算法
Peterson算法
Lamport算法等
2. 硬件方式:
使用特殊指令保护临界区.
开关中断指令
测试并加锁指令
交换指令
忙等待, 自旋锁
二. Lamport面包店算法
解决多线程并发访问同一个共享资源的互斥问题
这个思想来自于面包店, 医院等, 需要排队取号的场所. 顾客进入面包店前,首先抓取一个号码,然后按号码从小到大的次序依次进入面包店购买面包.
前提:
面包店按由小到大的次序发放号码
两个或两个以上的顾客有可能得到相同号码
当多个顾客抓到相同号码,则按顾客名字的字典次序排序
基本思想:
发号器按由小到大的次序发放号码. 进程进入临界区前先抓取一个号码, 然后按号码从小到大的次序依次进入临界区. 若多个进程抓到相同的号码则按进程编号依次进入.
伪算法:
// 变量说明:
// i 表示当前进程PID
// j 表示当前迭代到的进程PID
// choosing[i] 表示当前进程i是否正在取号, 默认值为false
// number[i] 表示当前进程i的排队号, 默认值为0 process(i) {
while (true) {
// 当前进程i正在取号
choosing[i] = true;
// number为上一个已发放的排队号加1
number[i] = + max(number[], number[], ..., number[n-]);
// 当前进程i取号完毕
choosing[i] = false; // 迭代所有进程
for (j = ; j < n; j++)
{
// 若当前迭代到的进程j正在取号, 则等待其取号完毕
while(choosing[j]); // 同时满足, 当前进程才能通过
while (number[j] != && (number[j], j) < (number[i], i));
} // 临界区代码 // 当前进程注销排队号
// 一旦线程在临界区执行完毕,需要把自己的排队签到号码置为0,表示处于非临界区
number[i] = ; // 其它代码 }
}
注意:
1) 进程需要排队等待的三种情况:
情况1: 存在没有取得排队号的进程
情况2: 当前迭代到的进程没有取得排队号
情况3: 当前迭代到的进程的排队号小于当前进程的排队号, 或当前迭代到的进程PID小于当前进程PID
2) 只有当前进程注销了排队号, 在排队的其它进程才能进入临界区, 满足进程互斥和有限等待
3) 符号说明: (a, b) < (c, d) 表示 (a < c) or ((a == c) and (b < d))
4) 使用choosing数组是必须的, 假设不使用choosing数组, 就可能会出现这种情况: 设进程i的优先级高于进程j(即 i < j), 两个进程获得了相同的number,
进程i在写number[i]之前, 被优先级低的进程j抢先获得了CPU时间片, 这时进程j读取到的number[i]为0, 因此进程j进入了临界区. 随后进程i又获得CPU时间片, 它读取到的number[i]与number[j]相等, 且i < j, 因此进程i也进入了临界区. 这样, 两个进程同时在临界区内访问, 可能会导致数据腐烂(data corruption). 算法使用了choosing数组变量, 使得修改number数组的元素值变得"原子化", 解决了上述问题
后续:
在Linux上实现编写C程序实现面包店算法
参考:
1. 《算法之美》—进程互斥软件算法(Lamport面包店算法和Eisenberg算法)
https://www.xuebuyuan.com/647028.html
2. 面包店算法 - CSDN
https://blog.csdn.net/yucan1001/article/details/7973075
进程互斥软件实现之Lamport面包店算法的更多相关文章
- Lamport面包店算法详解(转 侵删)
范例1: boolean choosing[n];表示进程是否在取号 int number[n];记录每个进程取到的号码 这些数据结构分别初始化为false和0,为了方便,定义如下符号: 若a&l ...
- 进程互斥软件实现之Dekker算法
一. 为什么需要互斥? 大多数系统允许多个进程共享资源(如CPU,IO设备,硬盘等), 为了保证进程间能够互不影响.安全正确地访问这些共享资源, 就必须对进程访问共享资源采取互斥控制. 进程互斥原则: ...
- [OS] 进程互斥
对互斥的正确软件实现算法(面包店算法)是非常耗时的,现代的计算机系统都会提供简单的硬件指令,使用这些指令能够有效地解决临界区问题. 硬件提供一个TestAndSet指令,来实现原子指令的功能: boo ...
- 让powershell同时只能运行一个脚本(进程互斥例子)
powershell,mutex,互斥,进程互斥,脚本互斥 powershell脚本互斥例子,在powershell类别文章中,声明原创唯一. powershell 传教士 原创文章 2016-07- ...
- Java使用FileLock实现Java进程互斥锁
原理:JDK的nio包中FileLock实现类似Linux fcntl的文件锁, 可使文件被进程互斥访问. 借助此功能, 可以实现强大的Java进程互斥锁, 从而在应用层面保证同一时间只有惟一的Ja ...
- 进程互斥(锁)------------------>一个坑
进程互斥锁 引入: 进程之间数据不共享,但是共享同一套文件系统(如硬盘.键盘.cpu等),所以访问同一个文件,或同一个打印终端,是没有问题的,竞争带来的结果就是错乱,如何控制,就是加锁处理,即进程加锁 ...
- (day29) 进程互斥锁 + 线程
目录 进程互斥锁 队列和堆栈 进程间通信(IPC) 生产者和消费者模型 线程 什么是线程 为什么使用线程 怎么开启线程 线程对象的属性 线程互斥锁 进程互斥锁 进程间数据不共享,但是共享同一套文件系统 ...
- 子进程回收资源两种方式,僵尸进程与孤儿进程,守护进程,进程间数据隔离,进程互斥锁,队列,IPC机制,线程,守护线程,线程池,回调函数add_done_callback,TCP服务端实现并发
子进程回收资源两种方式 - 1) join让主进程等待子进程结束,并回收子进程资源,主进程再结束并回收资源. - 2) 主进程 “正常结束” ,子进程与主进程一并被回收资源. from multipr ...
- Python并发编程03 /僵孤进程,孤儿进程、进程互斥锁,进程队列、进程之间的通信
Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 目录 Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 1. 僵尸进程/孤儿进 ...
随机推荐
- PAT_A1043#Is It a Binary Search Tree
Source: PAT A1043 Is It a Binary Search Tree (25 分) Description: A Binary Search Tree (BST) is recur ...
- Day 10:函数全局变量和局部变量及函数嵌套
全局变量:在所有函数之外赋值的变量,是全局变量. 局部变量:在函数内的变量是,局部变量 一个函数被调用时,就创建了一个局部作用域.在这个函数内赋值的所有变量,存在于该局部作用域内.该函数返回时,这个局 ...
- 关于JQuery Ajax 跨域 访问.net WebService
关于这个 jQuery Ajax跨域访问 WebService 前天整了好几个小时没整明白 今天再看一下 结果突然就顿悟了 1.建一个空webApplication --添加--新建项--web服务( ...
- Python:获取当前py的文件名
采用pathlib库 from pathlib import Path Path(__file__).name
- Restoring Road Network Floyd
问题 C: Restoring Road Network 时间限制: 1 Sec 内存限制: 128 MB提交: 731 解决: 149[提交] [状态] [讨论版] [命题人:admin] 题目 ...
- springboot整合thymeleaf手动渲染
Thymeleaf手动渲染 为提高页面访问速度,可缓存html页面,客户端请求从缓存获取,获取不到再手动渲染 在spring4下 @Autowired ThymeleafViewResolver th ...
- 一个很SB的方法,来开始调一个刚启动就SB的程序
自己鼓捣的方法,累死我了... 遇到一个程序,这程序启动之后,会自动重新启动我的电脑, 我想调试它一下,但是遇到了问题, 如果我用调试器附加上去的话,电脑是不重起了,但是它启动了之后会立刻黑屏,全黑, ...
- swt java 内嵌ActiveX控件
这里用的是SWT/JFace开发application中SWT自带的org.eclipse.swt.ole.win32 包可以支持内嵌OLE和ActiveX. 具体用法如下: //创建一个OleFra ...
- more指令和less指令使用的区别
more和less都是可以一页一页的翻动 more翻页的时候,显示有百分比在最下一行 less没有 more可以用来查询 空白键 (space):代表向下翻一页:Enter :代表向下翻『一行』:/字 ...
- VisualGDB使用随笔
VisualGDB是目前我遇到的在Windows下开发Linux应用程序最好用的软件,它不仅可以直接在VS环境中编译Linux程序,还可以直接对Linux程序进行调试,极大的方便了Windows程序员 ...