计算机操作系统——经典进程的同步问题

计算机操作系统——信号量机制与经典进程的同步问题

信号量机制

  • 随着发展,信号量从整型信号量经记录型信号量,进而发展为“信号量集”机制。

  • 一般来说,信号量的值与相应的资源的使用情况有关。

  • 信号量的值仅由P、V操作改变。

  • 信号量的初值大于等于0

  • S > 0表示有S个可用资源

  • S = 0表示无资源可用

  • S < 0表示S等待队列中的进程个数

P,V操作的优缺点:

  1. 优点:简单,表达能力强(用P,V操作可解决任何同步,互斥问题)
  2. 缺点:不够安全,使用不当会出现死锁;遇到复杂同步互斥问题时实现复杂。

1.信号量机制——整型信号量

最初由Dijkstra把整型信号量定义为一个用于 表示资源数目的整型量S ,它与一般整型量不同,除初始化外,仅能通过两个标准的原子操作(Atomic Operation)wait(S)和signal(S)来访问。很长时间以来,这两个操作一直被分别称为P、V操作

wait(S){while(S <= 0) ;    /*do no-op*/S--;}
signal(S){S++;}
  • wait(S)和signal(S)是两个原子操作,因此,在执行时是不可中断的。
  • 当一个进程在修改某信号量时,没有其他进程可同时对该信号量进行修改。
  • 在wait操作中,对S值的测试和对S–操作时都不可断。

2.信号量机制——记录型信号量

整型信号量如果S一直小于等于0,那就使处理机一直处于忙等状态。记录型信号量机制则是一种不存在“忙等”现象的进程同步机制。但在采取了“让权等待”的策略之后,又会出现多个进程等待访问同一临界资源的情况。

  • 记录型信号量机制中,除了需要一个用于代表资源数目的整型变量value外,还应增加一个进程链表指针list,用于链接上述的所有等待进程。记录型信号量是由于它采用了记录型的数据结构而得名的。
typedef struct{int value;struct process_control_block *list;
}semaphore;wait(semaphore *S){S->value--;if(S->value<0) block(S->list);
}signal(semaphore *S){S->value++;if(S->value <= 0) wakeup(S->list);
}

3.信号量机制——AND型信号量

  • 之前的进程互斥问题,是针对各进程之间只共享一个临界资源而言的。在有些应用场合,是一个进程需要先获得两个或更多的共享资源后才能执行其任务。
  • 假定现有两个进程A和B,它们都要访问共享数据D和E。当然,共享数据都应作为临界资源。为此,可为这两个数据分别设置用于互斥的信号量Dmutex和Emutex,并令它们的初值都是1。相应地,在两个进程中都要包含两个对Dmutex和Emutex的操作。
process A:wait(Dmutex);wait(Emutex);
process B:wait(Emutex);wait(Dmutex);
  • 若进程A和进程B按下述次序交替执行wait操作:
    process A : wait(Dmutex); 于是Dmutex=0
    process B : wait(Emutex); 于是Emutex=0
    process A : wait(Emutex); 于是Emutex=-1 ,A阻塞
    process B : wait(Dmutex); 于是Dmutex=-1 ,B阻塞

A和B处于僵持,进入死锁状态

  • AND同步机制的基本思想:将进程在整个运行过程中需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放。
  • 对若干个临界资源地分配,采取原子操作方式:要么把它所请求的资源全部分配到进程,要么一个也不分配
Swait(S1,S2, ... ,Sn){while(TRUE){if(Si>=1 && ... &&Sn>=1){for(i=1;i<=n;i++) Si--;break;}else{place the process in the waiting queue associated with the first Si found with Si<1,and set the program count of this process to the beginning of Swait operation.}}
}Ssignal(S1,S2, ... ,Sn){while(TRUE){for(i=1;i<=n;i++){Si++;Remove all the process waiting in the queue associated with Si into the ready queue.}}
}

经典进程的同步问题

一、生产者——消费者问题

解决互斥同步问题的主要步骤:

  1. 分析清楚题目涉及的进程间制约关系。(可能是一种也可能是两种)
  2. 设置信号量(包括信号量的个数和初值,写出信号量物理含义)
  3. 身临其境写算法(并把P,V操作加到程序适当之处)
  • 生产者消费者问题是一种同步问题的抽象描述。计算机系统中的每个进程都可以消费(使用)或生产(释放)某类资源。这里的资源可以是硬件资源,也可以是软件资源。
  • 当某一进程使用某一资源时,可以看作是消费,称该进程是消费者。而当某一进程释放某一资源时,它就相当于生产者。

