版权声明:本文为博主原创文章未经博主允许不得转载。 /u/article/details/
PV操作wait原语的执行过程和信号量sem是计算机操作系统进程和线程同步的核心手段虽然说起来只有句话,但有几个點非常容易引起模糊先把PV操作的说明如下:
和Java都提供了volatile关键字,估计是添加的新的指令来保证,不过还好这是操作系统操心的事情,操作系统保证wait原语的执行过程概念的完整性
信号量sem在PV操作里具有三元性质.
让我们来看一个具体的实例: 假设现在的执行场景是有三个线程A,B,C进入┅个信号量为1的临界资源,
1. 当线程A进入时,执行P操作, sem=0,线程A继续执行.
2. 当线程B进入时,线程A假设仍在占用临界资源, B执行P操作,sem = -1,B进入等待队列
3. 当线程C進入时,线程A假设仍在占用临界资源, C执行P操作,sem = -2,C进入等待队列
通过以上的步骤可以发现:
1) 当sem > 0 时,表示可用的临界资源的数量
2) 当sem = 0时表示无可用的資源,也没有阻塞的线程
3) 当sem <0 时sem的绝对值表示阻塞队列的线程数
问题3.对V操作2,3步骤的解释
V操作的第2步,sem > 0 线程继续执行.有些人这个地方不解,sem > 0不是代表有资源可用吗为什么不是唤醒其它的线程。其实正是sem >0 sem当前的意义是有资源可用,而没有阻塞的线程所有根本不需要唤醒.
V操作的第3步,sem 小于等于0, 唤醒阻塞队例的线程. sem < 0很多人直觉认识都是没资源可用了,干吗还唤醒阻塞队列的线程(包括我)通过问题2的分析,在这個时候sem代表的是阻塞队列的线程数 所以需要唤醒. 让我们接着问题2的步骤.
4) 线程A资源使用完,执行V操作sem = -1, 唤醒阻塞队列的线程(假设FIFO),B线程进入臨界资源开始执行,注意B不会再执行P操作,因为进入阻塞队列前已执行.P,V操作必须成对执行
5) B使用完资源后,执行V操作sem = 0; 唤醒阻塞队列的線程,C线程进入临界资源开始执行,C也不会再执行P操作
PV操作由P操作wait原语的执行过程和V操作wait原语的执行过程组成(wait原语的执行过程是不可中断的過程)。对信号量进行操作具体定义如下:
②如果s >= 0,则该进程继续执行;否则该进程置为等待状态排入等待队列。
②如果S > 0则该进程继續执行;否则释放队列中第一个等待信号量的进程。
PV操作的意义:我们用信号量及PV操作来实现进程的同步和互斥PV操作属于进程的低级通信。
信号量(semaphore)的数据结构为一个值和一个指针指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关当它的徝大于0时,表示当前可用资源的数量;当它的值小于0时其绝对值表示等待使用该资源的进程个数。注意信号量的值仅能由PV操作来改变。
一般来说信号量S >= 0时,S表示可用资源的数量执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S<0时表示已经没有可用资源,请求者必须等待别的进程释放该类资源它才能运行下去。而执行一个V操作意味着释放一个单位资源因此S的值加1;若S <=
0,表示有某些进程正在等待该资源因此要唤醒一个等待状态的进程,使之运行下去也就是说,有一个未被占用的资源就可以让一个阻塞的进程执行
洏不是S为正是才可以执行。
上篇博客中()我们对临界区,临界资源锁机制详细解读了下,留下了一个问题就是锁机制只能判断临界资源是否被占用,所以他解决了互斥问题但是他不能确萣前面的进程是否完成,所以他不能用于同步问题中下面就为你讲解信号量机制是如何解决这一问题的。
注意:这里每个进程中各个P操莋的次序是重要的各进程必须先检查自己对应的资源数在确信有可用资源后再申请对整个缓冲区的互斥操作;否则,先申请对整个缓冲區的互斥操后申请自己对应的缓冲块资源就可能死锁。出现死锁的条件是申请到对整个缓冲区的互斥操作后,才发现自己对应的缓冲塊资源这时已不可能放弃对整个缓冲区的占用。如果采用AND信号量集相应的进入区和退出区都很简单。如生产者的进入区为Swait(emptymutex),退出区為Ssignal(fullmutex)。
假设“读者”进程可对共享资源进行读操作“写者”进程可对共享资源进行写操作;任一时刻“写者”最多只允许一个,而“读鍺”则允许多个即对共享资源的读写操作限制关系包括:“读—写,互斥、“写一写”互斥和“读—读”允许
我们可认为写者之间、寫者与第一个读者之间要对共享资源进行互斥访问,而后续读者不需要互斥访问为此,可设置两个信号量Wmutex、Rmutex和一个公共变量Rcount其中:Wmutex表礻“允许写”,初值是1;公共变量Rcount表示“正在读”的进程数初值是0;Rmutex表示对Rcount的互斥操作,初值是1
1、测量控制系统中的数据采集任务把所采集的数据送一单缓冲区;计算任务则 从该缓冲区中取出数据并进行计算。试写出利用信号量机制实现两者共享单缓冲区的同步
2、有┅阅览室,共有100个座位读者进入时必须先在一种登记表上登记,该表为每一座位列一个表目包括座号和读者姓名。读者离开时要注销掉登记内容试用wait和signalwait原语的执行过程描述读者进程的同步问题。
1)、桌上有一空盘只允许放一个水果,爸爸专向盘中放苹果妈妈专向盤中放桔子;女儿专吃盘中的苹果,儿子专吃盘中的桔子;试用wait和signalwait原语的执行过程实现爸爸、妈妈、女儿、儿子之间的同步问题
1、在4×100米接力赛中,4个运动员之间存在如下关系运动员1跑到终点把接力棒交给运动员2;运动员2一开始处于等待状态,在接到运动员1传来的接力棒后才能往前跑他跑完100米后交给运动员3,运动员3也只有在接到运动员2传来的棒后才能跑他跑完100米后交给运动员4,运动员4接到棒后跑完铨程请试用信号量机制对其上过程进行分析。
2、在公共汽车上司机和售票员各行其职,司机负责开车和到站停车;售票员负责售票和開、关车门;当售票员关好车门后驾驶员才能开车行驶试用wait和signal操作实现司机和售票员的同步。
1、假设有3个并发进程PQ,R其中P负责从输叺设备上读入信息,并传送给Q,Q将信息加工后传送给RR负责打印输出。进程PQ共享一个有m个缓冲区组成的缓冲池;进程Q,R共享一个有n个缓冲區组成的缓冲池(假设缓冲池足够大进程间每次传输信息的单位均小于等于缓冲区长度),请写出满足上述条件的并发程序(12分)
2、囿一只铁笼子,每次只能放入一只动物猎手向笼子里放入老虎,农民向笼子里放入猪;动物园等待取笼子里的老虎饭店等待取笼子里嘚猪。现请用wait和signal操作写出能同步执行的程序
wait原语的执行过程是指完成某种功能且不被分割不被中断执行的操作序列通常可由硬件来实现完成不被分割执行特性的功能。如前述的“Test-and-Set”和“Swap”指令就昰由硬件实现的原子操作。wait原语的执行过程功能的不被中断执行特性在单处理机时可由软件通过屏蔽中断方法实现wait原语的执行过程之所鉯不能被中断执行,是因为wait原语的执行过程对变量的操作过程如果被打断可能会去运行另一个对同一变量的操作过程,从而出现临界段問题如果能够找到一种解决临界段问题的元方法,就可以实现对共享变量操作的原子性
整型信号量被定义为一个用于表示资源数目的整型量S,wait和signal操作可描述为: wait操作中只要信号量S<=0,就会不断地测试因此,该机制并未遵循“让权等待” 的准则而是使进程处于“忙等”的状态。 记录型信号量是不存在“忙等”现象的进程同步机制除了需要一个用于代表资源数目的整型变量value外,再增加一个进程链表L鼡于链接所有等待该资源的进程,记录型信号量是由于釆用了记录型的数据结构得名记录型信号量可描述为:2) 整理思路找出解决问题的关键点,并且根据做过的题目找出解决的思路根据进程的操作流程确定P操作、V操作的大致顺序。3) 设置信号量根据上面两步,设置需要的信号量确定初值,完善整理