740 likes | 899 Views
2.3 进程的同步. 在多道程序系统中,由于资源共享或进程合作,使进程间形成间接相互制约和直接相互制约关系,这需要用进程互斥与同步机制来协调两种制约关系。 进程同步的主要任务是使并发执行的进程间有效的共享资源和相互合作, 进程的同步机制──信号量及 P.V 操作(解决进程同步互斥问题). 2.3.1 进程同步的基本概念. 1. 两种形式的制约关系 直接相互制约关系 ( 同步 ) 间接相互制约关系 ( 互斥 ) 共享变量 直接作用 ( 相互合作): 进程间的相互联系是有意识的安排的,直接作用只发生在相交进程间 间接作用 (资源共享):
E N D
2.3 进程的同步 • 在多道程序系统中,由于资源共享或进程合作,使进程间形成间接相互制约和直接相互制约关系,这需要用进程互斥与同步机制来协调两种制约关系。 • 进程同步的主要任务是使并发执行的进程间有效的共享资源和相互合作, • 进程的同步机制──信号量及P.V操作(解决进程同步互斥问题)
2.3.1进程同步的基本概念 • 1.两种形式的制约关系 • 直接相互制约关系(同步) • 间接相互制约关系(互斥) • 共享变量 直接作用(相互合作): 进程间的相互联系是有意识的安排的,直接作用只发生在相交进程间 间接作用(资源共享): 进程间要通过某种中介发生联系,是无意识安排的,可发生在相交进程之间,也可发生在无关进程之间
“临界资源”(Critical Resource): 一段时间内只允许一个进程访问的资源
交往的并发进程(结果不唯一)机票问题 process Ti ( i = 1, 2 ) var Xi:integer; begin {按旅客定票要求找到Aj}; Xi := Aj; if Xi>=1 then begin Xi:=Xi-1; Aj:=Xi;{输出一张票};end else {输出票已售完}; end;
进程的交往:第一种是竞争关系 • 系统中的多个进程之间彼此无关 • 系统中的多个进程之间彼此相关
进程互斥(Mutual Exclusion) • 解决进程间竞争关系(间接制约关系)的手段。 • 进程互斥指若干进程要使用同一共享资源时,任何时刻最多允许一个进程使用,其他进程必须等待,直到占有资源的进程释放该资源。
第二种是协作关系(1) •某些进程为完成同一任务需要分工协作。 •进程的同步是解决进程间协作关系(直接制约关系)的手段。
•进程同步指两个以上进程基于某个条件来协调它们的活动。一个进程的执行依赖于协作进程的消息或信号,当一个进程没有得到来自于协作进程的消息或信号时需等待,直到消息或信号到达才被唤醒。•进程同步指两个以上进程基于某个条件来协调它们的活动。一个进程的执行依赖于协作进程的消息或信号,当一个进程没有得到来自于协作进程的消息或信号时需等待,直到消息或信号到达才被唤醒。
进程互斥关系是一种特殊的进程同步关系,即逐次使用互斥共享资源,是对进程使用资源次序上的一种协调。进程互斥关系是一种特殊的进程同步关系,即逐次使用互斥共享资源,是对进程使用资源次序上的一种协调。
生产者--消费者问题表述 有界缓冲问题 • 有K个生产者和m个消费者,连接在一个有n个单位缓冲区的有界缓冲上。其中,producer和consumer都是并发进程,只要缓冲区未满,生产者p生产的产品就可投入缓冲区;只要缓冲区不空,消费者进程c就可从缓冲区取走并消耗产品。
生产者-消费者问题算法描述(1) • var n,integer; • type item=…; • var buffer:array[0...n-1] of item; • in,out:0,1,…n-1; • counter:integer:0,1,…n;
生产者-消费者问题算法描述(2) • Producer:repeat • . • produce an item in nextp; • . while counter=n do no-op; buffer[in]:=nextp; in:=(in+1) mod n; counter:=counter+1 until false;
生产者-消费者问题算法描述(3) • Consumer:repeat • While counter=0 do no-op; • nextc:=buffer[out]; • out:=(out+1) mod n; • counter:=counter-1; • consume the item in nextc; Until false
3.临界区 • 并发进程中访问临界资源的那段代码叫“临界区”(Critical Section)
交往的并发进程(结果不唯一)机票问题 process Ti ( i = 1, 2 ) var Xi:integer; begin {按旅客定票要求找到Aj}; Xi := Aj; if Xi>=1 then begin Xi:=Xi-1; Aj:=Xi;{输出一张票};end else {输出票已售完}; end;
基本概念: • 进程互斥:指在多道程序环境下,每次只允许一个进程对临界资源进行访问。 • 进程同步:指多个相关进程在执行次序上的协调。 • 临界资源:一次仅供一个进程使用的资源。 • 在进程中涉及到临界资源的程序段叫临界区 • 多个进程的临界区称为相关临界区
3.临界区 临界区的调度原则: • 一次至多允许一个进程进入临界区内 • 一个进程不能无限地停留在临界区内 • 一个进程不能无限地等待进入临界区
4.使用互斥区的原则 • 空闲让进:当无进程在互斥区时,任何有权使用互斥区的进程可进入 • 忙则等待:不允许两个以上的进程同时进入互斥区 • 有限等待:任何进入互斥区的要求应在有限的时间内得到满足 • 让权等待:处于等待状态的进程应放弃占用CPU,以使其他进程有机会得到CPU的使用权
2.3.2信号量机制 • 著名的生产者--消费者问题是计算机操作系统中并发进程内在关系的一种抽象,是典型的进程同步问题。 • 在操作系统中,生产者进程可以是计算进程、发送进程;而消费者进程可以是打印进程、接收进程等等。 • 解决好生产者--消费者问题就解决好了一类并发进程的同步问题。
3)信号量机制 • 信号量机制是一种卓有成效的进程同步工具,被广泛应用于单处理机和多处理机系统,以及计算机网络中。 • 锁机制仅能表示“开”与“关”两种状态;开、关锁原语必须作为原子操作来进行;关锁原语言中反复测试W状态,浪费了处理机的时间;锁机制只能解决互斥,不能用于同步。信号量同步机制能完满地解决上述问题。
信号量:semaphore • 是一个数据结构 • 定义如下: struc semaphore { int value; pointer_PCB queue; } • 信号量说明: semaphore s;
信号量与PV操作(1) • 1965年E.W.Dijkstra提出了同步工具--信号量和P、V操作。
信号量:一种软件资源 • 原语:内核中执行时不可被中断的过程 • P操作原语和V操作原语
信号量和P、V操作 ,将交通管制中多种颜色的信号灯管理交通的方法引入操作系统,让两个或多个进程通过特殊变量展开交互。
通过信号量传送信号,进程使用P、V两个特殊操作来发送和接收信号,如果进程相应的信号仍然没有送到,进程被挂起直到信号到达为止。通过信号量传送信号,进程使用P、V两个特殊操作来发送和接收信号,如果进程相应的信号仍然没有送到,进程被挂起直到信号到达为止。
操作系统中,信号量表示物理资源的实体,它是一个与队列有关的整型变量。操作系统中,信号量表示物理资源的实体,它是一个与队列有关的整型变量。 • 实现时,信号量是一种记录型数据结构,有两个分量:一个是信号量的值,另一个是信号量队列的队列指针。
1.整型信号量 设s为一个整形量,除初始化外,仅能通过P、V操作访问,P和V操作原语定义: P(s):while s≤0 do no-op s:=s-1; V(s): s:=s+1;
2.记录型信号量 设s为一个记录型数据结构,一个分量为整形量value,另一个为信号量队列L, P和V操作原语定义: • P(s);将信号量s减去l,若结果小于0,则调用P(s)的进程被置成等待信号量s的状态。 • V(s):将信号量s加1,若结果不大于0,则释放一个等待信号量s的进程。
type semaphore = record value:integer; L: list of process; End procedure P(S) var s:semaphore; begin s .value:= s.value – 1; /* 把信号量减去1 */ if s.value < 0 then block(s,L);/* 若信号量小于0,则调用P(s)的进程被置成等待信号量s的状态 */ end; procedure V(S) var s:semaphore); begin s .value:= s.value + 1; /* 把信号量加1 */ if s .value<= 0 then wakeup(s,L); /* 若信号量小于等于0,则释放一个等待信号量s的进程 */ end;
推论1:若信号量s为正值,则该值等于在封锁进程之前对信号量s可施行的P操作数、亦等于s所代表的实际还可以使用的物理资源数推论1:若信号量s为正值,则该值等于在封锁进程之前对信号量s可施行的P操作数、亦等于s所代表的实际还可以使用的物理资源数
推论2:若信号量s为负值,则其绝对值等于登记排列在该信号量s队列之中等待的进程个数、亦即恰好等于对信号量s实施P操作而被封锁起来并进入信号量s队列的进程数推论2:若信号量s为负值,则其绝对值等于登记排列在该信号量s队列之中等待的进程个数、亦即恰好等于对信号量s实施P操作而被封锁起来并进入信号量s队列的进程数
推论3:通常,P操作意味着请求一个资源,V操作意味着释放一个资源。在一定条件下,P操作代表挂起进程操作,而V操作代表唤醒被挂起进程的操作推论3:通常,P操作意味着请求一个资源,V操作意味着释放一个资源。在一定条件下,P操作代表挂起进程操作,而V操作代表唤醒被挂起进程的操作
3.AND型信号量 4.信号量集
8.信号量集——AND型信号量集 • AND型信号量集是指同时需要多种资源且每种占用一个时的信号量操作 • AND型信号量集的基本思想:在一个原语中申请整段代码需要的多个临界资源,要么全部分配给它,要么一个都不分配 • AND型信号量集P原语为Swait • AND型信号量集V原语为Ssignal
Swait(S1, S2, …, Sn) //P原语; { while (TRUE) { if (S1 >=1 && S2 >= 1 && … && Sn >= 1) { //满足资源要求时的处理; for (i = 1; i <= n; ++i) -–Si; //注:与P的处理不同,这里是在确信可满足 // 资源要求时,才进行减1操作; break; } else { //某些资源不够时的处理; 调用进程进入第一个小于1信号量的等待队列Sj.queue; 阻塞调用进程; }
Ssignal(S1, S2, …, Sn) { for (i = 1; i <= n; ++i) { ++Si; //释放占用的资源; for (在Si.queue中等待的每一个进程P) //检查每种资源的等待队列的所有进程; { 从等待队列Si.queue中取出进程P;
if (判断进程P是否通过Swait中的测试) //注:与signal不同,这里要进行重新判断; {//通过检查(资源够用)时的处理; 进程P进入就绪队列; } else {//未通过检查(资源不够用)时的处理; 进程P进入某等待队列; } } } }
9. 一般“信号量集” • 一般信号量集是指同时需要多种资源、每种占用的数目不同、且可分配的资源还存在一个临界值时的信号量处理 • 一般信号量集的基本思路就是在AND型信号量集的基础上进行扩充,在一次原语操作中完成所有的资源申请。
进程对信号量Si的 测试值为ti(表示信号量的判断条件,要求Si >= ti;即当资源数量低于ti时,便不予分配) 占用值为di(表示资源的申请量,即Si = Si - di) 对应的P、V原语格式为: • Swait(S1, t1, d1; ...; Sn, tn, dn); • Ssignal(S1, d1; ...; Sn, dn);
一般“信号量集”可以用于各种情况的资源分配和释放,几种特殊情况:一般“信号量集”可以用于各种情况的资源分配和释放,几种特殊情况: • Swait(S, d, d)表示每次申请d个资源,当少于d个时,便不分配 • Swait(S, 1, 1)表示互斥信号量 • Swait(S, 1, 0)可作为一个可控开关(当S1时,允许多个进程进入临界区;当S=0时,禁止任何进程进入临界区)
【思考题】 1.用P.V操作解决下图之同步问题: get copy put f s t g
司机进程: while (true){ 启动车辆 正常驾驶 到站停车 }… 售票员进程: while (true){ 关门 售票 开门 }… 用P.V操作解决司机与售票员的问题
2.3.3信号量的应用 • 1.利用信号量实现进程互斥 • 2.利用信号量实现前趋关系
2)解决互斥的锁机制 • 实现互斥的一种软件方法是采用锁机制,即提供一对上锁(Lock)和开锁(UnLock)原语,以及一个锁变量W。 • 进程进入临界区前,通过锁变量来判断临界资源是否被占用。
P操作 P(s) { s.value = s.value --; if (s.value < 0) { 该进程状态置为等待状态 将该进程的PCB插入相应的等待队列末尾s.queue; } }
P操作 • 意味着请求分配一个单位资源
V操作 V(s) { s.value = s.value ++; if (s.value < = 0) { 唤醒相应等待队列s.queue中等待的一个进程 改变其状态为就绪态 并将其插入就绪队列 } }
V操作 • 意味着释放一个单位资源
P、V操作为原语操作 原语:是由若干多机器指令构成的完成某种特定功能的一段程序,具有不可分割性。即原语的执行必须是连续的,在执行过程中不允许被中断 实现:开关中断
信号量的使用: 必须置一次且只能置一次初值 初值不能为负数 只能执行P、V操作