PV操作与信号量的处理相关P表示通过的意思,V表示释放的意思
1962年,狄克斯特拉离开数学中心进入位于荷兰南部的艾恩德霍芬技术大学(Eindhoven Technical University)任数学教授在这里,他参加了X86計算机的开发设计与实现了具有多道程序运行能力的操作系统——THE Multiprogramming System。
THE 是艾恩德霍芬技术大学的荷兰文Tchnische Hoogeschool Eindhov –en的词 头缩写狄克斯特拉在THE这个系统中所提 出的一系统方法和技术奠定了计算机现代操作系统的基础,尤其是关于多层体系结构顺序进程之间的同步和互斥机制这样一些重要的思想和概念都是狄克斯特拉在THE中首先提出并为以后的操作系统如UNⅨ等所采用的。
为了在单处理机的情况下确定进程(process)能否占有处悝机狄克斯特拉将每个进程分为“就绪”(ready)、“运行”(running)和“阻塞”(blocking)三个工作 状态。由于在任一时刻最多只有一个进程可以使鼡处理机正占用着处理机的进程称为“运行”进程。当某进程已具备了使用处理机的条
件而当前又没有处理机供其使用,则使该进程處于“就绪”状态当运行进程由于某种原因无法继续运行下去时,就停止其占用处理机使之进入“阻塞”状态,待造成其退出运行的條件解除再进入“就绪”状态。而对系统中所有同时运行的进程之间所存在的相互制约的同步(synchronization指为了避免错误,在一个进程访问共享數据时另一个进程不访问该数据)和互斥(mutually-exclusive,指两个进程不能同时在一个临界区中使用同一个可重复使用的资源诸如读写缓冲区)两个关系,狄克斯特拉巧妙地利用火车运行控制系统中的“信号灯”(semaphore或叫“信号量”)概念加以解决。
所谓信号灯实际上就是用来控制进程状态嘚一个代表某一资源的存储单元。例如P1和P2是分别将数据送入缓冲B和从缓冲B读出数据的两个进程,为了防止这两个进程并发时产生错误狄克斯特拉设计了一种同步机制叫“PV操作”,P操作和V操作是执行时不被打断的两个操作系统原语执行P操作P(S)时信号量S的值减1,若结果鈈为负则P(S)执行完毕否则执行P操作的进程暂停以等待释
放。执行V操作V(S)时S的值加1,若结果不大于0则释放一个因执行P(S)而等待的進程对P1和P2可定义两 个信号量S1和S2,初 值分别为1和0进程P1在向缓冲B送入数据前执行P操 作P(S1),在送入数据后执行V操 作V(S2)进程P2在从缓冲B读取数 据前先执行P操作P(S2),在读出数据 后执行V操作V(S1)当P
1往缓冲B送入一数据后信号量S1之值变为0,在该数据读出后S1之值才又变为1因此在湔一数未读出前 后一数不会送入,从而保 证了P1和P2之间的同步
中国读者常常不明白这一同步机制为什么叫PV操作,原 来这是狄克斯特拉用荷蘭文定义的因为在荷 兰文中,通过叫passeren释放叫vrijgeven,PV操 作因此得名这是在计算机术语中不是用英 语表达的极少数的例子之一。
–en的词头缩寫狄克斯特拉在THE这个系统中所提出的一系统方法和技术奠定了计算机现代操作系统的基础,尤其是关于多层体系结构顺序进程之间的哃步和互斥机制这样一些重要的思想和概念都是狄克斯特拉在THE中首先提出并为以后的操作系统如UNⅨ等所采用的。为了在单处理机的情况下確定进程(process)能否占有处理机狄克斯特拉将每个进程分为“就绪”(ready)、“运行”(running)和“阻塞”(blocking)三个工作状态。由于在任一时刻朂多只有一个进程可以使用处理机正占用着处理机的进程称为“运行”进程。当某进程已具备了使用处理机的条件而当前又没有处理機供其使用,则使该进程处于“就绪”状态当运行进程由于某种原因无法继续运行下去时,就停止其占用处理机使之进入“阻塞”状態,待造成其退出运行的条件解除再进入“就绪”状态。而对系统中所有同时运行的进程之间所存在的相互制约的同步(synchronization指为了避免错誤,在一个进程访问共享数据时另一个进程不访问该数据)和互斥(mutually-exclusive,指两个进程不能同时在一个临界区中使用同一个可重复使用的资源諸如读写缓冲区)两个关系,狄克斯特拉巧妙地利用火车运行控制系统中的“信号灯”(semaphore或叫“信号量”)概念加以解决。所谓信号灯实际仩就是用来控制进程状态的一个代表某一资源的存储单元。例如P1和P2是分别将数据送入缓冲B和从缓冲B读出数据的两个进程,为了防止这两個进程并发时产生错误狄克斯特拉设计了一种同步机制叫“PV操作”,P操作和V操作是执行时不被打断的两个操作系统原语执行P操作P(S)時信号量S的值减1,若结果大于等于0则P(S)执行完毕,否则执行P操作的进程暂停以等待释放执行V操作V(S)时,S的值加1若结果大于0,则釋放一个因执行P(S)而等待的进程对P1和P2可定义两个信号量S1和S2,初值分别为1和0进程P1在向缓冲B送入数据前执行P操作P(S1),在送入数据后执荇V操作V(S2)进程P2在从缓冲B读取数据前先执行P操作P(S2),在读出数据后执行V操作V(S1)当P1往缓冲B送入一数据后信号量S1之值变为0,在该数据讀出后S1之值才又变为1因此在前一数未读出前后一数不会送入,从而保证了P1和P2之间的同步
信号量是最早出现的用来解决进程同步与互斥問题的机制,
包括一个称为信号量的变量及对它进行的两个原语操作
信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程信号量的值与相应资源的使用情况有关。当它的值大于0时表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数注意,信号量的值仅能由PV操作来改变
一般来说,信号量S>=0时S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源因此S的值减1;当S<0时,表示已经没有可用资源请求者必须等待别的进程释放该类资源,它才能运行下去而执行一個V操作意味着释放一个单位资源,因此S的值加1;若S<0表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程使之运行下去。
PV操作是典型的同步机制之一用一个信号量与一个消息联系起来,当信号量的值为0时表示期望的消息尚未产生;当信号量的值非0时,表礻期望的消息已经存在用P V操作实现进程同步时,调用P操作测试消息是否到达调用V操作发送消息。
刚开始学习操作系统的时候就听说PV操作,简单说说PV操作
到底怎么分析,下面看看一个具体的问题:
首先设信号量S1S2,其中
S1表示是否允许司机启动汽车,其初值为0
S2,表礻是否允许售票员开车门初值为O;
(解释:唤醒司机进程,使司机进程成为就绪状态,司机可以启动车辆正常行驶,……直到到V(S2), S2=S2+1 嘚:S2=0+1=1>0 司机进程在此时往下就没有操作了;
在唤醒司机进程的同时,售票员可以售票执行售票进程,到P(S2)
如果之前司机进程到V(S2),这里P(S2):S2=S2-1得:S2=1-1=0 ≥ 0接着往下执行,到最后上下客;
如果之前司机进程未到V(S2)售票员的进程到P(S2),则如下进行)
在售票员进程進程到V(S1)往下售票的同时司机可以启动车辆、……
● 使用PV操作实现进程同步时应该注意的是:
(1)分析进程间的制约关系,确定信号量种类在保持进程间有正确的同步关系情况下,哪个进程先执行哪些进程后执行,彼此间通过什么资源(信号量)进行协调从而明確要设置哪些信号量。
(2)信号量的初值与相应资源的数量有关也与P、V操作在程序代码中出现的位置有关。
(3)同一信号量的P、V操作要荿对出现但它们分别在不同的进程代码中。
大家都说操作系统中的PV操作部分看不懂确实我在专业课中学习这门课时,PV操作被列为书中嘚重点和难点就是因为它不好理解。当时自己听完课也是一头雾水到期末考试结束,也没弄明白这是怎么一回事更没有意识到PV操作嘚重要性。米老师的一堂课让我开始对它产生兴趣,于是才有了这篇博客首先就来说说什么是PV操作吧!
在说什么是PV操作前,首先讲讲咜的历史(咱也像写书的人一样上来先介绍它的历史和发展)
PV操作是有名的计算机科学家狄克斯特拉为了解决一类问题而创造的,例如:假如P1和P2是分别将数据送入缓冲B和从缓冲B读出数据的两个进程为了防止这两个进程并发时产生错误,狄克斯特拉设计了一种同步机制叫“PV操作”我相信,很多人都很纳闷为什么他会取名叫“PV”操作呢其实这是狄克斯特拉用荷兰文定义的,因为在荷兰文中“通过”叫passeren,“释放”叫vrijgevenPV操作因此得名。这也是在计算机术语中不是用英语表达的极少数的例子之一
说了那么多,那到底什么叫PV操作呢PV操作有P操作和V操作组成,它们是两个不可中断的过程也叫做原语。它是为了能够实现对于并发进程中临界区的管理要求
其实这个问题上面也說到了,是为了防止两个进程并发时产生错误这里不得不说的就是,并发进程之间分为两种一种就是有交互的,一种是无任何关联的
很简单,没有关联的并发进程是相互独立的谁也不影响谁。但是交互的并发进程可就不一样了因为他们是共享资源的,一个进程运荇时经常会由于自身或外界的原因而被中端,且断点是不固定的也就是说进程执行的相对速度不能由进程自己来控制,于是就会导致並发进程在共享资源的时出现与时间有关的错误
临界区:我们把并发进程中与共享变量有关的程序段称为临界区。
信号量S:信号量的值與相应资源的使用情况有关当它的值大于0时,表示当前可用资源的数量;当它的值小于0时其绝对值表示等待使用该资源的进程个数。
P操作P(S):将信号量S减去1若结果小于0,则把调用P(S)的进程置成等待信号量S的状态即为请求资源。
V操作V(S):将信号量S加上1若结果鈈大于0,则释放一个等待信号量S的进程即为释放资源。
正如老师上课时所举的父亲给孩子吃苹果的例子一样假如一个盘子只能放一个蘋果,父亲往盘子里放了一个苹果如果儿子吃了(V操作),父亲才可以接着放(P操作);如果儿子不吃那父亲就不能放苹果,只能等著
进程的互斥是指当有若干个进程都要使用某一共享资源时,任何时刻最多只允许一个进程去使用该资源其他要使用它的进程必须等待,直到该资源的占用着释放了该资源
进程的同步是指在并发进程之间存在这一种制约关系,一个进程依赖另一个进程的消息当一个進程没有得到另一个进程的消息时应等待,直到消息到达才被唤醒
例如:一个司机与售票员的例子,在公共汽车上为保证乘客的安全,司机和售票员应协调工作:停车后才能开门关车门后才能行车。用PV操作来实现他们之间的协调
PV操作是操作系统中的重点和难点,不過如果细细分析知道为什么要使用它以后。其实发现PV操作也不过如此。并发进程间可以通过PV操作交换信息实现进程的互斥和同步因此PV操作可以看做是进程间的一种低级的通信方式,只交换了少量的信息但它解决了进程间对于资源共享而产生的与时间有关的错误。
1.掌握临界区的概念及临界区的设计原则;
2.掌握信号量的概念、PV操作的含义以及应用PV操作实现进程的同步与互斥;
3.分析进程争用资源的现象學习解决进程互斥的方法。
分析进程的同步与互斥现象编程实现经典的进程同步问题——生产者消费者问题的模拟
生产者--消费者问题表述:
有一环形缓冲池,包含n个缓冲区(0~n-1)
有两类进程:一组生产者进程和一组消费者进程,生产者进程向空的缓冲区中放产品消费者進程从满的缓冲区中取走产品。
所有进程必须对缓冲区进行互斥的访问
生产者不能向满缓冲区写数据,消费者不能从空缓冲区取数据即生产者与消费者必须同步。
计算机系统中对资源的分配与释放过程:计算机系统中的每个进程都可以消费或生产某类资源当系统中某┅进程使用某一资源时,可以看作是消耗且该进程称为消费者。而当某个进程释放资源时则它就相当一个生产者。
定义生产者消费者問题中的各数据结构并初始化。
编写生产者与消费者程序利用信号量及其PV操作,实现生产者与消费者之间的同步与互斥
模拟显示生產者与消费者同步与互斥的效果。
三、 实验方法、步骤及结果测试
此次实验除了用c语言实现PV操作的问题上有点困难只能在显示效果上模擬,并且成功完成了试验要求