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

操作系统-进程同步机制

同步机制准则

  • 空闲让进:若临界资源处于空闲状态,则应允许一个进程进入临界区访问临界资源
  • 忙则等待:若已有进程进入临界区访问临界资源,则其它需要访问临界资源的进程必须等待,以实现对临界资源的互斥访问
  • 有限等待:对临界资源进行等待的进程应在有限的时间内可以进入临界区,以免进入死等状态
  • 让权等待:若进程由于无法进入临界区而发生等待,则应立即释放处理器,以免陷入忙等(空循环)状态

信号量机制

1965年由荷兰学者提出,最常见的由三种信号量

整形信号量

将一个用于标识资源数量的整型数S作为信号量,该信号量只能通过两个标准的原子操作wait(s)和signal(s)来访问,这两个操作分别称为P、V(荷兰语Proberen表示尝试,Verhogen表示增加)操作,用法是:

  • 当一个进程需要申请一个资源时。可调用wait(S)操作,即P操作,表示减一操作
  • 当一个进程使用完一个资源后需要释放时,可调用signal(S)操作,即V操作 ,表示加一操作

在wait(S)操作时,只要没有可用资源,当前进程就会进入忙等状态,直至S>0时,才会对S进行减一操作,没有满足让权等待的同步机制准则

记录型信号量

使用记录型(结构体)数据结构作为信号量,解决了整形信号量中未遵循让权等待准则问题。

信号量结构体中有两个变量:整形信号value(为正时,表示资源数量,为负时的绝对值表示等待该资源的进程的数量);PCB的阻塞队列(由于缺少该资源而阻塞的进程组成的阻塞队列)

执行过程:

  • P操作:信号量的value减一,当value小于0,将该线程插入信号量结构体内的阻塞队列中
  • V操作:信号量的value加一,当value小于等与0,唤醒阻塞队列中的一个进程

AND型信号量

为了防止在请求资源较多时,产生死锁问题。

执行过程:

  • P操作:若所有资源都可用的情况下,将所有需要的资源信号数量减一,如果有不可用的资源,将这个进程放入第一个不可用资源的阻塞队列中
  • V操作:遍历每个资源,资源数量加一,如果这个资源有阻塞队列,则唤醒其中一个进程。

信号量集

AND型信号量,需要遍历多次执行PV操作,不仅低效,有产生死锁的风险。

  • 信号量集Swait(S1,t1,d1……Sn,tn,dn)t表示资源分配的下限,当S小于t时,将不予分配,发生阻塞;d表示在允许分配的前提下,下一次分配S的资源数量(单位)
  • 信号量集Ssignal(S1,d1……Sn,dn)表示一次释放d个S资源。

对于信号量集,需要注意以下几种特殊用法:

  • Swait(S1,1,1……Sn,1,1):其实就是AND型信号量的操作
  • Swait(S,1,1):其实就是记录型的操作
  • Swait(S,1,0):当资源S的数量小于1时发生阻塞,否则直接允许通过,一般用作开关

管程机制

信号量机制要求每个要访问临界资源的进程都必须自备同步PV操作。这不仅使得PV操作大量分散在了进程之中,而且如果使用不当(没有成对出现)就会导致系统死锁。

管程定义

管程是一种面向对象思想的体现。由一组共享数据结构及对这些数据的一组操作构成

管程结构

管程由四部分构成:

  • 管程名称:不同共享资源及不同的操作可以构成不同的管程,不同的管程对象具有不同的名称
  • 共享数据结构:这些共享数据结构是局部于管程之中的,用于描述共享资源
  • 一组操作:这组操作用于操作共享数据结构。进程访问共享资源,即共享数据结构,只能通过这组管程内的操作完成。对临界资源的互斥访问就是通过这组操作完成的
  • 初始化代码:是对局部与管程的共享数据进行初始化的代码,只在管程对象被创建时执行一次 

管程同步

管程由请求和释放共享资源的进程调用。通过管程机制可以实现进程间对共享资源(共享数据结构)的同步访问

  • 当某进程通过管程访问临界资源时,管程便调用条件x(共享资源)的wait原语cwait(x),若条件x未能满足,便使该进程阻塞,并将其排在条件x的阻塞队列上。
  • 当某进程通过管程访问完毕临界资源时,其同时会改变条件x,即调用条件x的signal原语csignal(x),从条件x阻塞队列中唤醒一个进程。 

经典进程同步问题

生产者-消费者问题

生产者-消费者问题是经典的合作制约关系的进程同步问题

问题描述:生产者与消费者具有一个公共缓冲池,该缓冲池中包含n个缓冲区,每个缓冲区可以存放一个数据。只要缓冲池中存在空缓冲区,生产者就可以将数据写入缓冲池,一旦缓冲池满,生产者就要停止生产;只要缓冲池中存在满缓冲区,消费者就可以从缓冲池中取走一条数据,一旦缓冲池空,消费者就要停止消费。

哲学家进餐问题

哲学家进餐问题是经典的互斥制约关系的进程同步问题

问题描述:由五个哲学家在同一张圆桌上用餐和思考。圆桌上为每个人配发了一只碗,但仅在他们的每个空隙中配发了一只筷子,即共只有五只筷子可用。要求他们交替进行用餐与思考。平时大家都在思考,当某个哲学家饥饿时会试图去取左右两边离他最近的筷子,只有拿到两只筷子时才能进餐,否则只能继续思考。进餐完毕,放下筷子开始思考。

读者-写者问题

读者写者问题是互斥制约与合作制约双重关系的进程同步问题

问题描述:一个被多个进程共享的文件、记录或数据结构,允许进程对其执行读、写操作。其允许多个进程同时读取,但只要有一个进程在读,就不能有进程对其进行写操作。同样,只要有一个进程在写,其它进程的读、写操作都不允许。

http://www.dtcms.com/a/288018.html

相关文章:

  • 搭建比分网服务器怎么选数据不会卡顿?
  • SEO长尾关键词优化实战指南抢占市场
  • 基于DTLC-AEC与DTLN的轻量级实时语音增强系统设计与实现
  • 你的网站正在被Google最新算法惩罚吗?
  • SpringJDBC源码初探-JdbcTemplate类
  • xss的利用
  • 博图SCL语言中常用运算符使用详解及实战案例(下)
  • 抖音回应:没有自建外卖,就是在团购的基础上增加的配送功能
  • 前端开发技巧:浏览器模拟弱网络环境
  • Streamlit 官翻 4 - 快速参考、知识库 Quick Reference
  • 电脑windows系统深度维护指南
  • 网络包从客户端发出到服务端接收的过程
  • 初识C++——开启新旅途
  • 【每日算法】专题十五_BFS 解决 FloodFill 算法
  • Xshell若依项目部署到云服务器
  • 考研408《计算机组成原理》复习笔记,第三章(5)——磁盘存储器
  • react+antd 可拖拽模态框组件
  • 智能设备畅想
  • AWD练习的平台搭建
  • 牛客-倒置字符串
  • 如何使用orthofinder进行同源基因鉴定
  • 【Web APIs】JavaScript 自定义属性操作 ② ( H5 自定义属性 )
  • Node.js dns 模块深入解析
  • python的第三方库的基本运用
  • node.js学习笔记1
  • Tomcat配置和部署项目
  • 从零手写红黑树(C++实现详解)
  • Java 中的继承与多态
  • 【OD机试】人民币转换
  • 小数点何去何从?教务系统成绩计算的精度与公平性博弈