操作系统之进程同步

来源:互联网 发布:实况足球球员数据库 编辑:程序博客网 时间:2024/04/28 15:36

1、进程之间的关系:竞争与协作

1.1 竞争关系

死锁:一组进程如果都获得了部分资源,还想要得到其他进程所占有的资源,最终所有的进程将陷入死锁。

类比:有2个修车师傅,甲师傅有一把扳手,乙师傅有一把锤子(在这里扳手和锤子就是资源)。要完成修车工作需要同时具备扳手和锤子,所以甲师傅想要得到乙师傅锤子,而以此同时乙师傅想要得到甲师傅的扳手。两位师傅互不相让,谁都不愿意先让出自己的工具,于是就会造成争执不下(即死锁)的情况。

饥饿:一个进程由于其他进程总是优先于它而被无限期拖延。

互斥:进程的互斥是解决进程间死锁和饥饿的手段,保证进程能互斥地访问临界资源。进程互斥是指若干个进程要使用同一共享资源时,任何时刻最多允许一个进程去使用,其他要使用该资源的进程必须等待,直到占有资源的进程释放该资源。

临界资源同一时间段内只允许一 个程序访问的资源。

1.2 协作关系

某些进程为完成同一任务需要分工协作,由于合作的每一个进程都是独立地以不可预知的速度推进,这就需要相互协作的进程在某些协调点上协调各自的 工作。当合作进程中的一个到达协调点后,在尚未得到其伙伴进程发来的消息或信号之前应阻塞自己(即等待),直到其他合作进程发来协调信号或消息后方被唤醒并继续执行。

2、进程同步

概念:两个以上进程基于某个条件来协调它们的活动。一个进程的执行依赖于另一个协作进程的消息或信号,当一个进程没有得到来自于另一个进程的消息或信号时则需等待,直到消息或信号到达才被唤醒。

进程同步是解决进程协作的手段。
进程同步目的是调整并发进程的进行速度,使并发进程相对速率协调。

进程互斥关系是一种特殊的进程同步关系

几种最常用的同步机制:信号量及PV操作,管程和消息传递。下面将详细介绍前2种。

2.1 信号量和P,V操作

临界区管理

临界区并发进程中与共享变量有关的程序段称为“临界区”;
对若干个进程共享一个变量的相关临界区,有三个调度原则:
  • 一次至多一个进程能够在它的临界区内; 
  • 不能让一个进程无限地留在它的临界区内; 
  • 不能强迫一个进程无限地等待进入它的临界区。
临界区管理的实质是为了实现进程互斥访问临界资源,一般由软件方法和硬件方法。

1)软件方法举例Peterson算法
此方法为每个进程设置一个标志,当标志为true 时表示该进程要求进入临界区。 另外再设置一个指示器 turn以指示可以由哪个进程进入临界区,当 turn=i时则可由进程Pi 进入临界区。

2)硬件方法举例:
测试并建立(test and set)指令:TS(s)/* 若s=true, 则s=false且return true;否则return false*/;
对换(swap)指令: swap(a,b) /* temp=a; a=b; b=temp*/

但上述2种方法都有缺点,不能很好解决进程同步问题,于是有了信号量这种方法。

信号量基本思想

让两个或多个进程 通过特殊变量展开交互。一个进程在某一特殊点上被迫停止执行直到接收到一个对应的特殊变量值,这种特殊变量就是信号量。为了通过信号量传送信号,进程可以通过P、V两个特殊的操作来发送和接收信号,如果进程相应的信号仍然没有送到,进程被挂起直到信号到达为止。

信号量的含义

它是一个与队列有关的整型变量,它有两个分量:一个是信号量的值,另一个是等待进程队列的队列指针。

信号量的值代表的是可用的物理资源数,可以简单理解为可以同时访问资源的进程数。

除赋初值外,信号量仅能由同步原语对其进行操作,没有任何其他方法可以检查和操作信号量。(原语是操作系统内核中执行时不可中断的过程、即原子操作)

信号量按取值分2种:
  • 二元信号量:仅允许取值为0或1,主要用于解决进程互斥的问题;
  • 一般信号量:对取值无限制,初始值为非负整数,主要用于解决进程协作的问题;

P操作和V操作

Dijkstra发明了两个信号量操作原语:P操作(代表申请资源,对信号量减1)和V操作(代表释放资源,对信号量加1)
  • 当某一进程需要请求资源时,对信号量执行P操作,信号量减一。若执行P操作后的信号量小于0,则此进程进入等待队列;若执行P操作后的信号量不小于0,则代表还有可用的物理资源,此进程可以执行。
  • 当某个进程释放物理资源时,执行V操作,信号量加一。若执行V操作后的信号量不大于0(若大于0,说明没有等待的进程),则从等待队列中取出等待时间最长的进程执行。
推论:
信号量一般是个正整数值,代表的是可用的物理资源数。
当信号量为正值时,代表没有等待的进程,此正值大小代表还可以申请资源的进程数;
当信号量为0时,代表没有等待的进程,同时也没有可以申请的物理资源;
当信号量为负值,代表有等待的进程,此负值的绝对值代表等待的进程个数。

P操作意味着请求一个资源,V操作意味着释放一个资源。在一定条件 下,P操作代表挂起进程操作,而 V操作代表唤醒被挂起进程的操作。

2.2 管程与条件变量

管程的引入

使用信号量和PV操作实现同步时,对共享资源的管理分散在各个进程之中,进程能直接对共享变量进行处理,不利于系统对临界资源的管理,难以防止进程有意或无意的违法同步操作,而且容易造成程序设计错误。管程的引入使得原来分散在进程中的临界区集中了起来统一控制和管理,就可方便对共享资源的使用。

条件变量的引入

管程提供了一种互斥机制,在任一时刻,共享资源的进程可访问管程的管理该资源的过程,但最多只有 一个调用者能真正地进入管程,而任何其他调用者必须等待,直到访问者退出。但是这还不够,需要一种办法使得进程在资源不能满足而无法继续运行时被阻塞。解决的方法在于引进另外一种称作条件变量的同步机制,以及在其上操作的仅有的两个同步原语wait 和signal

基本思想

当一个管程过程发现无法继续执行下去时,例如,发现没有可用资源时,它在某些条件变量condition 上执行wait操作, 这个操作引起调用进程等待,同时允许先前被挡在管程之外的其他进程进入管程 。当有进程在同一个条件变量condition上执行signal操作时,可以指定唤醒等待此条件变量的某个进程。



0 0
原创粉丝点击