【操作系统】进程管理——信号量机制(个人笔记)

学习日期:2024.7.9

内容摘要:信号量机制,用信号量实现进程的同步与互斥


信号量机制

信号量的概念

在上节内容中,我们学习了进程互斥的软件和硬件解决方案,但这些方案都有各自的问题,双标志法都因为检查和上锁两个步骤不能一气呵成,会导致两个进程一起进入临界区,而Peterson算法和几个基于硬件实现方式的方法虽然解决了这些问题,但这些方法都会导致忙等。

1965年,荷兰科学家Dijkstra(就是《数据结构》图论那位)提出了一种实现进程同步、互斥的方法——信号量机制。

信号量其实就是一个变量(可以是一个整数,也可以是更复杂的数据结构的变量),可以用一个信号量来表示系统中某种资源的数量,比如系统只有一台打印机,就可以设置一个初始值为1的信号量。

用户进程可以通过操作系统提供的一对原语来对信号量进行操作,从而很方便的实现进程互斥和同步。

一对原语:wait(S)原语和signal(S)原语,信号量S是函数调用时传入的一个参数,而wait和signal两个原语常简称为P,V操作(来自荷兰语proberen和verhogen),简写为P(S)和V(S)

整型信号量

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

例:假如某系统中有一台打印机,初始化整型信号量S,S=1。P操作是占用资源,S=S-1,V操作是释放资源,S=S+1,每次调用之前先判断S的值,如果S>=1,就P一次,否则等待。

逻辑很简单,就是用S来计数,因为用了原语实现检查和上锁一气呵成,避免了并发、异步导致的问题。

缺点:还是要利用while结果循环等待,不满足“让权等待”原则,没有解决忙等问题。

记录型信号量(重点)

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

假如S=2,每次进行一次P操作,S.value--,每次执行一次V操作,S.value++,如果P操作后小于0,进程阻塞,当S为负时,S.value的绝对值就是正在等待资源的进程的数目

P操作中一定是先S.value--,之后如果S<0再block;V操作中一定是先S.value++,之后如果S.value<=0再wakeup。注意理解原因

S.value的初始值表示系统中某种资源的数目,S.value++后<=0,说明有进程在等待资源,因此调用wakeup原语唤醒等待队列中的第一个进程(被唤醒进程从阻塞态转换为就绪态)。

S.value==0,资源恰好分配完,S.value==-x,有x个进程正在等待资源。

因为在资源不足时,进程会使用block原语自我阻塞,主动放弃处理机,所以遵循了让权等待原则,不会出现忙等

用信号量机制实现进程的同步与互斥

一个信号量对应一种资源,信号量的值=这种资源的剩余数量(信号量的值如果小于0,说明有进程在等待这个资源,绝对值即为等待的进程数)

信号量机制实现进程互斥

1.分析并发进程的关键活动,划分临界区

2.设置互斥信号量mutex,初始值为1,对不同的临界资源要设置不同的互斥信号量

3.在进入区P(mutex),申请资源

4.在退出区V(mutex),释放资源

注意:P,V操作必须要成对出现,申请资源和释放资源一定会成对出现。

信号量机制实现进程同步

知识回顾:进程同步:让各并发的进程按照某种我们期望的顺序推进。

1.分析什么地方需要同步关系,即分析需要“一前一后”的两个(或更多)操作

2.设置同步信号量S初始值为0

3.在“前操作”之后执行V(S)

4.在“后操作”之前执行P(S)

比如说两个进程A,B,我们希望A先执行,B后执行。此时S代表一个信号,即A已经完成的信号。在A执行完之后,释放信号在B执行之前,检查信号。简记为“前V后P,前后后前

如果先执行到B,因为会先进行P(S)操作,此时S--后S=-1,表示此时没有可用资源,因此P操作中会执行block原语,进程会进入阻塞队列。当执行完A之后,S++,此时S>=0,就会在V操作中执行wakeup原语,唤醒B进程,这样就实现了按我们期望的顺序推进进程。


