计算机操作系统进程同步(信号量pv专题)

news2024/9/22 7:23:31

文章目录

  • 一 基本概念
    • 1.1 多道程序中的制约关系
    • 1.2 临界资源(Critical Resouce)
    • 1.3 三区:进入区、临界区、退出区
  • 二 同步机制应遵循的原则
  • 三 信号量机制类型
    • 3.1 整型信号量
    • 3.2 记录型信号量
    • 3.3 AND型信号量
    • 3.4 信号量集
  • 四 信号量的应用
    • 4.1 信号量实现进程互斥
    • 4.2 信号量实现前趋关系 (同步关系)
    • 4.3 信号量控制使用资源进程数量(资源管控)

一 基本概念

1.1 多道程序中的制约关系

  • 间接制约关系(进程互斥):源于资源共享。如,共享打印机
  • 直接制约关系(进程同步):源于进程间的合作。如,输入进程和计算进程

下列活动分别属于哪种制约关系?
(I)使用共享单车;(2)打篮球;
(3)流水线生产的各道工序;(4)商品生产和社会消费
1、2为间接制约关系3、4为直接制约关系

1.2 临界资源(Critical Resouce)

  • 在一段时间内只允许一个进程访问的资源,即仅当一个进程访问完并释放该资源后,才允许另一个进程访问的资源。如打印机、 磁带机、共享变量等,都属于临界资源,诸进程间应采取互斥方式,实现对这种资源的共享。

1.3 三区:进入区、临界区、退出区

  • 进入区:在临界区前用于检查临界区是否被访问的标志的代码
  • 退出区:将临界区正被访问的标志恢复为未被访问的标志
  • 临界区:进程中访问临界资源的那段代码
    在这里插入图片描述
  • 若能保证诸进程互斥地进入自己的临界区,便可实现诸进程对临界资源的互斥访问。
  • 每个进程在进入临界区之前,应先对欲访问的临界资源进行检查,看是否正被访问,如果此刻该资源未被访问,便可进入临界区对该临界资源进行访问,并设置它正被访问的标志;如果此刻它正被访问,则本进程不能进入临界区。

二 同步机制应遵循的原则

  1. 空闲让进:当无进程处于临界区时,允许一个请求进入临界区的进程立即进入自己的临界区,以便有效地利用临界资源。
  2. 忙则等待:已有进程进入临界区时,其他试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。
  3. 有限等待:对要求访问临界资源的进程,应保证在有限的时间内能进入自己的临界区,以免陷入“死锁”状态
  4. 让权等待:当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”

三 信号量机制类型

  • 信号量(Semaphores)机制是一种卓有成效的进程同步工具
  • (信号量)是一种只能进行P操作和V操作的特殊变量
  • 对于两个并发进程,设互斥信号量为mutex,若mutex=0,则(表示有一个进程进入临界区)
  • 操作系统中,对信号量S的P原语操作定义中,使进程进入相应等待队列等待的条件是(S<0)

3.1 整型信号量

  • 最初由Dijkstra把整型信号量定义为一个用于表示资源数目的整型量S,它与一般整型量不同,除初始化外,仅能通过两个标准的原子操作wait(S)和signal(S)来访问,这两个操作一般称为P、V操作。
  • wait(s)和signal(s)是两个原子操作,在执行时是不可中断的。即,当一个进程在修改某信号量时,没有其他进程可以同时对该信号量进行修改
    wait(S){
       while(S<=0);
       S=S--;
    }
    signal(S){
      S=S++;
    }
    

  • 整型信号量的应用
    int s =1;
    Printer(){
        wait(s);
        print the document on the paper;
        signal(s);
    }
    

3.2 记录型信号量

  • 在信号量机制中,除了用于代表资源数目的整型变量value外,还应增加一个进程链表指针list,用于链接上述的所有等待进程。
  • 整型信号量机制中的wait操作,只要是信号量S≤O,就会不断地测试。因此,该机制并未遵循“让权等待”的准则,而是使进程处于“忙等”的状态。
  • **记录型信号量机制则是一种不存在“忙等”现象的进程同步机制.**采取“让权等待”的策略后,又会出现多个进程等待访问同一临界资源的情况。
    在这里插入图片描述
