当前位置: 首页 > news >正文

操作系统---进程的同步和互斥(易错知识点梳理)

目录

1.S.value()

2.互斥机制要遵循的原则

3.Peterson算法

4.互斥信号量与同步信号量

5.可重入代码

6.P/V操作和管程

7.并发进程的执行


本节对应知识点:

进程的同步与互斥

1.S.value()

S.value()出现在记录型信号量中,用来记录资源的数目

//记录型信号量

typedef struct{

        int value;

        struct process *L;        //用于链接所有等待该资源的进程

}semaphore;

//wait/P操作

void wait(semaphore){

        S.value--;

        if(S.value<0){

                add.this process to S.L;

                block(S.L);

        }

}

//signal/V操作

void signal(semaphore s){

        S.value++;

        if(S.value<=0){

                remove a process P from S.L;

                wakeup(P);

        }

}

1.对信号量S执行P操作后,使该进程进入资源等待队列的条件是()

A. S.value<0        B.S.value<=0        C.S.values>0        D. S.value >=0

① S.value>0,表示某类可用资源的数量。每次P操作,意味着请求分配一个单位的资源。

② S.value<=0,表示某类资源已经没有,或者说还有因请求该资源而被阻塞的进程,S.value的绝对值表示等待进程数目

若S.value=0,表示这类资源已经没有。① 某进程进行P操作后,S.value--,则S.value<0,所以该进程进入等待队列。② 某进程进行P操作前,没有进行S.value--,则S.value<=0,该进程进入等待队列。

答案:A

① 同理,当S.value<0时,表示有进程在等待资源。执行V操作后,S.value++,若此时S.value<=0,表示有进程等待资源,此时就会唤醒S.L队列中的第一个进程(阻塞-->就绪)

2.互斥机制要遵循的原则

实现临界区互斥必须遵循:"忙则等待",“空闲让进”,"有限等待",不一定需要"让权等待"。若未满足"让权等待",则会出现"忙等"。

(1)记录型信号量

像上面所说的"记录型信号量"就满足了"让权等待"。当执行S.value--后,S.value<0,表示该资源已经分配完毕,此时会调用block原语进行自我阻塞(运行-->阻塞),主动放弃CPU,并插入该类资源的等待队列。

(2)整型信号量

整型信号量没有遵循"让权等待":

wait(S){
        while(S<=0);

        S=S-1;

        }
        signal(S){
               S=S+1;

        }

在整型信号量机制中的 wait 操作,只要信号量 S≤0,就会不断循环测试。未遵循“让权等待”的准则,而是使进程处于“忙等”的状态,即一直占用CPU执行while循环。

(3)硬件实现方法

硬件实现方法中的TSL和Swap指令都不能遵循"让权等待”,等待进入临界区的进程会占用CPU执行while循环。

TSL指令和swap指令并没有处于阻塞态的进程,等待进入临界区的进程一直停留在执行while循环中,不会主动放弃CPU,一直处在运行态,直到该进程的时间片用完放弃处理机,转为就绪态,此时切换另一个就绪态的进程占用处理机(就绪--->运行)。

(4)软件实现方法

•单标志法:

两个进程必须交替进入临界区,若P0顺利进入临界区并从临界区离开,则此时临界区是空闲的,但P1并没有进入临界区的打算,而turn=1一直成立,就无法再次进入临界区。没有遵循“空闲让进”。

•双标志先检查法:

先检查对方标志,再设置自己的标志,这两个操作无法一气呵成,若“检查对方标志后”和“设置自己标志前”进行进程切换,双方都通过检查,则会同时进入“临界区”,没有遵循“忙则等待”。

•双标志后检查法:
两个进程依次设置自己的标志,并依次检查对方的标志,发现对方也想进入临界区,双方都争着进入临界区,结果谁也进不了,违背“空闲让进”准则,于是因各个进程都长期无法访问临界区而导致“饥饿”现象(违背“有限等待”准则)

•Peterson算法:

因为等待进入临界区的进程会占用CPU执行while循环,所以没有遵循“让权等待”原则

3.Peterson算法

为了防止两个进程为进入临界区而无限期等待,设置了变量turn,表示允许进入临界区的编号,每个进程在先设置自己的标志后再设置turn 标志,允许另一个进程进入。这时,再同时检测另一个进程状态标志和允许进入标志,就可保证当两个进程同时要求进入临界区时只一个进程进入临界区。若双方试图同时进入临界区,保存的是较晚的一次turn赋值,虽然前一个turn的赋值也会执行,但是会被后一个turn赋值覆盖。因此较晚的进程等待,较早的进程进入。先到先入,后到等待,从而完成临界区访问的要求。

但他没有遵循“让权等待”原则,上面说了。

Peterson算法能保证进程互斥地进入临界区,不会出现“饥饿”现象。

4.互斥信号量与同步信号量

互斥信号量:

互斥信号量的初值一般设置为1,表示临界区只允许一个进程进入。P操作成功则将其减1,禁止其他进程进入;V操作成功则将其加1,允许等待队列中的一个进程进入。互斥量的绝对值表示在临界区外等待进入的进程数。

同步信号量:

与互斥信号量初值一般置1不同,用PV操作实现进程同步时,信号量的初值应根据具体情况来确定。若期望的消息尚未产生,则对应的初值应设为0;若期望的消息已存在,则信号量的初值应设为一个非0的正整数。

1.一个系统中共有5个并发进程涉及某个相同的变量 A,变量A的相关临界区是由()个临界区构成的。

答案:5

临界区是指访问临界资源A的那段代码(临界区的定义)。那么5个并发进程共有5个操作共享变量 A的代码段。

2.若有4个进程共享同一程序段,每次允许3个进程进入该程序段,若用P,V操作作为同步机制,则信号量的取值范围是( )。

A. 4,3,2,1,-1        B. 2,1,0,-1,-2        C. 3,2,1,0,-1        D. 2,1,0,-2,-3

信号量取值:

3:没有进程进入该程序段;2:有1个进程进入;1:有2个进程进入;0:有3个进程进入;-1:有3个进程进入,并有一个进程在等待进入。

答案:C

3.设与某资源关联的后号量初值为 3,当前值为 1。若 M表示该资源的可用个数,N表示等待该资源的进程数,则M,N分别是()

A.0,1        B.1,0        C.1,2        D.2,0

信号量麦示相关资源的当前可用数量。当信号量K>0时,表示还有个相关资源可用,所以该资源的可用个数是1。而当信号量K<0时,表示有|K|个进程在等待该资源。由于资源有剩余,可见没有其他进程等待使用该资源,因此进程数为0。

答案:B

5.可重入代码

若代码可被多个进程在任意时刻共享,则要求任意一个进程在调用此段代码时都以同样的方式运行;而且进程在运行过程中被中断后再继续执行,其执行结果不受影响。这必然要求代码不能被任何进程修改,否则无法满足共享的要求。这样的代码就是可重入代码,也称纯代码,即允许多个进程同时访问的代码。

共享资源:

① 互斥共享资源就是临界资源,一次可供一个进程使用,如:公用队列,打印机等。

② 不互斥的共享资源,如可重入代码,磁盘等。

非共享资源:

如:私有数据等。

6.P/V操作和管程

P/V操作:

P/V操作时一种低级的进程通信原语,由两个不可被中断的过程组成。

管程:

管程将对共享资源的操作封装起来,管程内的共享数据结构只能被管程内的过程所访问。一个进程只有通过调用管程内的过程才能进入管程访问共享资源

P/V信号量和管程条件变量的比较:

相似点:条件变量的wait,signal操作类似于信号量的P/V 操作,可以实现进程的阻塞/唤醒。

不同点:条件变量是“没有值”的,仅实现了“排队等待”功能;而信号量是“有值”的,信号量的值反映了剩余资源数,而在管程中,剩余资源数用共享数据结构记录。

