操作系统7-信号量与管程

2023-11-13

回顾一下
并发问题:多线程并发导致资源竞争
同步概念:
---------1. 协调多线程对共享数据的访问
---------2.任何时刻只能由一个线程执行临界区代码
确保同步正确的方法
---------底层硬件支持
---------高层次的编程抽象(

信号量是锁机制在同一层上的高层抽象编程方法

一、 信号量semaphore

信号量是操作系统提供的一种协调共享资源访问的方法,用信号量表示系统资源的数量

  1. 信号是一种抽象数据类型,由一个整型(sem)变量和两个原子操作组成:
    1)P():sem减1,如sem<0,表示申请资源(减1)后没有资源了,需要等待
    2)V():sem加1,如sem<=0,即一个资源用完(加1)但还是小于0表示还有资源在等待,那么就唤醒一个等待进程
  2. 信号量是被保护的整数变量。初始化完成后就只能通过P()和V()操作来修改,并且由操作系统来保证PV操作时原子操作
  3. P可能由于没有资源而进入阻塞状态,但是V操作不会被阻塞
  4. 假定信号量实现的同步是公平的,线程不会被阻塞在P()操作中,并且信号量等待按先进先出

信号量的实现

class Semophore{
int sem;
WaitQueue q;
}
Semophore::P()
{
  sem--;//申请一个资源
  if(sem<0)//资源不够,要等待
  {
  Add this thread t to q;
  block(p);
}
Semophore::V()
{
  sem++;//释放一个资源
  if(sem <=0)//表明有进程在等待,唤醒等待进程
  {
   Removea thread t form queue q;
   wakeup(t);
   
  }
}

P() 和 V()的原子性由操作系统来保护的

信号量的使用

  1. 信号量可分为两种信号量——
    ① 二进制信号量:资源数目为0或1
    ② 资源信号量:资源数目为任何非负值
    这两种信号量等价,基于一个可以实现另一个

  2. 信号量的使用——
    互斥访问:临界区的互斥访问控制
    条件同步调度约束):线程间的事件等待

用信号量实现互斥访问

每类资源设置一个信号量,其初值为1

mutex = new Semaphore(1)//1

mutex ->P();//占用资源
Critical section;//进入临界区
mutex->V();//释放资源

信号量初始值设置为1,占用减1,当其他线程也想执行(进入临界区)就发现信号量已经非正,就必须得等待一个线程执行完释放资源

用信号量实现同步

用示意图来理解同步的问题,同步问题也是调度约束问题,下图可以理解问线程A需要的资源需等待线程B来释放(准备)
在这里插入图片描述条件同步设置一个信号量,其除值为0,当线程A开始运行时,调用了P,减1,资源数非正,就必须得等待,B执行,运行完V,加1,释放资源,线程A才能继续执行。就这样实现了同步

信号量解决“生产者-消费者问题”

  • 问题:
    · 一个或多个生产者产生数据并将数据放入缓冲区
    · 单个消费者每次从缓冲区取出数据
    · 在任何一个时刻只有一个生产者或消费者可以访问缓冲区

