8 操作系统第二章 进程管理 信号量 PV操作 用信号量机制实现 进程互斥、同 步、前驱关系

文章目录

      • 1 信号量机制
          • 1.1 整形信号量
          • 1.2 记录形信号量
          • 1.3 信号量机制小结
      • 2 用信号量机制实现进程互斥、同 步、前驱关系
          • 2.1 信号量机制实现进程互斥
          • 2.2 信号量机制实现进程同步
          • 2.3 信号量机制实现前驱关系
          • 2.4 信号量机制实现进程互斥、同 步、前驱关系小结

1 信号量机制

  • 用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步。
  • 信号量其实就是一个变量 ,可以用一个信号量来表示系统中某种资源的数量,比如:系统中只有一台打印机,就可以设置一个初值为1的信号量。
  • 原语是一种特殊的程序段,其执行只能一气呵成,不可被中断。原语是由关中断/开中断指令实现的。
  • 软件解决方案实现临界区的互斥主要问题是由“进入区的各种操作无法一气呵成”,因此如果能把进入区、退出区的操作都用“原语”实现,使这些操作能“一气呵成”就能避免问题。

一对原语:wait(S)原语和signal(S) 原语,可以把原语理解为我们自己写的函数,函数名分别为waitsignal,括号里的信号量S其实就是函数调用时传入的一个参数。
wait、signal原语常简称为P、V操作。因此常把 wait(S)、signal(S)两个操作分别写为P(S)、V(S)

1.1 整形信号量

用一个整数型的变量作为信号量,用来表示系统中某种资源的数量。

