旌旗灯号量:整型、记载型旌旗灯号量以及应用旌旗灯号量完成过程互斥和前驱关系

旌旗灯号量机构是一种功用较强的机制,可用来处理互斥与同步的成绩,它只能被两个规范的原语wait(S)和signal(S)来拜访,也可以记为“P操作”和“V操作”。
原语是指完成某种功用且不被联系不被中缀履行的操作序列,平日可由硬件来完成完成不被联系履行特征的功用。如前述的“Test-and-Set”和“Swap”指令,就是由硬件完成的原子操作。原语功用的不被中缀履行特征在单处置机时可由软件经过屏障中缀办法完成。
原语之所以不克不及被中缀履行,是由于原语对变量的操作进程假如被打断,能够会去运转另一个对统一变量的操作进程,从而呈现临界段成绩。假如可以找到一种处理临界段成绩的元办法,就可以完成对共享变量操作的原子性。

整型旌旗灯号量

整型旌旗灯号量被界说为一个用于表现资本数量的整型量S,wait和signal操作可描绘为:

			wait(S){ while (S<=0); S=S-1; } signal(S){ S=S+1; }

wait操作中,只需旌旗灯号量S<=0,就会不时地测试。因而,该机制并未遵照“让权等候” 的原则,而是使过程处于“忙等”的形态。

记载型旌旗灯号量

记载型旌旗灯号量是不存在“忙等”景象的过程同步机制。除了需求一个用于代表资本数量的整型变量value外,再添加一个过程链表L,用于链接一切等候该资本的过程,记载型旌旗灯号量是因为釆用了记载型的数据构造得名。记载型旌旗灯号量可描绘为:

			typedef struct{ int value; struct process *L; } semaphore;

响应的wait(S)和signal(S)的操作如下:

			void wait (semaphore S) { //相当于请求资本 S.value--; if(S.value<0) { add this process to S.L; block(S.L); } }

wait操作,S.value--,表现过程恳求一个该类资本,当S.value<0时,表现该类资本已分派终了,因而过程应挪用block原语,停止自我壅塞,保持处置机,并拔出到该类资本的等候队列S.L中,可见该机制遵照了“让权等候”的原则。

			void signal (semaphore S) { //相当于释放资本 S.value++; if(S.value<=0){ remove a process P from S.L; wakeup(P); } }

signal操作,表现过程释放一个资本,使零碎中可供分派的该类资本数增1,故S.value++。若加1后仍是S.value<=0,则表现在S.L中仍有等候该资本的过程被壅塞,故还应挪用wakeup 原语,将S.L中的第一个等候过程叫醒。

应用旌旗灯号量完成同步

旌旗灯号量机构能用于处理过程间各类同步成绩。设S为完成过程P1、P2同步的公共旌旗灯号量,初值为0。过程P2中的语句y要运用过程P1中语句x的运转后果,所以只要当语句x履行完成之后语句y才可以履行。其完成过程同步的算法如下:

			semaphore S = 0; //初始化旌旗灯号量 P1 ( ) { // … x; //语句x V(S); //通知过程P2,语句乂曾经完成 } P2()){ // … P(S) ; //反省语句x能否运转完成 y; // 反省无误,运转y语句 // … }

应用旌旗灯号量完成过程互斥

旌旗灯号量机构也能很便利地处理过程互斥成绩。设S为完成过程Pl、P2互斥的旌旗灯号量,因为每次只许可一个过程进入临界区,所以S的初值应为1(即可用资本数为1)。只需把临界区置于P(S)和V(S)之间,即可完成两过程对临界资本的互斥拜访。其算法如下:

			semaphore S = 1; //初化旌旗灯号量 P1 ( ) { // … P(S); // 预备开端拜访临界资本,加锁 // 过程P1的临界区 V(S); // 拜访完毕,解锁 // … } P2() { // … P(S); //预备开端拜访临界资本,加锁 // 过程P2的临界区; V(S); // 拜访完毕,解锁 // … }

互斥的完成是分歧过程对统一旌旗灯号量停止P、V操作,一个过程在胜利地对旌旗灯号量履行了 P操作落后入临界区,并在加入临界区后,由该过程自身对该旌旗灯号量履行V操作,表现以后没有过程进入临界区,可以让其他过程进入。

应用旌旗灯号量完成前驱关系

旌旗灯号量也可以用来描绘程序之间或许语句之间的前驱关系。图2-8给出了一个前驱图,个中S1, S2, S3, …, S6是最复杂的程序段(只要一条语句)。为使各程序段能准确履行,应设置若干个初始值为“0”的旌旗灯号量。例如,为包管S1 -> S2、 S1 -> S3的前驱关系,应辨别设相信号量a1、a2。异样,为了包管 S2 -> S4、S2 ->S5、S3 -> S6、S4 -> S6、S5 -> S6,应设相信号量bl、b2、c、d、e。


图2-8 前驱图举例

完成算法如下:

			semaphore al=a2=bl=b2=c=d=e=0; //初始化旌旗灯号量 S1() { // … V(al); V(a2) ; //S1曾经运转完成 } S2() { P(a1); //反省S1能否运转完成 // … V(bl); V(b2); // S2曾经运转完成 } S3() { P(a2); //反省S1能否曾经运转完成 // … V(c); //S3曾经运转完成 } S4() { P(b1); //反省S2能否曾经运转完成 // … V(d); //S4曾经运转完成 } S5() { P(b2); //反省S2能否曾经运转完成 // … V(e); // S5曾经运转完成 } S6() { P(c); //反省S3能否曾经运转完成 P(d); //反省S4能否曾经运转完成 P(e); //反省S5能否曾经运转完成 // …; }

剖析过程同步和互斥成绩的办法步调

1) 关系剖析。找出成绩中的过程数,而且剖析它们之间的同步和互斥关系。同步、互斥、前驱关系直接依照下面例子中的经模范式改写。
2) 整顿思绪。找出处理成绩的症结点,而且依据做过的标题找出处理的思绪。依据过程的操作流程肯定P操作、V操作的大致次序。
3) 设相信号量。依据下面两步,设置需求的旌旗灯号量,肯定初值,完美整顿。