typedef struct
{
    int value ;
    struct process_control _block
}semaphore ;
  • S->value的绝对值表示在该信号量链表中已阻塞进程的数目
  • 如果S->value的初值为1,表示只允许一个进程访问临界资源,此时的信号量转化为互斥信号了,用于进程互斥

3.3 AND型信号量

  • 思想:将进程在整个运行过程中需要的所有资源,采取原子操作方式:要么全部分配给进程,要么一个也不分配
  • 解决:一个进程需要获得两个以上的资源需求
  • 为此,在wait操作中增加了一个“AND”条件,故称为AND同步,或称为同时wait操作,即Swait(simultaneouswait)
    在这里插入图片描述
    在这里插入图片描述

3.4 信号量集

  • 在记录型信号量机制中,wait(S)或signal(S)操作仅能对信号量施以加1或减1操作,每次只能对某类临界资源进行一个单位的申请或释放。当一次需要N个单位时,便要进行N次wait(S)操作,这显然是低效的,甚至会增加死锁的概率。
  • 对AND信号量机制加以改进,对进程所申请的所有资源以及每类资源不同的资源需求量,在一次P、V原语操作中完成申请或释放
    1. 进程对信号量Si的测试值不再是1,而是该资源的分配下限值ti,即要求Si≥ti,否则不予分配。
    2. 一旦允许分配,进程对该资源的需求值为di,即表示资源进行Si=Si-di操作,而不是简单的Si=Si-1操作
      在这里插入图片描述
      在这里插入图片描述

  • 特殊情况
    • wait(S,d,d):信号量集中只有一个信号量S,但允许它每次申请d个资源,当现有资源小于d时,不予分配
    • wait(S,1,1):等同于一般的记录型信号量(S>1)或互斥信号量(S=1)
    • wait(S,1,0):当S≥1时,允许多个进程进入某特定区;当S变为0后,阻止所有进程进入临界区。其功能类似于可控开关。

四 信号量的应用

4.1 信号量实现进程互斥

  • 为临界资源设置一个互斥信号量mutex,其初值为1
  • 各进程访问该资源的临界区置于wait(mutex)和signal(mutex)之间即可
    • wait(mutex)进入区
    • signal (mutex)退出区
  • mutex的取值为(-1,0,1):
    1. mutex=1:两个进程都未进入临界区;
    2. mutex=0:有一个进程进入临界区运行,另一个如需运行,必须等待,挂入阻塞队列;
    3. mutex=-1:有一个进程正在临界区运行,另一个进程因等待而阻塞在信号量队列中,需要被当前已在临界区运行的进程在退出时唤醒

在这里插入图片描述

  • 缺少signal(mutex)将会使临界资源永远不被释放,从而使因等待该资源而阻塞的进程不能被唤醒
  • wait(mutex)和signal(mutex)必须成对出现。缺少wait(mutex)将会导致系统混乱,不能保证对临界资源的互斥访问

栗子

  • 某交通路口设置了一个自动计数系统,该系统由“观察者”进程和“报告者”进程组成。观察者进程能识别卡车,并对通过的卡车计数;报告者进程定时将观察者的计数值打印输出,每次打印后把计数值清“0”。两个进程的并发执行可完成对每小时中卡车流量的统计。

第1步:搞清楚谁是临界资源计数值count
第2步:搞清楚哪些是临界区访问count的语句,包括累加、打印和清零

在这里插入图片描述

4.2 信号量实现前趋关系 (同步关系)

  • 设有两个并发执行的进程P1和P2。P1中有语句S1;P2中有语句S2
  • 使进程P1和P2共享一个公用信号量S,并赋予其初值为0,将signal(S)操作放在语句A后面,而在B语句前面插入wait(S)操作,即在进程P1中,用A→ signal(S)的顺序执行;在进程P2中,用wait(S)→B的顺序执行。由于S被初始化为0,若P2先执行必定阻塞,只有在进程P1执行完A和signal(S)操作后使S增为1时,P2进程方能成功执行语句B
    在这里插入图片描述
    在这里插入图片描述