int S = 1;        //初始化整形信号量s,表示当前系统中,某种可用资源数
wait(S){          //wait原语,相当于“进入区”while(S<=0);   //若资源数不够用,则一直循环等待S=S-1;        //若资源够用,则占用一个资源}
signals(S){       //signals原语,相当于“退出区”S=S+1;        //使用完资源后,在退出区释放资源} 

整形信号量:

  • “检查”和“上锁”一气呵成, 避免了并发、异步导致的问题
  • 存在的问题:不满足“让权等待” 原则,会发生“忙等”
1.2 记录形信号量

整型信号量的缺陷是存在“忙等”问题,因此人们又提出了“记录型信号量”,即用记录型数据结构表示的信号量。

/*记录型信号量的定义*/
typedef struct {int value;              //剩余资源数struct process *L;      //等待队列
} semaphore

若某个进程需要使用资源时,通过wait原语申请:

void wait( semaphore S){  //相当于申请资源S.value--;if(S.value<0){bolck(S.L) //如果剩余资源数不够,使用block原语使进程从运行态进入阻塞态,并把挂到信号量S的等待队列(即阻塞队列)中}
}

进程使用完资源后,通过signal原语释放:

void signal ( semaphore S ){   //相当于释放资源s.value++;if(S.value<=0){wakeup(S.L);//释放资源后,若还有别的进程在等待资源,则使用wakeup原语唤醒等待队列中的一个进程,该进程从阻塞态变为就绪态}
}

说明:

  • S.value的初值表示系统中某种资源的数目。
  • 对信号量S的一次P操作意味着进程请求一个单位的该类资源,因此需要执行S.value--,表示资源数减1,当S.value<0时表示该类资源已分配完毕,因此进程应调用block原语进行自我阻塞(当前运行的进程从运行态变成阻塞态),主动放弃处理机,并插入该类资源的等待队列S.L中。可见,该机制遵循了“让权等待”原则, 不会出现“忙等”现象。
  • 对信号量S的一次V操作意味着进程释放一个单位的该类资源,因此需要执行S.value++,表示资源数加1, 若加1后仍是S.value<=0,表示依然有进程在等待该类资源,因此应调用wakeup原语唤醒等待队列中的第一个进程(被唤醒进程从阻塞态变成就绪态)。
1.3 信号量机制小结

在这里插入图片描述

信号量的值=这种资源的剩余数量(信号量的值如果小于0,说明此时有进程在等待这种资源)
P(S)——申请一个资源S,如果资源不够就阻塞等待
V(S)——释放一个资源S,如果有进程在等待该资源,则唤醒一个进程

2 用信号量机制实现进程互斥、同 步、前驱关系

2.1 信号量机制实现进程互斥

思想步骤:

  1. 分析并发进程的关键活动,划定临界区(如:对临界资源打印机的访问就应放在临界区)
  2. 设置互斥信号量mutex,初值为1
  3. 在进入区P(mutex)——申请资源
  4. 在退出区V(mutex)——释放资源

代码实现:

/*记录型信号量定义*/
typedef struct {int value;            //剩余资源数struct process *L;    //等待队列
}  semaphore;/*信号量机制实现互斥*/semaphore  mutex=1;     //初始化信号量P1(){...P(mutex);           //使用临界资源前需要加锁临界区代码段...V(mutex);          //使用临界资源后需要解锁...
}P2(){...P(mutex);          //使用临界资源前需要加锁临界区代码段...V(mutex);          //使用临界资源后需要解锁...
}

注意问题:

  1. 要会自己定义记录型信号量,但 如果题目中没特别说明,可以把信号量的声明简写成“semaphore mutex=1;”这种形式
  2. 对不同的临界资源需要设置不同的互斥信号量。
  3. P、V操作必须成对出现。缺少P(mutex)就不能保证临界资源的互斥访问。缺少V(mutex)会导致资源永不被释放,等待进程永不被唤醒。
2.2 信号量机制实现进程同步

进程同步:要让各并发进程按要求有序地推进。

比如,P1、P2并发执行,由于存在异步性,因此二者交替推进的次序是不确定的。
在这里插入图片描述
若P2的“代码4”要基于P1的“代码1”和“代码2”的运行结果才能执行,那么我们就必须保证“代码4”一定是在“代码2”之后才会执行。
这就是进程同步问题,让本来异步并发的进程互相配合,有序推进。

思想步骤:

  1. 分析什么地方需要实现“同步关系”,即必须保证“一前一后”执行的两个操作(或两句代码)
  2. 设置同步信号量S,初始为0
  3. 在“前操作”之后执行V(S)
  4. 在“后操作”之前执行P(S)

技巧口诀:前V后P

代码实现:
以下代码保证了P2进程中代码4一定是在P1进程中代码2之后执行:

/*信号量机制实现同步*/
semaphore  S=0;     //初始化同步信号量,初始值为0P1(){代码1;代码2;V(S);代码3}
P2(){P(S);代码4;代码5;代码6}

注意问题:

  1. semaphore S=0理解:信号量S代表“某种资源”,刚开始是没有这种资源的。P2需要使用这种资源, 而又只能由P1产生这种资源
  2. 若先执行到V(S)操作,则S++S=1。之后当执行到P(S)操作 时,由于S=1,表示有可用资源,会执行S--,S的值变回0,P2进程不会执行block原语,而是继续往下执行代码4
  3. 若先执行到P(S)操作,由于S=0S--S=-1,表示此时没有 可用资源,因此P操作中会执行block原语,主动请求阻塞。 之后当执行完代码2,继而执行V(S)操作,S++,使S变回0, 由于此时有进程在该信号量对应的阻塞队列中,因此会在V 操作中执行wakeup原语,唤醒P2进程。这样P2就可以继续执行代码4了
2.3 信号量机制实现前驱关系

思想步骤:
其实每一对前驱关系都是一个进程同步问题(需要保证一前一后的操作) :

  1. 要为每一对前驱关系各设置一个同步信号量
  2. 在“前操作”之后对相应的同步信号量执行V操作
  3. 在“后操作”之前对相应的同步信号量执行P操作

进程P1中有句代码S1P2中有句代码S2P3中有句代码S3……P6中有句代码S6。这些代码要求按如下前驱图所示的顺序来执行:

  1. 要为每一对前驱关系各设置一个同步信号量
    在这里插入图片描述
  2. 在“前操作”之后对相应的同步信号量执行V操作,在“后操作”之前对相应的同步信号量执行P操作
    前V后P V→P
    在这里插入图片描述
    在这里插入图片描述
2.4 信号量机制实现进程互斥、同 步、前驱关系小结

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

一文掌握深度学习、神经网络和学习过程的历史

来源&#xff1a;算法与数学之美本质上&#xff0c;深度学习是一个新兴的时髦名称&#xff0c;衍生于一个已经存在了相当长一段时间的主题——神经网络。从20世纪40年代开始&#xff0c;深度学习发展迅速&#xff0c;直到现在。该领域取得了巨大的成功&#xff0c;深度学习广泛…

2022年后人工智能/深度学习八大应用方向

来源&#xff1a;电子工程专辑 人工智能、机器学习、深度学习已经成为当下最热门的前端科技之一。这三者其实是子-子集的关系。随着技术发展和应用的深入&#xff0c;深度学习越来越重要&#xff0c;成为AI的金字塔。本文总结了人工智能领域在2022年及以后数年内最热门的八大应…

多生产者-多消费者问题

文章目录1 问题描述2 问题分析3 代码实现4 分析总结1 问题描述 桌子上有一只盘子&#xff0c;每次只能向其中放入一个水果。爸爸专向盘子中放苹果&#xff0c;妈妈专向盘子中放橘子&#xff0c;儿子专等着吃盘子中的橘子&#xff0c;女儿专等着吃盘子中的苹果。只有盘子空时&am…

​Nat. Commun.速递:深度学习在计算生物学中的应用综述

来源&#xff1a;集智俱乐部作者&#xff1a;郭瑞东 审校&#xff1a;梁金 编辑&#xff1a;邓一雪摘要蛋白质结构预测是计算生物学中一个长达半个世纪的重大挑战&#xff0c;最近&#xff0c;深度学习在这方面取得了前所未有的进展。4月1日&#xff0c;一项发表在 Nature Comm…

吸烟者问题

文章目录1 问题描述2 问题分析3 代码实现&#xff1a;1 问题描述 假设一个系统有三个抽烟者进程和一个供应者进程。每个抽烟者不停地卷烟并抽掉它&#xff0c;但是要卷起并抽掉一支烟&#xff0c;抽烟者需要有三种材料&#xff1a;烟草、纸和胶水。三个抽烟者中&#xff0c;第一…

无人驾驶出租车遭警察拦截后欲“潜逃”,AI 是原罪?

整理&#xff1a;苏宓出品&#xff1a;CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;所谓开车在路上&#xff0c;最讨厌的有几种人&#xff0c;一是插自己队和不让自己插队的&#xff0c;二想必就是晚上开远光灯和不开灯的。在交通交规下且汽车正常行驶过程中&#xff0…

人工智能,装在罐子里

来源&#xff1a;学术头条作者&#xff1a;Rich Heimann“装在罐子里的大脑”&#xff08;brain in a jar&#xff09;是一项对脱离身体、生活在一罐食物中的人类大脑进行的思想实验。这个思维实验探索了人类对现实、心灵和意识的概念。本文将探讨一个反对人工智能&#xff08;…

10 操作系统第二章 进程管理 死锁、死锁的处理策略 银行家算法

文章目录1 死锁1.1 死锁定义1.2 死锁、饥饿、死循环的区别1.3 死锁产生的必要条件1.4 什么时候会发生死锁1.5 死锁的处理策略1.6 死锁的概念小结2 死锁预防2.1 破坏互斥条件2.2 破坏不剥夺条件2.3 破坏请求和保持条件2.4 破坏循环等待条件2.5 预防死锁小结3 死锁避免3.1 安全序…

短期记忆容量必需有限

来源&#xff1a;CreateAMind介绍一篇论文&#xff1a;预测性大脑的短期记忆能力肯定是有限的短期保持信息的能力可能是人类认知的一个标志, 因为它是许多领域所需要的,如感知、行动计划和语言。没有大脑的这一核心功能,人类无法思考、推理或计算,甚至可能无法感知。尽管短期记…

读者-写者问题

文章目录1 问题描述2 问题分析3 代码实现1 问题描述 有读者和写者两组并发进程&#xff0c;共享一个文件&#xff0c;当两个或两个以上的读进程同时访问共享数据时不会产生副作用&#xff0c;但若某个写进程和其他进程&#xff08;读进程或写进程&#xff09;同时访问共享数据时…

9 操作系统第二章 进程管理 管程

文章目录1 管程1.1 为什么引入管程1.2 管程的定义和基本特征1.3 管程小结1 管程 1.1 为什么引入管程 产生原因&#xff1a;信号量机制存在的问题&#xff1a;编写程序困难、易出错 能不能设计一种机制&#xff0c;让程序员写程序是不需要再关注复杂的PV操作&#xff0c;使得代…

2021年世界科技进展100项

来源&#xff1a;三思派 作者&#xff1a;李万&#xff0c;钱娅妮1生命、生物、医药健康01新冠疫情1. 首次看清新冠患者体内蛋白质变化中国科学家分析出新冠肺炎死亡患者体内多器官组织样本中蛋白质分子病理全景图&#xff0c;相当于将医生在显微镜下看到的人体感染新冠病毒后细…

图灵奖获得者、信息安全常青树Adi Shamir:从密码学到AI对抗性样本研究|智源大会嘉宾风采...

来源&#xff1a;智源大会导读&#xff1a;RSA 算法是通信、金融产业中被广泛使用的安全基本机制&#xff0c;是信息时代的支柱技术。而在这个跨时代算法背后的设计者之一&#xff0c;正是密码学先驱 Adi Shamir。除了RSA 公钥密码算法以外&#xff0c;零知识证明、差分密码分析…

11 操作系统第三章 内存管理 内存的基本知识 内存管理 内存空间扩充 连续分配管理方式

文章目录1 内存概念1.1 内存作用1.2 逻辑地址VS物理地址1.3 装入的三种方式1.3.1 绝对装入1.3.2 可重定位装入1.3.3 动态重定位装入1.4 链接的三种方式1.4.1 静态链接1.4.2 装入时动态链接1.4.3 运行时动态链接1.5 内存的基础知识小结2 内存管理2.1 内存管理的任务2.2 内存保护…

Nature长文:打破AI黑盒的“持久战”

来源&#xff1a;大数据文摘2020年2月&#xff0c;随着 COVID-19在全球迅速传播且抗原检测难以获得&#xff0c;一些医生转向人工智能(AI)来尝试诊断病例。一些研究人员采用深度神经网络通过查看X射线和胸部计算机断层扫描(CT)扫描来快速区分患有COVID-19肺炎的人和未患肺炎的人…

12 操作系统第三章 内存管理 非连续分配管理方式 基本分页存储管理 基本分段存储管理 段页式存储管理

文章目录1 基本分页存储管理1.1 什么是分页存储1.2 重要的数据结构——页表1.3 基本地址变换机构1.4 具有快表的地址变换机构1.4.1 什么是快表&#xff08;TLB&#xff09;1.4.2 引入快表后&#xff0c;地址的变换过程1.4.3 地址变换过程小结1.5 两级页表1.5.1 单级页表存在的问…

13 操作系统第三章 内存管理 虚拟内存 请求分页管理方式 页面置换算法 页面分配策略

文章目录1 虚拟内存1.1 传统存储管理方式的特征、缺点1.2 局部性原理1.3 虚拟内存主要特征1.4 如何实现虚拟内存技术1.5 虚拟内存的基本概念小结2 请求分页管理方式2.1 页表机制2.2 缺页中断机构2.3 地址变换机构2.4 请求分页管理方式小结3 页面置换算法3.1 最佳置换算法 OPT3.…

视觉意识的主动推理模型

来源&#xff1a;CreateAMind论文介绍&#xff1a;在这里,我们旨在通过推进全球神经元工作区的扩展(预测性全球神经元工作区(PGNW))来克服这些限制,该工作区将 GNW 的基本方面与更近期的(贝叶斯)主动推理方法相结合,以理解大脑功能。具体来说,我们提出了一个基于主动推理的视觉…

14 操作系统第四章 文件管理 文件逻辑结构 文件目录结构

文章目录1 初识文件管理1.1文件属性1.2 文件内部的数据应该怎样组织起来&#xff1f;1.3 文件之间应该怎样组织起来&#xff1f;1.4 操作系统应该向上提供哪些功能&#xff1f;1.5 文件应如何存放在外存&#xff1f;1.6 文件系统总览2 文件逻辑结构2.1 文件分类2.2 顺序文件2.3…

AlphaFold 和 AI 蛋白质折叠革命的下一步是什么

来源&#xff1a;ScienceAI编辑&#xff1a;萝卜皮十多年来&#xff0c;分子生物学家 Martin Beck 团队一直在努力拼凑世界上最难的拼图游戏之一&#xff1a;人类细胞中最大分子机器的详细模型。这种被称为核孔复合体的庞然大物控制着分子进出细胞核的流动&#xff0c;也就是基…