感谢您看到这里,如果满意的话麻烦您点个赞支持一下,个人主页还有更多内容分享。

内容总结自王道计算机考研《操作系统》 和 人民邮电出版社《操作系统导论》

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

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

相关文章

【自用】【高昆轮概率论与数理统计笔记】2.1 分布函数的概念与性质

不定期更新&#xff0c;前面的章节会在学完后补回来&#xff0c;重新学学概率&#xff0c;当年考研考的数学二&#xff0c;没有概率基础&#xff0c;想自己补补&#xff0c;视频课是高昆轮老师讲的浙大四版概率论教材的视频课&#xff0c;地址&#xff1a; 第一章&#xff1a;h…

数据库MySQL---基础篇

存储和管理数据的仓库 MySQL概述 数据库相关概念 数据库&#xff08;DataBase&#xff09;---数据存储的仓库&#xff0c;数据是有组织的进行存储 数据库管理系统&#xff08;DBMS&#xff09;-----操纵和管理数据库的大型软件 SQL----操作关系型数据库的编程语言&#xff…

Python:安装/Mac

之前一直陆陆续续有学python&#xff01;今天开始&#xff01;正式开肝&#xff01;&#xff01;&#xff01; 进入网站&#xff1a;可能会有点慢&#xff0c;多开几个网页 https://www.python.org 点击下载&#xff0c;然后进入新的页面&#xff0c;往下滑 来到File&#xff0…

实时温湿度监测系统:Micropython编码ESP32与DHT22模块的无线数据传输与PC端接收项目

实时温湿度监测系统 前言项目目的项目材料项目步骤模拟ESP32接线连接测试搭建PC端ESP32拷录环境对ESP32进行拷录PC端搭建桌面组件本地数据接收桌面小组件部分 实验总结 前言 人生苦短&#xff0c;我用Python。 由于我在日常工作中经常使用Python&#xff0c;因此在进行该项目…

基于java+springboot+vue实现的校园二手书交易平台(文末源码+Lw)287

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自…

Vue中v-for和v-if优先级(2、3)

Vue中v-for和v-if优先级&#xff08;2、3&#xff09; Vue2 在Vue2当中,v-for优先级要优于v-if,也就是说&#xff0c;当它俩同时沿用时&#xff0c;v-for先遍历&#xff0c;v-if再判断。 Vue2源码位置 \vue-dev\src\compiler\codegen\index.js export function genElement…

如何构建数据驱动的企业?爬虫管理平台是关键桥梁吗?

一、数据驱动时代&#xff1a;为何选择爬虫管理平台&#xff1f; 在信息爆炸的今天&#xff0c;数据驱动已成为企业发展的核心战略之一。爬虫管理平台&#xff0c;作为数据采集的第一站&#xff0c;它的重要性不言而喻。这类平台通过自动化手段&#xff0c;从互联网的各个角落…

windows的远程桌面连接docker

1. Docker容器中运行远程桌面服务 (RDP)&#xff1a;您的Docker容器需要安装和运行远程桌面服务。通常&#xff0c;远程桌面服务在Windows操作系统上可用。如果您使用的是Linux容器&#xff0c;则需要安装一个支持RDP协议的桌面环境和RDP服务器。 2. 开放RDP端口&#xff1a;通…

什么是RPC?有哪些RPC框架?

定义 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种允许运行在一台计算机上的程序调用另一台计算机上子程序的技术。这种技术屏蔽了底层的网络通信细节&#xff0c;使得程序间的远程通信如同本地调用一样简单。RPC机制使得开发者能够构建分…

【常见开源库的二次开发】一文学懂CJSON

简介&#xff1a; JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式。它基于JavaScript的一个子集&#xff0c;但是JSON是独立于语言的&#xff0c;这意味着尽管JSON是由JavaScript语法衍生出来的&#xff0c;它可以被任何编程语言读取和生成…