时间: 2024-10-19 07:38:21

旌旗灯号量:整型、记载型旌旗灯号量以及应用旌旗灯号量完成过程互斥和前驱关系的相关文章

数据表示字面量整型字面量

数据表示字面量整型字面量 编写程序,首先面对的是数据.在程序中,数据该如何表示出来?根据表示的方式不同,数据通常有两种表示方式:直观表示和指代表示.本章将详细讲解这两种表示方式本文选自明明白白学C#大学霸. 1.1  数据的直观表示--字面量 在代码编写中,数据往往是可以直接写到代码中的.对于这些数据,人们可以通过字面所表达的意思,获知其含义,所以它们也被称为字面量.字面量也叫常量.根据字面量所代表的数据内容,分为数字字面量和文本字面量.本节将先讲解数字字面量本文选自明明白白学C#大学霸. 根据

Python基本数据类型之整型和布尔型

整型和布尔型 获取对象的数据类型 1.type() 2.dir() 3.help() 4.在pycharm里面的操作 数字类型 int 创建: int() 接收数字字符串 .bit_lenght() int类型的长度 布尔类型 bool 获取对象的数据类型 1.type() 查看对象的数据类型 例子:(字符串) 1.s = "abc"2.print(type(s)) 结果: 1.<class 'str'> 2.dir() 查看对象对应类具备的所有方法 1.temp = &q

Android - SpannableString或SpannableStringBuilder以及string.xml文件中的整型和string型代替

背景介绍 在开发应用过程中经常会遇到显示一些不同的字体风格的信息犹如默认的LockScreen上面的时间和充电信息.对于类似的情况,可能第一反应就是用不同的多个TextView来实现,对于每个TextView设置不同的字体风格以满足需求. 这里推荐的做法是使用android.text.*;和 android.text.style.*;下面的组件来实现RichText:也即在同一个TextView中设置不同的字体风格.对于某些应用,比如文本编辑,记事本,彩信,短信等地方,还必须使用这些组件才能达到

c语言整型和字符型的自动类型转换

char a = -1; //机器码为0xff unsigned char b = 254; //机器码0xfe if (a <= b){ printf("a <= b\n"); } else{ printf("a > b\n"); } 上述代码输出结果: a > b 赋值用机器码写入内存 虽然我们以十进制为两个变量赋值,但是变量值在内存中是以二进制机器码的形式存在.如果十进制数是负数,它就以补码的形式存放在内存中.比如"a = -

以php中的自增自自减运算符操作(整型,浮点型,字符串型,布尔型,空类型)数据

1 // 环境 2 // 3 // php版本 4 // PHP 7.0.33-0+deb9u1 (cli) (built: Dec 7 2018 11:36:49) ( NTS ) 5 // Copyright (c) 1997-2017 The PHP Group 6 // Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies 7 // with Zend OPcache v7.0.33-0+deb9u1, Copyrig

【sqli-labs】 less27 GET- Error based -All you Union&amp;Select Belong to us -String -Single quote(GET型基于错误的去除了Union和Select的单引号字符串型注入)

看一下过滤函数 看一下/s是什么东西 那直接通过大小写就可以绕过了 http://192.168.136.128/sqli-labs-master/Less-27/?id=0'%a0uNion%a0sElect%a01,2,%273 原文地址:https://www.cnblogs.com/superkrissV/p/8371847.html

【sqli-labs】 less28 GET- Error based -All you Union&amp;Select Belong to us -String -Single quote with parenthesis(GET型基于错误的去除了Union和Select的单引号带括号字符串型注入)

这个不是基于错误的吧,看源码可以知道错误并没有输出 那就使用;%00和order by试一下 http://192.168.136.128/sqli-labs-master/Less-28/?id=1')%a0order%a0by%a03;%00 http://192.168.136.128/sqli-labs-master/Less-28/?id=1')%a0order%a0by%a04;%00 http://192.168.136.128/sqli-labs-master/Less-28/?

Sql注入的分类:数字型+字符型

Sql注入: 就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.通过构造恶意的输入,使数据库执行恶意命令,造成数据泄露或者修改内容等,以达到攻击的目的.主要是由于应用程序对用户的输入没有进行严格的过滤而造成的. 一.万能密码 在说sql注入分类之前,先来看一下万能密码的构成原理.万能密码是由于某些程序,通过采用判断sql语句查询结果的值是否大于0,来判断用户输入数据的正确性造成的.当查询之大于0时,代表用户存在,返回true,代表登

软件测试入门——测试模型(V型 W型 H型)

软件测试工程师称为“QA”,质量保证者——这是入门的第一点要学习的. 首先看基本的测试模型 1.“V”型 特点:[活动串行]这是一种古老的瀑布模型,反映了实际和测试之间的关系. 局限:仅仅把测试过程作为编码之后的一个阶段,忽视了测试对需求分析,系统设计的验证,如果前面设计错误,得一直到后期的验收测试才被发现,耗时耗力. 2.“W”型 特点:[活动串行]测试与开发同时进行,在V模型的基础上,增加了在开发阶段的同步测试 局限:仍然不支持迭代,减少了一定错误发生率,但是需按照流水线进行设计.编码和测试