信号量机制

前言

此篇文章是我在B站学习时所做的笔记,大部分图片都是课件老师的PPT,方便复习用。此篇文章仅供学习参考。


提示:以下是本篇文章正文内容

知识总览

在这里插入图片描述

1965年,荷兰学者Dijkstra提出了一种卓有成效的实现进程互斥、同步的方法――信号量机制

  • 用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步。
  • 信号量其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量),可以用一个后了里来表示系统中某种资源的数量,比如:系统中只有一台打印机,就可以设置一个初值为1的信号量。
  • 原语是一种特殊的程序段,其执行只能一气呵成,不可被中断。原语是由关中断/开中断指令实现的。软件解决方案的主要问题是由“进入区的各种操作无法一气呵成”,因此如果能把进入区、退出区的操作都用“原语”实现,使这些操作能“一气呵成”就能避免问题。
  • 一对原语wait(S)原语和signal(S)原语,可以把原语理解为我们自己写的函数,函数名分别为wait和signal,括号里的信号量S其实就是函数调用时传入的一个参数。
  • wait、signal原语常简称为P、V操作(来自荷兰语proberen和verhogen)。因此,做题的时候常把wait(S)、signal(S)两个操作分别写为P(S)、V(S)

信号量机制

整型信号量

在这里插入图片描述
查了一下:原子操作不允许中断。当原子操作无法完成时,会自动恢复到操作之前的状态,是不可拆分的。

记录型信号量

在这里插入图片描述
解释:
这种信号量是用一种记录型的数据结构来表示,其中value表示的是当前这种系统资源的剩余数量,比如说大家提到的打印机,第二个比较重要的是在这种信号量当中,它还会保持一个指向等待这种系统资源的等待队列,指向等待他的那些进程。对于记录型信号量的wait操作是这样的,首先执行了wait操作,就意味着我一个进程,它需要使用与这个信号量对应的那种系统资源,所以我们会把这个新资源的数量也就它的value的值做一个减一的操作,当它减一之后又会对这个value的值进行个检查,如果说我们在执行了减一操作之后,导致这个value的值已经小于零了,那么就说明他在减一之前,其实已经没有这种系统资源了,因此在这个时候是没有系统资源可以分配给当前申请的这种资源的那个进程的,因此在这个地方需要执行一个block原语。这个原语的作用就是把当前的这个进程阻塞起来,主动的阻塞放弃处理机,并且把它挂到这个信号量对应的这个等待队列当中,这是wait操作。而signal操作是当一个进程,它在使用完这种系统资源的时候会执行的一个原语操作,首先是会把这种资源的数量进行一个加一的操作,如果value的值在加一之后仍然小于等于零,那么就说明在这个进程释放这个资源之前,依然还有一些进程处于等待队列的,所以就需要在调用一个wakeup原语从s,也就从这个信号量对应的等待队列当中唤醒其中的某一个进程,然后让他从阻塞态回到就绪态,并且把它所申请的所等待的这个资源分配给它。所以这就是为wait原语与signal原语要做到两件事情,它们做的一个共同点是不管怎么说,肯定是对value的值,先减减或者先加加,然后之后还会在对value的值做一个检查,再来判断是否需要对进程进行阻塞,或者是否需要唤醒某一个进程。

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

知识回顾与重要考点

在这里插入图片描述

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜗牛_Chenpangzi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值