4.3 信号量控制使用资源进程数量(资源管控)

  • 系统中有5台打印机可以使用,请使用进程同步机制使得最多可以有5个进程可以同时使用打印机,多于5个进程使用时,要对新申请进程进行阻塞。
    struct semaphore S;
    S.value=5 ;
    Printer{
         wait(S);
         print the document on the paper;
         signal(S);
    }
    

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

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

相关文章

Qt读取文件对比:每次获取自定义的长度和使用系统的API,耗时对比

0. 前言 在编程过程中&#xff0c;经常遇到文件读写操作&#xff0c;太频繁了。每次也都写的不一样。 突发奇想&#xff0c;想测试下几种不同的读取文件的效率。 测试以下三种方式读取文件效率&#xff1a; 自定义读取文件耗时使用QFile类API读取文件耗时使用QTextStream类AP…

黑马程序员Java项目实战《瑞吉外卖》,轻松掌握springboot + mybatis plus开发核心技术的真java实战项目——第四部分

黑马程序员Java项目实战《瑞吉外卖》&#xff0c;轻松掌握springboot mybatis plus开发核心技术的真java实战项目——第四部分 1. 套餐管理1.1 新增套餐1.1.1 添加菜品数据回显 1.2 保存添加套餐1.3 套餐信息分页查询1.4 删除套餐1.5 需要自己单独实现的功能1.5.1 套餐管理的启…

qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed

方法一&#xff1a; 如果是https&#xff0c;改为http。 方法二&#xff1a; Qt 解决qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed问题-CSDN博客 其他&#xff1a;

Elasticsearch零基础实战

分享后可优化点&#xff08;待完成&#xff09; java es8 查询如何打印查询入参 &#xff1f;&#xff08;直接执行的json&#xff09; es自定义分词器 如何实现&#xff1f; kibana 监控jvm分子分母是什么 &#xff1f; es如何 改索引结构&#xff1f; 修改数据原理 分享…

JDBC-数据库连接池(druid)

一、背景 在介绍JDBC基本概念中&#xff0c;似乎Java程序每次与数据库交互都要通过驱动创建一个新的连接对象&#xff08;Connection&#xff09;&#xff0c;再由连接对象创建一个可执行SQL的Statement对象&#xff08;或PreparedStatement对象&#xff09;&#xff0c;操作完…

海康威视摄像头+服务器+录像机配置校园围墙安全侦测区域入侵侦测+越界侦测

一、适用场景 1、校园内&#xff0c;防止课外时间翻越围墙到校外、从校外翻越围墙到校内&#xff1b; 2、通过服务器摄像头的侦测功能及时抓图保存&#xff0c;为不安全因素提供数字化依据&#xff1b; 3、网络录像机保存监控视频&#xff0c;服务器保存抓拍到的入侵与越界&am…

学习笔记16——操作系统

学习笔记系列开头惯例发布一些寻亲消息&#xff0c;感谢关注&#xff01; 链接&#xff1a;https://www.mca.gov.cn/lljz/indexdetail.html?idd0afa7f6f36946319a206d61937f9b63&type0&t10.11199120579373845 八股——操作系统一些基础知识整理 一个java程序对应一个…

腾讯云com域名注册1元一年,非常可以!

腾讯云com域名注册优惠价格1元首年&#xff0c;条件是企业新用户&#xff0c;个人新用户注册com域名是33元首年&#xff0c;第二年续费价格85元一年。活动 txybk.com/go/domain-sales 活动打开如下图&#xff1a; 腾讯云com域名注册优惠价格 腾讯云com域名注册原价是85元一年&a…

*4.3 CUDA MEMORY TYPES

