一. 为什么需要互斥?

大多数系统允许多个进程共享资源(如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. 在fedora下面安装ftp服务器

    Fedora版本:Fedora 12 1. 安装vsftp #yum install vsftpd 一路yes,最后提示安装成功. 2. 配置vsftpd.conf. #vi /etc/vsftpd/ ...

  2. 推荐5本纯Java技术书,你看过几本?

    51小长假了,大家应该对它又爱又痛,爱的是终于可以到处浪了,痛的是没钱只能穷游,而且还到处都是人,结果变成了堵高速.去看人头.去蒸饺子,真是受罪啊.. 所以,对于小长假的痛,我相信还是有一部分人会选择 ...

  3. Java多线程中提到的原子性和可见性、有序性

    1.原子性(Atomicity)   原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行. 如果一个操作时原子性的,那么多线程并发的情况下,就不会出 ...

  4. Opencv稍微高级点的鼠标事件-OpenCV步步精深

    今天我们要来点稍微高级的东西.在我们按下鼠标时可以画矩形,而我们按下键盘m键时,切换到画圆的模式,再按下m键,回到画矩形模式. 一起来写下代码,首先当然还是调用库 import cv2 import ...

  5. 零基础入门学习python--第一章

    知识点汇总1. Python的应用范围:操作系统.3D动画.WEB.企业应用.云计算等.2. Python是什么类型的语言?脚本语言,即电脑编程语言,比C.C++或java之类的系统编程语言简单容易. ...

  6. 如何使用maven打包

    使用maven打包有两种情况:不包括第三方jar包.包括第三方jar包 一般我们写程序,都会在IDEA上去调试,那么也就意味着,你需要将你所需要的jar包(第三方jar)全部给pom文件,否则是不能工 ...

  7. Error: setup script specifies an absolute path

    在安装sklearn的时候,出现: error: Error: setup script specifies an absolute path: /opt/xgboost-0.47/python-pa ...

  8. input的placeholder颜色修改

    input[type=text]::-webkit-input-placeholder { /* WebKit browsers / color: #999; } input[type=text]:- ...

  9. JS事件 鼠标单击事件( onclick )通常与按钮一起使用。onclick是鼠标单击事件,当在网页上单击鼠标时,就会发生该事件。同时onclick事件调用的程序块就会被执行

    鼠标单击事件( onclick ) onclick是鼠标单击事件,当在网页上单击鼠标时,就会发生该事件.同时onclick事件调用的程序块就会被执行,通常与按钮一起使用. 比如,我们单击按钮时,触发  ...

  10. ionic js 滑动框ion-slide-box 滑动框是一个包含多页容器的组件,每页滑动或拖动切换

    ionic 滑动框 ion-slide-box 滑动框是一个包含多页容器的组件,每页滑动或拖动切换: 效果图如下: 用法 <ion-slide-box on-slide-changed=&quo ...