一. 进程互斥的实现方式

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面包店算法的更多相关文章

  1. Lamport面包店算法详解(转 侵删)

    范例1: boolean  choosing[n];表示进程是否在取号 int  number[n];记录每个进程取到的号码 这些数据结构分别初始化为false和0,为了方便,定义如下符号: 若a&l ...

  2. 进程互斥软件实现之Dekker算法

    一. 为什么需要互斥? 大多数系统允许多个进程共享资源(如CPU,IO设备,硬盘等), 为了保证进程间能够互不影响.安全正确地访问这些共享资源, 就必须对进程访问共享资源采取互斥控制. 进程互斥原则: ...

  3. [OS] 进程互斥

    对互斥的正确软件实现算法(面包店算法)是非常耗时的,现代的计算机系统都会提供简单的硬件指令,使用这些指令能够有效地解决临界区问题. 硬件提供一个TestAndSet指令,来实现原子指令的功能: boo ...

  4. 让powershell同时只能运行一个脚本(进程互斥例子)

    powershell,mutex,互斥,进程互斥,脚本互斥 powershell脚本互斥例子,在powershell类别文章中,声明原创唯一. powershell 传教士 原创文章 2016-07- ...

  5. Java使用FileLock实现Java进程互斥锁

    原理:JDK的nio包中FileLock实现类似Linux fcntl的文件锁, 可使文件被进程互斥访问.  借助此功能, 可以实现强大的Java进程互斥锁, 从而在应用层面保证同一时间只有惟一的Ja ...

  6. 进程互斥(锁)------------------>一个坑

    进程互斥锁 引入: 进程之间数据不共享,但是共享同一套文件系统(如硬盘.键盘.cpu等),所以访问同一个文件,或同一个打印终端,是没有问题的,竞争带来的结果就是错乱,如何控制,就是加锁处理,即进程加锁 ...

  7. (day29) 进程互斥锁 + 线程

    目录 进程互斥锁 队列和堆栈 进程间通信(IPC) 生产者和消费者模型 线程 什么是线程 为什么使用线程 怎么开启线程 线程对象的属性 线程互斥锁 进程互斥锁 进程间数据不共享,但是共享同一套文件系统 ...

  8. 子进程回收资源两种方式,僵尸进程与孤儿进程,守护进程,进程间数据隔离,进程互斥锁,队列,IPC机制,线程,守护线程,线程池,回调函数add_done_callback,TCP服务端实现并发

    子进程回收资源两种方式 - 1) join让主进程等待子进程结束,并回收子进程资源,主进程再结束并回收资源. - 2) 主进程 “正常结束” ,子进程与主进程一并被回收资源. from multipr ...

  9. Python并发编程03 /僵孤进程,孤儿进程、进程互斥锁,进程队列、进程之间的通信

    Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 目录 Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 1. 僵尸进程/孤儿进 ...

随机推荐

  1. hdu多校第一场1004(hdu6581)Vacation 签到

    题意:有n+1辆车,每辆车都有一定的长度,速度和距离终点的距离,第1-n辆车在前面依次排列,第0辆车在最后面.不允许超车,一旦后车追上前车,后车就减速,求第0辆车最快什么时候能到达终点? 思路:对于每 ...

  2. Spring-Security (学习记录七)--实现FilterInvocationSecurityMetadataSource的类将无法切入声明式事物

    目录 1 查看继承关系 2 说明 3 查看源码: 实现了FilterInvocationSecurityMetadataSource 的类将无法切入声明式事物. 原因: 1 查看继承关系 先查看Fil ...

  3. CSS3:CSS3 边框

    ylbtech-CSS3:CSS3 边框 1.返回顶部 1. CSS3 边框 CSS3 边框 用 CSS3,你可以创建圆角边框,添加阴影框,并作为边界的形象而不使用设计程序,如 Photoshop. ...

  4. Day 10:函数全局变量和局部变量及函数嵌套

    全局变量:在所有函数之外赋值的变量,是全局变量. 局部变量:在函数内的变量是,局部变量 一个函数被调用时,就创建了一个局部作用域.在这个函数内赋值的所有变量,存在于该局部作用域内.该函数返回时,这个局 ...

  5. 面试问烂的 MySQL 查询优化,看完屌打面试官!

    Java技术栈 ,一般把连接数设置得大一些). 并发量:同一时刻数据库服务器处理的请求数量 3.超高的 CPU使用率:CPU资源耗尽出现宕机. 4.磁盘 IO:磁盘 IO性能突然下降.大量消耗磁盘性能 ...

  6. HashMap底层实现原理及面试问题

    ①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...

  7. <Django>博客项目

    0.项目的通用流程 项目立项 需求分析 原型 前端 页面设计 UI及交互实现 后端 架构设计 数据库设计 代码模板实现 单元测试 网站整合 功能及集成测试 网站发布 1.BBS项目需求分析 需要哪些表 ...

  8. 几个实用的js函数

    在阅读JavaScript DOM编程艺术这本书时看到了一些比较实用的代码. //加载多个window.onload事件 function addLoadEvent(func) { var oldon ...

  9. apache的目录浏览功能 列出的文件名不完整,能否修改设置

    在httpd.conf 和 httpd-vhosts.conf中的  <Directory ????> </Directory>如下设置,重启apache即可: <Dir ...

  10. VBA中msgbox的用法小结

    1.作用在消息框中显示信息,并等待用户单击按钮,可返回单击的按钮值(比如“确定”或者“取消”).通常用作显示变量值的一种方式.2.语法MsgBox(Prompt[,Buttons][,Title][, ...