一. 为什么需要互斥?

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

进程互斥原则: 有限等待, 空闲让进

二. 名词说明:

临界资源: 对于某一时刻仅允许一个进程访问的共享资源.
临界区: 访问临界资源的程序代码段.
互斥: 对进程排它地访问临界资源的控制手段, 某一时刻临界区的进程只能为一个.

三. Dekker算法思想:孔融让梨, 任意进程在访问关键区之前会先检查其它进程是否也需要使用关键区,如果其它进程也需要使用关键区,并且其它进程也拥有执行权限,这时当前进程就会等待其它进程访问关键区完毕,若其它进程无法同时满足两个条件,那么当前进程就会直接访问关键区域.

伪代码:

 // 变量说明:
// flag[0] = true 表示进程P0需要使用关键区
// flag[1] = false 表示进程P1不需要使用关键区
// turn = 0 表示进程P0具有访问权限
// turn = 1 表示进程P1具有访问权限 /* 进程P0行为 */
void P0()
{
while (true)
{
// P0需要使用关键区
flag[] = true;
// 检查P1是否也需要
while (flag[])
{
// 检查P1是否具有访问权限
if (turn == )
{
// P1也需要,P0让给P1
flag[] = false;
// P0等待P1执行完毕
while (turn == );
flag[] = true;
}
} // 临界区代码 // 访问完成,将权限归还P1
turn = ;
// 进程P0使用完毕
flag[] = false;
}
} /* 进程P1行为, 与进程P0类似 */
void P1()
{
while (true)
{
flag[] = true;
while (flag[] == )
{
if (turn == )
{
flag[] = false;
while (turn == );
flag[] = true;
}
} // 临界区代码 turn = ;
flag[] = false;
}
} main()
{
// 创建两个线程t1和t2
pthread_t t1, t2; // 初始化条件
flag[] = flag[] = ;
turn = ; int err; // 线程t1模拟进程P0
err = pthread_create(&t1, NULL, (void*)P0, NULL);
if (err != ) exit(-);
// 线程t2模拟进程P1
err = pthread_create(&t2, NULL, (void*)P1, NULL);
if (err != ) exit(-); pthread_join(t1, NUll);
pthread_join(t2, NUll); exit();
}

不能再用单进程编程那样一段代码从头执行到底的"直线式"思维了。这是多进(线)程编程, 程序完全有可能在执行到任意一条语句时被中断, 从而跳到另外一个进程执行另外一段代码.

Dekker算法仅能进行两个进程的互斥,对于两个以上的互斥问题,实现起来相当复杂.

总之,Dekker算法首先使用状态值的方式解决了序号访问临界区的弊端,使得进程可以互斥的访问临界资源,而最后结合了序号谦让方式解决了因为避免死锁而产生的僵局现象,就这样循序渐进地用软件方法解决了进程的互斥的问题.

参考:

https://blog.csdn.net/wsw875421872/article/details/17222219

进程互斥软件实现之Dekker算法的更多相关文章

  1. 进程互斥软件实现之Lamport面包店算法

    一. 进程互斥的实现方式 1. 软件方式: 保护临界区, 自己编写代码来实现对进程的控制. Dekker算法Peterson算法Lamport算法等 2. 硬件方式: 使用特殊指令保护临界区. 开关中 ...

  2. Peterson算法与Dekker算法解析

    进来Bear正在学习巩固并行的基础知识,所以写下这篇基础的有关并行算法的文章. 在讲述两个算法之前,需要明确一些概念性的问题, Race Condition(竞争条件),Situations  lik ...

  3. Dekker算法在多核处理器下的失效

    Dekker algorithm是一种著名的并发编程的算法,Dekker算法的核心部分是一组对称的代码来访问一组共享变量,使得两个线程不可能同时进入临界区(只要cpu内存模型是遵循顺序一致性的),从而 ...

  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. python输入输出(二)

    输出 >>> print(5) 5 >>> print(5*6) 30 >>> s1 = "hello" >>&g ...

  2. "Access denied for user 'root@localhost' 试一下你的mysql是不是用任何密码都可以登录,如果是的话这里

    https://blog.csdn.net/light_breeze/article/details/82070222 花了三小时...竟然是因为这个

  3. Portainer Exec Container 失败解决方案

    近日,将portainer服务挂了个域名,然后用Nginx代理的时候发现不能attach容器了,经过搜索在issue 找到解决方案 1.修改Nginx config server { listen 8 ...

  4. Delphi 中的哈希表: THashedStringList

    转自万一博客 Delphi 中的哈希表: THashedStringList unit Unit1; interface uses   Windows, Messages, SysUtils, Var ...

  5. 常用的一些 linux 指令

    1. mv linux下重命名文件或文件夹使用mv既可实现. 1.1 重命名 a.将一个名为abc.txt的文件重命名为1234.txt #mv abc.txt .txt b. 将目录A重命名为B ( ...

  6. 剑指offer——05重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  7. python生成当前时间的时间戳

    有时会用到时间戳,查了相关资料,在这里记一下 主要有两种方案: import datetime time_stamp = '{0:%Y-%m-%d-%H-%M}'.format(datetime.da ...

  8. .Net串口通讯中的若干问题(C#多串口硬件识别、热插拔、Close方法报错问题、IsOpen的可靠性问题)

    一.需求场景 最近有时间静下心来研究SDK,串口通讯的.要求实现识别cp210x和cp2303驱动的两款硬件,并且2303的优先级高,即有2303识别之,没有再识别210x:要求实现热插拔,拔掉自动断 ...

  9. JS对象 charAt() 方法可返回指定位置的字符。返回的字符是长度为 1 的字符串。

    返回指定位置的字符 charAt() 方法可返回指定位置的字符.返回的字符是长度为 1 的字符串. 语法: stringObject.charAt(index) 参数说明: 注意:1.字符串中第一个字 ...

  10. Win32SDK应用程序

    转自:https://blog.csdn.net/jxf_ioriyagami/article/details/1486626 1 说在前面    由于VC6及MFC的特点,我们许多人从标准C++学习 ...