操作系统中的信号量及应用 |
您所在的位置:网站首页 › 信号量S=0的意义 › 操作系统中的信号量及应用 |
为了更好的解决同步和互斥的问题,操作系统中引入了信号量机制,通过软件的办法来解决同步和互斥的问题,信号量被引入后,不止应用于同步和互斥,还有前驱图,生产者消费者模型,读者写者模型,这篇文章就讲解一下信号量和信号量的五个应用。 信号量利用软件实现,就需要引入信号量的概念,信号量是对资源可用情况的抽象,是一个结构体 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申请到,这样就解决了互斥的问题。
假设现在有两个进程,分别是计算进程和打印进程,计算进程计算出一个数值,放入到缓冲区,打印进程从缓冲区中取出一个数值,然后进行打印,缓冲池中最多只能存放一个数值。用信号量来描述该过程 通过上面的分析,这是一个同步关系的例子,先分析同步关系,只有当计算进程计算出数值放入到缓冲区后,打印进程才能进行打印。而只有当打印进程从缓冲池中取出了一个数值进行打印后,缓冲池才有空间让计算进程继续放入。所以这里面有两重同步关系,设打印进程为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之间,则设置为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 |