操作系统中的信号量及应用

您所在的位置:网站首页 信号量S=0的意义 操作系统中的信号量及应用

操作系统中的信号量及应用

2024-06-20 15:46| 来源: 网络整理| 查看: 265

  为了更好的解决同步和互斥的问题,操作系统中引入了信号量机制,通过软件的办法来解决同步和互斥的问题,信号量被引入后,不止应用于同步和互斥,还有前驱图,生产者消费者模型,读者写者模型,这篇文章就讲解一下信号量和信号量的五个应用。

信号量

利用软件实现,就需要引入信号量的概念,信号量是对资源可用情况的抽象,是一个结构体

typedef struct{ int value; *pcb L; } semaphore;

解释一下结构体中成员变量的含义:

value:value表示资源的可用数目,>0表示资源可用数目,=0表示资源刚好用完,= 0,说明本次请求资源是成功的s.value < 0,说明系统没有可用资源,调用block原语阻塞进程,并将pcb挂在L后排队等待资源

V操作表示释放一个单位的资源,释放时s.value++,加完后分2种情况

s.value 0,说明在L阻塞队列上没有等待的进程,该进程继续执行或转进程调度。

一起来看看如何利用pv来解决五种应用问题

互斥

  设有进程p1,p2互斥访问缓冲池B,两个进程都从B中取值,那么如何通过信号量保证互斥访问呢?

  在取值操作前加p操作,也就是申请一个资源,在取值操作后加v操作,释放刚才申请的资源,所以这里我们就设互斥信号量mx,mx的初值是1,代表互斥访问的进程占用资源的情况,mx只有一个资源,要么p1申请到,要么p2申请到,这样就解决了互斥的问题。

在这里插入图片描述   通过这个例子我们也可以知道互斥信号量的初值一般都为1,最大值是1,也就代表只有一个资源。在加pv操作的时候,在需要互斥的操作前加p操作,在需要互斥的操作后加v操作

同步

  假设现在有两个进程,分别是计算进程和打印进程,计算进程计算出一个数值,放入到缓冲区,打印进程从缓冲区中取出一个数值,然后进行打印,缓冲池中最多只能存放一个数值。用信号量来描述该过程

  通过上面的分析,这是一个同步关系的例子,先分析同步关系,只有当计算进程计算出数值放入到缓冲区后,打印进程才能进行打印。而只有当打印进程从缓冲池中取出了一个数值进行打印后,缓冲池才有空间让计算进程继续放入。所以这里面有两重同步关系,设打印进程为Pp,计算进程为Pc,那么可以根据上面的分析得出:

当缓冲池为空时,同步关系为:Pc -> Pp,设该同步信号量为 full 当缓冲池为满时,同步关系为:Pp -> Pc,设该同步信号量为 empty

  full和empty的初值含义为:条件执行的进程的可执行条件,刚开始缓冲池为空,打印进程不能进行打印,所以Pp的可执行条件是0,即 full初=0,但是刚开始的时候计算进程是可以进行计算的,所以Pc的可执行条件是1,即 empty初=1

  在分析清楚了同步关系后,就可以很清楚的知道哪一步释放的资源是哪一步的执行条件了,在箭尾后加v操作,在箭头前加p操作,也就是这样

Pc (V) ——> (P) Pp

通过图直观的看一下: 在这里插入图片描述

  这时,或许有些人会问:那计算进程和打印进程同时访问缓冲区,那么是不是有一层互斥关系呢?为什么不需要描述?

  计算进程和打印进程确实是同时访问了缓冲区,所以肯定是存在互斥关系的,但是由于缓冲区的大小只有1个,从同步关系可以得出每次只有一个进程在访问缓冲区,同步关系就保证了互斥关系,所以不需要再加上互斥关系了。如果缓冲区的大小不是1,而是10,那么同时就有可能有多个计算进程和打印进程访问缓冲区,这个时候就需要加上互斥关系。

描述前驱图

给出这样一个前驱图,使用信号量进行描述 在这里插入图片描述 描述前驱图时,对于每两个节点之间的箭头都设置一个信号量,比如说s1到s2之间的箭头,在s1后面加v操作,在s2前面加p操作,同理描述其他箭头。

给出最终版的描述图片 首先需要设置信号量,信号量如果在s1和s2之间,则设置为s12,以此类推 在这里插入图片描述

生产者消费者模型

  上面的计算打印进程就是简单的生产者消费者模型,还是举上面同步的那个例子,现在计算进程就是生产者,打印进程就是消费者,但是条件不同的是缓冲池的容量现在不为1,而是10,那么该如何描述这个关系

  在上面其实也已经强调过,当缓冲池的容量变为10,也就是不为1的时候,就需要考虑互斥关系

    同样先设置互斥信号量为mx,同步关系和上面相同     当缓冲池为空时,同步关系为:Pc -> Pp,设该同步信号量为 full=0     当缓冲池为满时,同步关系为:Pp -> Pc,设该同步信号量为 empty=10

描述流程图: 在这里插入图片描述

读者写者模型

  读者即读取临界资源,而写者则是修改临界资源,当写者写完后,多个读者可以同时读取该资源,写者修改资源的时候读者不能读取资源,否则会出现错误,也不能有两个写者同时修改资源,所以写者与其他进程有互斥关系,设该互斥信号量为wmx。   当读者读资源的时候,是不是都要去获取互斥信号量wmx呢?答案是否定的,只有第一个读者在进行读取的时候,该读者是需要判断是否有写者在修改资源,也就是需要拿到wmx,后续的读者就不再需要获取锁了,所以我们设Rc表示当前正在读的进程数量,每有一个读者加入,则Rc++,退出时,Rc- -。当最后一个读者退出时,需要释放锁wmx。   最后还存在一个问题就是,Rc表示当前正在读的进程数量,那么多个读者同时去修改Rc变量,这也是一个互斥关系,所以,所有的读者互斥访问Rc变量

所以总结分析为两点: 写者不可以和任何进程同时进行 读者互斥访问Rc变量

通过上面的分析,设出信号量 设写者不可以与其他进行同时访问临界资源,该互斥关系为wmx 设读者之间互斥的访问Rc变量,该互斥关系为rmx

画出读者写者的流程图: 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3