一. 为什么需要互斥?

大多数系统允许多个进程共享资源(如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. ncurses库的介绍与安装

    Frm: http://blog.csdn.net/Mary_Jane/article/details/50769631 介绍 ncurses(new curses)是一套编程库,它提供了一系列的函数 ...

  2. 46张PPT弄懂JVM、GC算法和性能调优!

    来源:cnblogs.com/cyfonly/p/5807121.html 本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述. ...

  3. shell 脚本 功能性语句 read,expr,test

    1. read 从终端输入数据赋值给变量 read val 把读入的数据存放到val中 #!/bin/bash echo -n "please input two number :" ...

  4. mysql连接数问题备份

    一. max_connections 这是是查询数据库当前设置的最大连接数 mysql> show variables like '%max_connections%';+----------- ...

  5. EXCEL表格链接SQLSEVER数据库

    Sub 数据库连接()     Set Cnn = CreateObject("ADODB.Connection")    Set rs = CreateObject(" ...

  6. 导出sheet到新文件夹当中

    Sub 导出当前客户达成分析()Application.ScreenUpdating = FalsemyName1 = Sheets("日期统计表").Range("B1 ...

  7. CHI统计方法度量特征词和类别之间的相关度

    其中, A:包含特征词w且属于类别c的文档频数 B:包含特征词w但不属于类别c的文档频数 C:属于类别c但不包含特征词w的文档频数 D:既不属于c也不包含特征词w的文档频数 N:文档总数 CHI统计方 ...

  8. JAVA算法之简单排序

    冒泡排序: 在概念上是排序算法中最简单的,但是运行起来非常慢,冒泡排序遵循以下几个规则(假如我们现在要给一队打乱的足球队员排序): 比较两个队员 如果左边的队员比右边的高,则交换位置 向右移动一位,比 ...

  9. Ros node启动与关闭

    1. ros运行单位: Ros程序运行的单位是ros node. 2. ros 节点的启动: (1)初始化ros节点:通过调用ros::init()接口实现:可以通过参数指定默认节点名字,之所以是默认 ...

  10. hibernate_01_SSH环境搭建

    1.maven工程pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="h ...