在这里插入图片描述

  • 问题分析:
    · 任何时刻只能由一个线程操作缓冲区(互斥访问)
    · 缓冲区空时,消费者必须等待生产者(条件同步)
    · 缓冲区满时,生产者必须等待消费者(条件同步)

  • 问题解决策略(用信号量描述每个约束
    · 二进制信号量mutex(保证互斥)
    · 资源信号量fullBuffers(条件同步,约束生产者)
    · 资源信号量emptyBuffers(条件同步,约束消费者)

  • 转换为实际代码

Class BuoudedBuffer
{
mutex = new Semaphore(1)//初始化的值很重要
fullBuffers = new Semaphore(0);//一开始是空的,消费者取不到值
emptyBuffers = new Semaphore(n);//一开始生产者可以往里面放n个数据
}
BoundeBuffer::Deposit(c)//把c放进去
{
   emptyBuffers->P();//空位要少一个
   mutex->P();//可以放,就进入临界区
   Add c to the buffer;
   mutex->V();//
   fullBuffers->V();//满一个
}
BoundedBuffer::Remove(c)
{
    fullBuffers->P();//有没有能让我移的,移走就少一个
    mutex->P();//进入临界区必走操作
    Remove c from buffer;
    mutex->V();
    emptyBuffers->V();//这个空位缓存的资源多一个了
}
总结:使用信号量比较困难
  1. 读/开发代码比较论难
  2. 容易出错,比如使用的信号量已经被另一个线程占用了或者忘记释放信号量等
  3. 不能够处理死锁问题

二、管程monitor

why moniter

改进信号量在处理临界区时候的一些麻烦,比如上述的生产者消费者问题中信号量是分散在生产者和消费者两个不同的进程中的,在这种情况下,PV操作的配对是比较困难的,我们试图将这些PV操作集合到一起,就是管程,也是并发程序的编程方法,为了支持这个操作,加了条件变量

how moniter

  1. 管程是一种用于多线程互斥访问共享资源的程序结构,采用面向对象方法,简化了线程间的同步控制,在任一时刻最多只有一个线程执行管程代码,与临界区的区别是:正在管程中的线程可临时放弃管程的互斥访问,等待事件出现时恢复
  2. 管程的使用:在对象/模型中,收集相关共享数据,定义方法来共享数据
  3. 管程的组成:一个锁用于控制管程代码的互斥访问,0个或多个条件变量(图中的x y condition),用于管理共享数据的并发访问,当条件变量为0时,管程其实就是临界区了
  4. 条件变量是管程内的等待机制:进入管程的线程因资源被占用而进入等待状态,每个条件变量表示一种等待原因,对应一个等待队列,附着两个相应的操作:
    1) wait()操作:将自己阻塞在等待队列中;唤醒一个等待者或释放管程的互斥访问
    2) signal()操作:将等待队列中的一个线程唤醒,如果等待队列为空,则等同于空操作在这里插入图片描述一开始所有进程在右上角的排队队列中,排队完后仅从wait操作,等到signal操作被唤醒后,执行这个进程的代码

管程的实现:

在这里插入图片描述
脚尖变量初始等待值是0——当要等待的时候进入等待序列,然后释放管程的互斥访问权,然后执行调度就可以切换到另外的进程或者线程了,等切换回自己的时候再再次地去请求管程地访问权限;释放时就从等待队列中挪出来再将等待进程数减1就ok

用信号量解决生产者-消费者问题

在这里插入图片描述
首先定义一个管程的lock,根据管程定义,只有一个线程才能进入管程,所以再管程头尾要开/解锁;第一个往缓冲区中放置数据:首先就要检查一下缓冲区是否满了还能不能再放了,如果检测到满了,那么就等在一个条件变量上,这边就等在notfull上,直到有空数据了,notfull响应了,才往下执行,即往缓冲区加数据,加上数据了,不空了,那么自然缓冲区的notEmpty也要响应。ok同理第二个Remove的操作,管程前后加锁保证互斥,如果缓冲区没数据,等候在notEmpty变量队列上,直到有数据再取出数据并响应notFull变量
由此可见,管程是将PV操作都集中到一个模块中,从而简化和降低同步机制的实现难度

管程中关于条件变量释放处理方式的两种方法

管程中条件变量到底是内部线程优先执行还是正占用管程处于执行状态的线程更优先

在这里插入图片描述
两个方法的区别就在于左边是虽然T1等待的事件已经出现了,但还是继续执行完再给T1,而右边,T1等待的事件一出现立即就放弃管程的互斥访问权,T1马上就开始执行,在T1执行结束后T2再继续执行。在真实OS中还是左边应用更多,更连续,少一次进程切换
对应代码;在这里插入图片描述
Hansen实际上和之前一样。之所以用while,是因为上图黄色线程必须等蓝色的完成后才会释放,所以说在队列的线程可能不是一个,都在抢线程;而Hoare方法,他是每signal一次,只有一个等待线程,于是用if。

总结:

基本的硬件操作是高层抽象的基础,采取不同的高层抽象的算法策略,可以实现临界区和管程等不同的并发编程策略

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操作系统7-信号量与管程 的相关文章

  • window系统消失的c盘,实际占用与显示占用相差好多G

    问题 C盘一直显示的红色提醒 我c盘实际占用的空间只有33 1GB 而我的c盘总共大小是59 9GB 显示的剩余大小是1 35GB 也就是说我占用了58 11 和c盘的总文件大小相差了25GB 那么消失的25GB去了哪里 我百度过这个问题
  • fork之后子进程到底复制了父进程什么

    fork之后子进程到底复制了父进程什么 发表于2015 4 3 9 54 08 2161人阅读 分类 操作系统 include
  • 终端连接控制(stty的编写)

    终端连接控制 stty的编写 一 背景 文件与目录在之前已经学习过了 文件中包含着数据 这些数据可以被读出 写入 也可以用以操作 但文件不仅仅是计算机唯一的数据来源 计算机的数据还可以来自于许多的外部设备 比如扫描仪 照相机 鼠标等输入设备
  • MySQL基础(非常全)

    MySQL基础 一 MySQL概述 1 什么是数据库 答 数据的仓库 如 在ATM的示例中我们创建了一个 db 目录 称其为数据库 2 什么是 MySQL Oracle SQLite Access MS SQL Server等 答 他们均是
  • 线程和进程的区别(面试必备)

    参考文章 https www jianshu com p 2dc01727be45 线程与进程的区别通俗的解释 https www jianshu com p 8ad441510860 附加可参考文章 https baijiahao bai
  • java调优总结

    JVM调优总结 序 几年前写过一篇关于JVM调优的文章 前段时间拿出来看了看 又添加了一些东西 突然发现 基础真的很重要 学习的过程是一个由表及里 再由里及表的过程 呵呵 所谓的 温故而知新 而真正能走完这个轮回的人 也就能称为大牛或专家了
  • 小白学协程笔记2-c语言实现协程-2021-2-10

    文章目录 前言 一 c语言中协程切换方式 二 使用setjmp 和 longjmp实现协程切换 1 setjmp和longjmp函数简介 2 协程实现 三 使用switch case实现协程切换 1 switch case小技巧 2 协程实
  • redis主从同步,总是显示master_link_status:down的解决方法

    前几天 在修改一台从节点的redis的监听端口后 重启了下redis 发现master link status 很长时间一直都是down状态 查看了redis日志 发现日志里出现很多的 I O error trying to sync wi
  • linux 如何创建卷组

    1 创建一个物理卷 Pvcreate dev sd1 dev sd2 dev sd3 dev sd4 2 用刚才创建的物理卷创建一个卷组 Vgcreate 卷组名 dev sd1 dev sd2 dev sd3 dev sd4 3 创建逻辑
  • Linux 磁盘与文件系统管理(鸟哥私房菜)

    本文来自 http vbird dic ksu edu tw linux basic 0230filesystem php 第八章 Linux 磁盘与文件系统管理 系统管理员很重要的任务之一就是管理好自己的磁盘文件系统 每个分割槽不可太大也
  • office2013 excel 打开时提示excel词典xllex.dll文件丢失或损坏

    今天打开Excel时 发现报错 xllex dll文件丢失或损坏 我用的是office2013 网上找了好多都是2007的dll文件 导入不了 于是乎重装office 问题解决 但还是把xllex dll烤出来做个备份吧 参考下面步骤即可
  • 《一个操作系统的实现》读书笔记-- 第一章--最小的“操作系统”

    一 最简单的 操作系统 最最简单的 操作系统 就是一个最最简单的引导扇区 Boot Sector 虽然它不具有任何功能 但是它却能够直接在裸机上运行 不依赖其他软件 一个引导扇区是512个字节 并且以0xAA55为结束标识的扇区 下面就是那
  • 程序员的自我修养——链接、装载与库

    1 温故而知新 操作系统概念 北桥 连接高速芯片 系统调用接口 以软件中断的方式提供 如Linux使用0x80号中断作为系统调用接口 多任务系统 进程隔离 设备驱动 直接使用物理内存的弊端 地址空间不隔离 内存使用效率低 程序运行的地址不确
  • Linux alien命令

    一 简介 alien是一个用于在各种不同的Linux包格式相互转换的工具 其最常见的用法是将 rpm转换成 deb 或者反过来 二 安装 http toutiao com a6188997768449360129 三 实例 http www
  • Linux 内核中的 Device Mapper 机制

    Linux 内核中的 Device Mapper 机制 尹 洋 在读博士生 尹洋 中科院计算所国家高性能计算机工程技术研究中心的在读博士生 主要从事服务部署和存储资源管理以及Linux块设备一级的开发和研究工作 简介 本文结合具体代码对 L
  • Ubuntu9.04太多乱码(中文不能正常显示)

    最近在使用Ubuntu9 04的过程中 发现有好多地方都出现乱码 其实是中文不能正常显示 现在把我所遇到的所有乱码问题集中一下 方便以后查阅参考 一 Flash乱码 在终端输入 sudo gedit etc fonts conf d 49
  • 磁盘调度算法笔记和练习题

    磁盘调度算法 先来先服务FCFS 最短寻道时间优先SSTF 扫描调度SCAN 练习题 先来先服务FCFS 最短寻道时间优先SSTF 扫描调度SCAN 它是一次只响应一个方向上的请求 这个方向上的请求都响应完了 再掉头处理另一个方向上的 有点
  • CentOS Linux服务器安全设置

    转自 http www osyunwei com archives 754 html 引言 我们必须明白 最小的权限 最少的服务 最大的安全 所以 无论是配置任何服务器 我们都必须把不用的服务关闭 把系统权限设置到最小话 这样才能保证服务器
  • 使用ShellJS提升你的开发效率(一)

    Shelljs Unix shell commands for Node js Shelljs是Node js下的脚本语言解析器 具有丰富且强大的底层操作 Windows Linux OS X 权限 Shelljs本质就是基于node的一层
  • 《OSPF和IS-IS详解》一1.7 独立且平等

    本节书摘来自异步社区 OSPF和IS IS详解 一书中的第1章 第1 7节 作者 美 Jeff Doyle 更多章节内容可以访问云栖社区 异步社区 公众号查看 1 7 独立且平等 OSPF和IS IS详解与TCP IP相比 OSI协议对各国