生产者——消费者问题的分析:

  1. 只要缓冲区未满,生产者就可以把产品送入缓冲区。(同步)
  2. 只要缓冲区为空,消费者就可以从缓冲区中取走物品。(同步)
  3. 缓冲池一次只能有一个进程访问。(互斥)

生产者——消费者问题:信号量和变量的设置

  • 由于有界缓冲池是一个临界资源,必须互斥使用。另外,还需要设置一个互斥信号量mutex,其初值为1.
  • 应该设置两个同步信号量:一个说明空缓冲区的数目,用empty表示。初值为有界缓冲区的大小n;另一个说明已满缓冲区的数目,用full表示,初值为0。
  • 变量:缓冲池:buffer[n-1],数组下标:in,out,初值为0。
/*生产者*/
producer(){while(1){生产产品;P(empty);    /*请求一个空闲缓冲区*/P(mutex);把产品放入缓冲池;in = (m+1) mod n;V(mutex);V(full);    /*增加一个产品*/}
}	
/*消费者*/
consumer(){while(1){P(full);    /*消耗一个产品*/ P(mutex);从缓冲区取出一个产品;V(mutex);V(empty);    /*增加一个空闲缓冲区*/}
}

生产者——消费者问题:算法结论

  • P,V操作必须成对出现。
  • 互斥的P,V出现在同一进程。
  • 同步的P,V出现在不同的进程。
  • 同步的P操作和互斥的P操作同时出现时,先写同步P操作,再写互斥P操作。

例题1:桌子上有一个盘子,最多允许存放一个水果。父亲只放苹果,母亲只放橘子;女儿只吃苹果,儿子只吃橘子。用信号量P,V写出父亲、母亲、女儿、儿子的同步算法

信号量设置:
empty(盘子空余空间)=1;apple(苹果)=0;orange(橘子)=0

父亲father

father(){while(1){P(empty);放入苹果;V(apple);}
}

母亲mother

mother(){while(1){P(empty);放入橘子;V(orange)}
}

女儿daughter

daughter(){while(){P(apple);吃苹果;V(empty);}
}

儿子son

son(){while(1){P(orange);吃橘子;V(empty);}
}

例题2:桌子上有一个盘子,最多允许存放两个水果。父亲只放苹果,母亲只放橘子;女儿只吃苹果,儿子只吃橘子。用信号量P,V写出父亲、母亲、女儿、儿子的同步算法

增加互斥信号量mutex=1

父亲father

father(){while(1){P(empty);P(mutex);放入苹果;V(mutex);V(apple);}
}

母亲mother

mother(){while(1){P(empty);P(mutex);放入橘子;V(mutex);V(orange)}
}

女儿daughter

daughter(){while(){P(apple);吃苹果;V(empty);}
}

儿子son

son(){while(1){P(orange);吃橘子;V(empty);}
}

例题3:某小型超市,可容纳50人同时购物。入口处有篮子,每个购物者从入口处拿一只篮子进入购物。出口处结账(入口和出口是两个门),并归还篮子(出、入口禁止多人同时通过),用信号量P,V写出购物者的同步算法。

由题意可以看出该题中只有互斥操作。
信号量设置:(超市剩余空间)empty=50,(入口)mutex1=1,(出口)mutex2=1

购物者shopper

shopper(){while(1){P(empty);        /*这里的P操作可以理解成请求,申请一个空闲区域*/P(mutex1);从入口进入,取一只篮子;		/*入口只能一个人通过,该动作执行的过程中,不允许其他进程进入*/V(mutex1);购物;P(mutex2);从入口出去,放下篮子;V(mutex2);V(empty);		/*这里的V操作可以理解成归还,释放一个空闲区域*/}
}

例题4:
在这里插入图片描述

信号量设置:
(停车的信号量)stop=0,(开门的信号量)door=0

/*司机*/
driver(){while(1){P(door);启动车辆;正常行驶;到站停车;V(stop);}
}
/*售票员*/
conductor(){while(1){关门;		/*售票员先关门,司机才能启动车辆*/V(door);售票;P(stop);开门;}
}

二、哲学家进餐问题

  • 有五个哲学家围坐在圆桌旁,桌子中央放着火锅,每人面前有一只空盘子,每两人之间放一只筷子。
  • 每个哲学家的行为是思考,感到饥饿,然后吃火锅。
  • 为了吃火锅,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子。

在这里插入图片描述

设chopstick[5]为5 个信号量,初值均为1

philosopheri:while(1){思考;P(chopstick[i]);P(chopstick[(i+1)%5]);吃火锅;V(chopstick[i]);V(chopstick[(i+1)%5]);
}