Django 实现子模版继承父模板

背景 Django的占位符&#xff0c;如果不继承父模板的内容&#xff0c;会被子模版所覆盖&#xff0c;有些业务场景子模版也需要使用到父模板中的内容 可以使用Django自带的标签{% block super %}来实现此效果 base.html 最基础html&#xff0c;相当于第一层html&#xff0c;bl…

代码随想录算法训练营day76 | Floyd 算法精讲、A * 算法精讲

本次题目来自于卡码网 ​​97. 小明逛公园 &#xff08;Floyd 算法精讲&#xff09; 1、确定dp数组以及下标的含义 grid[i][j][k] m&#xff0c;表示 节点i 到 节点j 以[1...k] 集合为中间节点的最短距离为m 2、确定递推公式 分两种情况&#xff1a; 节点i 到 节点j 的最…

01 | 基础架构:一条SQL查询语句是如何执行的?

此系列文章为极客时间课程《MySQL 实战 45 讲》的学习笔记&#xff01; 引言 在了解 SQL 查询语句如何执行之前&#xff0c;先了解下MySQL 的基本架构示意图。 MySQL 分为 Server 层和引擎层。 Server 层包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 M…

微球无菌筛分技术的巅峰之作:纳维加特PV系列

在医药行业中&#xff0c;对微球的制备和筛分要求极高&#xff0c;纳维加特&#xff08;Navector&#xff09;凭借其自主创新的PV系列微球无菌旋振筛&#xff0c;成功突破这一领域的技术壁垒。该产品不仅拥有高效率、高精度的筛分能力&#xff0c;同时还兼顾了高卫生级别的要求…

uniapp自动升级

一、创建云服务空间&#xff08;https://unicloud.dcloud.net.cn&#xff09; 云空间用于关联需要版本控制升级的项目&#xff0c;如果已拥有云空间则省略此步骤。 二、搭建 uni升级中心 - 后台管理系统&#xff08;升级中心 uni-upgrade-center - Admin&#xff09; uni-adm…

Linux调试器-gdb使用以及Linux项目自动化构建工具-make/Makefile

目录 1.gdb背景2.开始使用gdb3.make/makefile 背景4.实例代码5.依赖关系6.依赖方法7.原理8.项目清理 1.gdb背景 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 要使用gdb调试&#xff0c;必须在源代码生…

c++的makeFile怎么做

makeFile30分钟 1 介绍&#xff08;makeFile是什么&#xff0c;30分钟入门搞懂&#xff09;2 为什么要用makeFile3 如何制作makeFile文件&#xff1f;4 参考 makeFile真的很简单&#xff0c;不要想的一下子全都学懂了&#xff0c;先入门了&#xff0c;然后在实践中去使用&#…

Apache部署与配置

概述 介绍 Apache HTTP Server(简称Apache)是Apache的一个开源的网页服务器&#xff0c;它源自NCSAhttpd服务器&#xff0c;并经过多次修改和发展&#xff0c;如今已经成为全球范围内广泛使用的Web服务器软件之一 特点 跨平台&#xff1a;可以运行在几乎所有广泛使用的计算机平…

36 特殊类设计

类&#xff0c;不能被拷贝 拷贝只会放生在两个场景中&#xff1a;拷贝构造函数以及赋值运算符重载&#xff0c;因此想要让一个类禁止拷贝。 c98 将拷贝构造函数与赋值云悬浮重载只声明不定义&#xff0c;并且将其访问权限设置为私有 class CopyBan{// ...private:CopyBan(co…

Apache中使用SSI设置

先停服务在修改httpd.conf&#xff0c;备份下 Apache\Apache24\conf 设置httpd.conf LoadModule ssl_module modules/mod_ssl.so 取消该命令前的注释符# AddType text/html .shtml AddOutputFilter INCLUDES .shtml 取消该命令前的注释符# 加入html AddType text/html .…