随机推荐

  • 使用selenium实现自动登录

    from selenium import webdriver import time driver webdriver Chrome 打开登录页面 url为要打开的地址 driver get url 最大化浏览器 driver maximi
  • 域名系统几类服务器,域名系统

    域名系统 编辑 定义 域名系统 简称为DNS Domain Name System 是因特网使用的命名系统 用来便于人们使用的机器名字转换为IP地址 域名系统其实也称为名字系统 只是更明确地指明这种系统是用在因特网中 域名系统的主要特点是在
  • HTTP请求接口方法(POST/GET)

    private static string HttpPost string Url string postDataStr HttpWebRequest request HttpWebRequest WebRequest Create Url
  • 【Python】matplotlib画散点图,并根据目标列的类别来设置颜色区间(含源代码及参数解释)

    最近在进行绘图时 遇到了matplotlib画散点图 并根据目标列的类别来设置颜色区间的问题 但是实现的过程较为艰辛 文章目录 一 数据准备 二 第一次尝试 失败及其原因 2 1 失败 2 2 原因 三 第二次尝试 成功 四 总结 plt
  • Nginx 重写功能(location / rewrite)

    这里写自定义目录标题 一 nginx rewrite概述 1 概述 2 Rewrite跳转场景 3 Rewrite跳转实现 4 Rewrite实际场景 二 Nginx常见模块 三 常见的Nginx正则表达式 1 正则的优势 2 正则的作用
  • shell 多个引号冲突_请教Linux shell命令中双引号与单引号嵌套的问题

    addr 192 168 0 111 echo addr 结果为 192 168 0 111 echo addr 结果为 addr 这两个我还可以理解 1 双引号内的单引号功能被关闭 反之亦然 2 双引号内的 功能被保留 单引号 addr
  • fatal: Authentication failed for ‘https://github.com

    记录在本地电脑建立与GitHub连接时遇到的错误 附上解决方案 git clone 遇到的错误 remote Support for password authentication was removed on August 13 2021
  • osx 常用defaults命令

    defaults命令用来对mac os x系统进行某些设置 常用命令 查看所使用的defaults命令 history grep defaults 分类查看defaults命令 history grep defaults write his
  • JavaScript数据结构——字典(Dictionary)

    概念和结构 字典里面的元素都是一个键 key 值 value 对 字典里面的元素的键 key 不能重复 值 value 可以重复 字典的操作 字典有八种常用操作 分别为 检查键是否存在 has key 添加元素 set key value
  • js 搜索模糊匹配

    searchvalue list keyWord if keyWord var reg new RegExp keyWord var arr for var i 0 i lt list length i if reg test list i
  • Java8-对List转换Map、分组、求和、过滤

    前言 在java8之后我们list转map再也不用循环put到map了 我们用lambda表达式 使用stream可以一行代码解决 下面我来简单介绍list转map的几种方式 和转为map后对map进行分组 求和 过滤等操作 正文 数据准备
  • C#实现百度地图附近搜索&调用JavaScript函数

    前一篇文章 C 调用百度地图API入门 解决BMap未定义问题 讲述了如何通过C 调用百度API显示地图 并且如何解决BMap未定义的问题 这篇文章主要更加详细的介绍百度地图的一些功能 包括附近搜索 城市搜索 路线规划 添加覆盖物等等 希望
  • ipv6的链路本地地址

    目录 简介 先决条件 要求 使用的组件 规则 配置 网络图 配置 验证 检验 OSPF 的配置 正在验证的链路本地地址可接通性 ping从远程网络的链路本地地址 直接ping从连接的网络的链路本地地址 相关信息 简介 本文目的将提供对在网络
  • Qt漂亮界面

    Qt漂亮界面 功能规划 一 去掉菜单栏和工具栏 二 顶部导航栏的设计 appinit h头文件 appinit cpp的文件 使用方式 三 阵列按钮的点击事件写法 四 重写缩写界面 放大界面和关闭程序事件 五 鼠标事件的处理 Qt大量同类控
  • mysql数据库内容导出,MySql数据库导出

    Navicat Premium Data Transfer Source Server 刘文鹏 Source Server Type MySQL Source Server Version 50540 Source Host 127 0 0
  • 关于X79主板至强E5 CPU安装ArchLinux的记录

    最近想在家里搭网站 打算弄两台服务器 一个是旧机器x79主板的 作为AI绘图和Chatglm部署用 一个新买的是带有N5095的小板子 装了CentOS7来当web服务器 当作前置服务器 主要为外网提供服务 装CentOS7比较简单容易 所
  • TransFusion:利用 Transformer 进行鲁棒性融合来进行 3D 目标检测

    Query 初始化 Input dependent 以往 Query 位置是随机生成或学习作为网络参数的 而与输入数据无关 因此需要额外的阶段 解码器层 来学习模型向真实对象中心移动的过程 论文提出了一种基于center heatmap 的
  • VC6.0使用教程

    使用之前我们先准备一段代码 include
  • C#将依赖的DLL文件集成到EXE内部

    使用场景 C 写的一些小程序 为了方便传播 减少传播文件数量 将依赖的DLL文件集成到EXE内部是必要的 解决方案 打开 管理NuGet程序包 在浏览中搜索 Costura Fody 点击 安装 按钮 等待下载依赖及安装完成 重新编译软件
  • 操作系统7-信号量与管程

    回顾一下 并发问题 多线程并发导致资源竞争 同步概念 1 协调多线程对共享数据的访问 2 任何时刻只能由一个线程执行临界区代码 确保同步正确的方法 底层硬件支持 高层次的编程抽象 锁 信号量是锁机制在同一层上的高层抽象编程方法 一 信号量s