CUDA设备包含几种类型的内存&#xff0c;可以帮助程序员提高计算到全局内存的访问率&#xff0c;从而实现高执行速度。图4.6显示了这些CUDA设备内存。全局内存和恒定内存出现在图片的底部。主机可以通过调用API函数来写入&#xff08;W&#xff09;和读取&#xff08;R&#xf…

PHP反序列化漏洞利用及修复,示例代码讲解

您提到的PHP反序列化漏洞是一个重要的网络安全问题。在我的网络安全工程师的角色下&#xff0c;我可以提供关于此问题的深入分析。 PHP反序列化漏洞通常发生在当不可信的数据被反序列化时。序列化是将数据结构或对象状态转换为可存储或可传输的格式的过程&#xff0c;而反序列…

快速幂算法总结

知识概览 快速幂可以在O(logk)的时间复杂度之内求出来的结果。 例题展示 快速幂 题目链接 活动 - AcWing 系统讲解常用算法与数据结构&#xff0c;给出相应代码模板&#xff0c;并会布置、讲解相应的基础算法题目。https://www.acwing.com/problem/content/877/ 代码 #inc…

机器学习 前馈神经网络

人工神经网络&#xff08;Artificial Neural Network&#xff0c;ANN&#xff09;是指一系列受生物学和神经科学启发的数学模型&#xff0e;这些模型主要是通过对人脑的神经元网络进行抽象&#xff0c;构建人工神经元&#xff0c;并按照一定拓扑结构来建立人工神经元之间的连接…

一文讲透使用Python绘制双纵轴线图

双纵轴线图主要用来展示两个因变量和一个自变量的关系&#xff0c;并且两个因变量的数值单位不同。具体来说&#xff0c;双纵轴线图是指在一幅图上有一个横轴和两个纵轴&#xff0c;适用于三个变量。两个纵轴分别表示一个变量&#xff0c;横轴变量同时适用于两个纵轴上的变量&a…

Selenium-java元素等待三种方式

第二种方式需要写在创建driver时的代码下面 第三种则是对每个定位元素进行配置

Linux基础知识总结

目录 一、Linux权限设置 更改文件属性 chgrp - 更改文件属组 chown - 更改文件所有者&#xff0c;也可以同时更改文件所属组。 chmod - 更改文件属性 二、Linux文件与目录管理 处理目录的常用命令 ls&#xff08;list files&#xff09;- 列出目录及文件名 cd&#xff…

【Linux】Linux系统编程——Linux命令解析器

【Linux】Linux系统编程——Linux命令解析器 什么是Linux 命令解析器&#xff1f; Linux 命令解析器&#xff0c;通常被称为 shell&#xff0c;是 Linux 操作系统中的一个关键组件。它充当用户和系统内核之间的接口&#xff0c;允许用户通过输入命令来控制和管理操作系统和应…

【Spring Cloud】关于Nacos配置管理的详解介绍

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Spring Cloud》。&#x1f3af;&#x1f3af; &am…

Java面试汇总——redis篇

1、什么是缓存穿透 ? 怎么解决 ? 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存就形同虚设&#xff08;只有数据库查到了&#xff0c;才会让redis缓存&#xff0c;但现在的问题是查不到&#xff09;&#xff0c;会频繁的去访问数据库。 解决…

关键字:package关键字

在 Java 中&#xff0c;package关键字用于组织和管理类文件。它将类文件分组到不同的包中&#xff0c;以提供更好的代码组织和可读性。 以下是package关键字的用法&#xff1a; 1.package语句&#xff1a;在 Java 源代码的开头使用package关键字来声明当前类所属的包。例如&a…

基于yolov5的PCB板缺陷检测(附有详细步骤通俗易懂版)

PCB板缺陷检测 模型训练 在初学的时候&#xff0c;可能不太了解到底模型训练是个什么流程&#xff0c;到底是什么意思。其实也很简单&#xff0c;就是我们用一个框架&#xff08;如pytorch&#xff0c;tensorflow等&#xff09;通过一定的算法如yolov5&#xff0c;对一定的数…