一. 为什么需要互斥?

大多数系统允许多个进程共享资源(如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. PAT_A1090#Highest Price in Supply Chain

    Source: PAT A1090 Highest Price in Supply Chain (25 分) Description: A supply chain is a network of r ...

  2. CentOS7 相关配置

    nginx 1.在线安装nginx yum install nginx 2.启动nginx服务 systemctl start nginx 3.防火墙设置 打开http防火墙:firewall-cmd ...

  3. sklearn参数优化

    学习器模型中一般有两个参数:一类参数可以从数据中学习估计得到,还有一类参数无法从数据中估计,只能靠人的经验进行指定,后一类参数就叫超参数 比如,支持向量机里的C,Kernel,gama,朴素贝叶斯里的 ...

  4. sails中创建和使用services

    从sails官方在线文档查知 // EmailService.js - in api/services module.exports = { sendInviteEmail: function(opt ...

  5. 将sparkStreaming的结果保存到S3

    将spark解析的结果保存到S3 这个和保存到本地的区别在于,你需要配置aws的key和密码,以及它的region,代码如下 package com.alo7.spark import java.ut ...

  6. 前端常用的库和实用技术之JavaScript多线程

    多线程概念: 多线程是指从软件或硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在 同一时间执行多于一个线程,进而提升整理处理性能.具有这种能力的系统包括对称多处理机,多核心 ...

  7. Postgraduate

    https://account.chsi.com.cn/passport/login?entrytype=yzgr&service=https%3A%2F%2Fyz.chsi.com.cn%2 ...

  8. 为什么串行传输时总是LSB在前?

    https://superuser.com/questions/1104212/why-do-serial-ports-send-data-least-significant-bit-first 其实 ...

  9. [JZOJ6272] 2019.8.4【NOIP提高组A】整除

    题目 题目大意 求方程\((x^m-x)\mod n=0\)在整数范围\([1,n]\)的解的个数. \(n=\sum_{i=1}^{c}p_i\) 给出\(c\)和\(p_i\) 思考历程 作为数论 ...

  10. python相关软件安装流程图解——Windows下安装Redis以及可视化工具——Redis-x64-3.2.100——redis-desktop-manager-0.9.3.817

    https://www.2cto.com/database/201708/666191.html https://github.com/MicrosoftArchive/redis/releases ...