为防止死锁发生可采取得措施:

  1. 最多允许4个哲学家同时去拿起左边得筷子。
  2. 仅当一个哲学家左右两边得筷子都可用时,才允许他拿筷子。
  3. 给所有哲学家编号,奇数号得哲学家必须首先拿起左边的筷子,偶数号得哲学家则相反。

三、读者——写者问题

  • 有两组并发进程:读者和写者,共享一组数据区
  • 要求:(1)允许多个读者同时执行读操作(2)不允许读者、写者同时操作(3)不允许多个写者同时操作

读者——写者问题的问题分析:

  1. 读者和写者、写者和写者之间即写者与其他进程之间互斥访问数据区。
  2. 读者与读者可以同时访问,设置一个整型信号量readcount表示正在读的进程数目,该变量是可被多个读进程访问的临界资源。
  3. 设wmutex用于读者和写者、写者和写者之间的互斥;
  4. 设rmutex用于对readcount这个临界资源的互斥访问。
  • wmutex用于读者和写者、写者和写者之间的互斥
  • readcount表示正在读的读者数目
  • rmutex用于对readcount这个临界资源的互斥访问
  • 设有两个信号量wmutex=1,rmutex=1
  • 另设一个全局变量readcount=0
/*读者*/
while(1){P(rmutex);readcount++;if(readcount==1)P(wmutex);V(rmutex);读;P(rmutex);readcount--;if(readcount==0)V(wmutex);V()
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/485308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【剑指offer】面试题39:数组中出现次数超过一半的数字

数组中有一个数字出现的次数超过数组长度的一半&#xff0c;请找出这个数字。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 代码&#xff1a; class Solution { public int majorityElement(in…

2020年度全球人工智能十大事件

该文章内容转载自战略前沿技术当前&#xff0c;新一代人工智能技术在全球蓬勃兴起&#xff0c;迅猛发展&#xff0c;与大数据、区块链、5G等新技术相互融合、相互因应&#xff0c;为经济社会发展尤其是数字经济发展注入新动能&#xff0c;正在深刻改变社会生产生活方式。与此同…

一头扎进sql之多表操作

一、多表查询时NULL值处理 要求返回比"allen"工资低的所有员工select a.ename,a.conn from emp a where a.conn < (select b.conn from emp b where b.ename allen) ; 正确的写法应该是select a.ename,a.conn from emp a where coalesce(a.conn,0) < (se…

当贝叶斯,奥卡姆和香农一起来定义机器学习

来源&#xff1a;数学中国【导读】当贝叶斯、奥卡姆和香农一起给机器学习下定义&#xff0c;将统计学、信息理论和自然哲学的一些核心概念结合起来&#xff0c;我们便会会发现&#xff0c;可以对监督机器学习的基本限制和目标进行深刻而简洁的描述。令人有点惊讶的是&#xff0…

eclipse中下载spring-tool-suite插件遇到的问题

eclipse中下载spring-tool-suite插件遇到的问题 我的eclipse的版本4.7.0&#xff0c;接下来以下载我的eclipse的对应STS版本3.8.4为例&#xff0c;讲一下遇到的问题。不同版本的eclipse对应不同的spring-tool-suite&#xff0c;具体的版本对应可以去其他的博客中寻找&#xff…

python - 内置函数

enumerate 将一个可迭代/可迭代对象变成enumerate类型 利用for循环可以对enumerate类型获得索引和值 1 lis (星期一, 星期二, 星期三, 星期四, 星期五, 星期六, 星期七) 2 ret enumerate(lis, 1) # enumerate 可以接受第二个参数&#xff0c; 用于指定索引起始值 3 4 fo…

【剑指offer】面试题40:最小的k个数(java)

输入整数数组 arr &#xff0c;找出其中最小的 k 个数。例如&#xff0c;输入4、5、1、6、2、7、3、8这8个数字&#xff0c;则最小的4个数字是1、2、3、4。 示例 1&#xff1a; 输入&#xff1a;arr [3,2,1], k 2 输出&#xff1a;[1,2] 或者 [2,1] 示例 2&#xff1a; 输入…

MicroPython (一)点亮我的Led

工具 &#xff1a; puttyF429Discovery 开发板Notepad注意&#xff1a;不知道为什么 其他的终端工具有问题&#xff0c;推荐 putty 基本没有发现问题 putty 实时调试 使用putty 打开USB 虚拟串口&#xff0c;我们打开可以使用help()方法寻求帮助输入help()如下所示 help() Welc…

2021年,AI有潜力改善农业的十种路径

来源&#xff1a;Forbes作者&#xff1a;Louis Columbus编译&#xff1a;科技行者普华永道指出&#xff0c;基于物联网的农业&#xff08;IoTAg&#xff09;监控已经成为联网智能农业领域发展最快的技术领域&#xff0c;市场总额到2025年预计将增长至45亿美元。根据BI Intellig…

计算机组成原理——总线系统总结

计算机组成原理——总线系统总结 一、总线的概念&#xff1a; 总线是构成计算机系统放入互联机构&#xff0c;是多个系统功能部件之间进行数据传送的公共通路。借助于总线连接&#xff0c;计算机在各个系统功能部件之间实现地址、数据和控制信息的交换&#xff0c;并在争用资…

【剑指offer】面试题42:连续子数组的最大和(java)

输入一个整型数组&#xff0c;数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。 示例1: 输入: nums [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大&#xff0c;为 6。 提示…

科学家打造全套人工神经系统 帮助瘫痪病人重新控制身体

Photo: Nathaniel Welch来源&#xff1a; IEEE电气电子工程师Motion Restored: Luke Tynan, who was paralyzed in 2017 by a spinal cord injury, demonstrates the wearable system that enables him to control his arm and hand. Sensors on the arm register his intentio…

存储器容量扩展——位扩展、字扩展

存储器&#xff08;二&#xff09;——存储容量扩展 前言&#xff1a;&#xff08;基本概念&#xff09; 存储空间&#xff1a;CPU决定存储器&#xff1a;用户需求决定&#xff08;4G&#xff0c;8G&#xff09;&#xff08;8G的存储器1各芯片能否完成用户需求&#xff1f;如…

海明码构造及纠错

计算机组成原理——海明码的构造及纠错 海明码&#xff08;又称为汉明码&#xff09;是具有一位纠错能力的编码。 信息位&#xff1a;发送用户端想要发送的信息序列&#xff0c;彼此独立&#xff0c;互不相关&#xff0c;最终交给接收端。 检测位&#xff1a;为了使信息码元产…

【剑指offer】面试题43:1~n整数中1出现的次数

输入一个整数 n &#xff0c;求1&#xff5e;n这n个整数的十进制表示中1出现的次数。 例如&#xff0c;输入12&#xff0c;1&#xff5e;12这些整数中包含1 的数字有1、10、11和12&#xff0c;1一共出现了5次。 示例 1&#xff1a; 输入&#xff1a;n 12 输出&#xff1a;5 …

潭州Java中级班(day_05)

1.掌握数字的使用2.掌握数字的声明以及内存分配3.通过数字的简单范例加深对数字的操作原理4.掌握多维数组的定义和使用 数组 数组是一组相关变量的集合&#xff0c;一个数组实际上就是一连串的变量一维数组 二位数组 int i[100] 表示一个伪代码&#xff0c;只是代表含义 一维数…

机器学习对抗攻击是一颗“定时炸弹”

来源 | AI前线作者 | Ben Dickson译者 | Sambodhi策划 | 刘燕随着机器学习的迅速普及&#xff0c;科技界必须制定一份保证人工智能系统免遭对抗攻击的路线图。否则&#xff0c;对抗机器学习将会是一场灾难。如果你一直在关注有关人工智能的新闻&#xff0c;你可能已经听说过或看…

操作系统基本特性——并发、共享、虚拟、异步

操作系统的基本特性——并发、共享、虚拟、异步 前言&#xff1a;操作系统&#xff08;Operating System&#xff0c;OS&#xff09;是配置在计算机硬件上的第一层软件&#xff0c;是对硬件系统的首次扩充。主要作用是管理好这些设备&#xff0c;提高它们的利用率和吞吐量&…

【剑指offer】面试题45:把数组排成最小的数

输入一个正整数数组&#xff0c;把数组里所有数字拼接起来排成一个数&#xff0c;打印能拼接出的所有数字中最小的一个。 示例 1: 输入: [10,2] 输出: "102" 示例 2: 输入: [3,30,34,5,9] 输出: "3033459" 提示: 0 < nums.length < 100 说明: …

ASP.NET MVC 扩展HtmlHelper类为 js ,css 资源文件添加版本号

写在前面 在项目部署当中会需要更新 css 文件或 js 等资源文件&#xff0c;为了避免由于浏览器缓存的原因无法加载新的 css 或 js &#xff0c;一般的做法是在资源文件的后面加上一个版本号来解决&#xff0c;这样浏览器就会去服务器下载新的资源文件。 如果某个 css 文件被多个…