例如,信号量机制中的V操作一定会改变信号量的只S=S+1,而管程中的signal操作是针对某个条件变量的,若不存在因该条件变量阻塞的进程,则signal不会产生任何影响。

7.并发进程的执行

1.进程P1和P2均包含开发执行的线程,部分伪代码描述如下所示。

下列选项中,需要互斥执行的操作是()

A.a=1与a=2        B.a=x与b=x        C.x+=1与x+=2        D.x+=1与x+=3

A:a是线程内部的局部变量,不需要互斥访问。

D:不同进程的线程代码段,不存在互斥访问的问题。

B:对进程内部的共享变量x的读操作,不互斥也不影响执行结果,所以不需要互斥访问。

C:不同线程对同一个进程内部的共享变量的写操作,需要互斥访问(类似于读者-写者问题)。

所以:需要进行互斥的操作是对临界资源的访问,不同线程对同一个进程内部的共享变量的访问才可能需要进行互斥。

2.有两个并发执行的进程P1和进程 P2,共享初值为1的变量x,P1对x加1,P2对x减1,加1和减1操作的执行指令序列如下:

两个操作完成后,x的值:()

A.可能为-1或3        B.只能为1        C.可能为0,1或2        D.可能为-1,0,1或2

① P1进程最初取到的值可能为1或0(P2进程完成后更新得到的x值0),那么P1进程最终写入x的值为1+1(2)或0+1(1)

② 同理,P2进程最初取到的值可能为1或2(P1进程完成后更新得到的x值2),那么P2进程最终写入x的值为1-1(0)或2-1(1)

最终的x值可能是0、1或2

答案:C

3.属于同一进程的两个线程thread1和 thread2并发执行,共享初值为0的全局变量x。thread1和thread2 实现对全局变量x加1的机器级代码描述如下。

在所有可能的指令执行序列中,使x的值为2的序列个数是()

A.1        B.2        C.3        D.4

x=2,只可能是先执行线程thread1再执行线程 thread2,或先执行线程thread2再执行线程 thread1这两种可能。

答案:B

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 银行小额支付系统的全面解析
  • jQuery Mobile 实例:构建响应式移动网页的实践指南
  • 【Javascript】微信小程序项目结构目录详解
  • 鸿蒙 arkts 实现手机号中间四位隐藏, 可以使用 substring [ 简单适用新手 ]
  • RedHat运维-Linux存储管理基础4-LVM的相关减小操作
  • 服务攻防——中间件Jboss
  • 1.认识微服务
  • HackTheBox--BoardLight
  • 1.DDR3 SO-DIMM 内存条硬件总结
  • 【C语言】<常量> 之群英荟萃
  • 2024年全面导入APS系统:提升工厂生产效率的策略
  • EDI安全:如何在2024年保护您的数据免受安全和隐私威胁
  • 一起学Hugging Face Transformers(14)- “自定义训练循环”问题解答
  • JVM:字节码文件
  • 刷题——输出二叉树的右视图
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • angular2开源库收集
  • CentOS 7 修改主机名
  • HTML5新特性总结
  • JAVA SE 6 GC调优笔记
  • Java方法详解
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • JS 面试题总结
  • Node 版本管理
  • 大数据与云计算学习:数据分析(二)
  • 关于 Cirru Editor 存储格式
  • 数据科学 第 3 章 11 字符串处理
  • k8s使用glusterfs实现动态持久化存储
  • 阿里云API、SDK和CLI应用实践方案
  • ​io --- 处理流的核心工具​
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #1014 : Trie树
  • #AngularJS#$sce.trustAsResourceUrl
  • $forceUpdate()函数
  • $L^p$ 调和函数恒为零
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (C++17) std算法之执行策略 execution
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (二)原生js案例之数码时钟计时
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (小白学Java)Java简介和基本配置
  • (学习总结16)C++模版2
  • (转)c++ std::pair 与 std::make
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • ./configure、make、make install 命令
  • @javax.ws.rs Webservice注解
  • @WebServiceClient注解,wsdlLocation 可配置
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)