您好、欢迎来到现金彩票网!
当前位置:2019正版免费全年资料 > 同步通信量 >

第3章进程的同步与通信ppt

发布时间:2019-08-04 23:01 来源:未知 编辑:admin

  1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。

  第三章进程的同步与通信 主要内容 进程同步(重点) 信号量机制(重点) 管程机制(自学) 经典的进程同步问题 (重点和难点) 进程通信 作业 P71: 1、2、3、4、5、9、10、11、21、22、27 在多道程序系统中,由于资源共享或进程合作,使进程间形成间接相互制约和直接相互制约关系,这需要用进程互斥与同步机制来协调两种制约关系。 进程同步的主要任务是使并发执行的进程间进行有效的共享资源和相互合作, 进程的同步机制──信号量及P.V操作(解决进程同步互斥问题) 3.1 进程同步的基本概念 进程间的相互制约关系(理解) 临界资源(掌握) 临界区(掌握) 硬件同步机制(了解) 1.进程间的相互制约关系 (1)间接相互制约关系 对于某些资源,必须保证互斥地访问,由此在多个进程间形成的。 (2)直接相互制约关系 多个进程相互合作完成同一任务,而形成的。 2.临界资源 是指在一段时间内,只允许一个进程访问的资源,或称独占资源。 3.临界区 在每个进程中访问临界资源的那段代码。 临界区的访问 进入区:临界区前面增加一段用于进行上述检查的代码,用于检查并设置它为正被访问的标志; 。 退出区:临界区加上的一段代码,用于将临界区正被访问的标志恢复为未被访问的标志。 剩余区:进程中除进入区、临界区及退出区之外的其它部分的代码。 同步机制应遵循的规则 空闲让进 当无进程处于临界区时,允许一个请求进程进入。 忙则等待 当有进程处于临界区时,试图进入的进程必须等待。 有限等待 对要求访问临界资源的进程,保证有限时间内进入,避免“死等”。 让权等待 当进程不能进入自己的临界区时,应释放处理机,以免“忙等”。 4.硬件同步机制 目前许多计算机已提供了一些特殊的硬件指令,允许对一个字中的内容进行检测和修正,或者是对两个字的内容进行交换等。 在对临界区进行管理时,可以将标志看作为一个锁。 4.硬件同步机制 利用这些特殊的指令来解决临界区问题: 关中断 利用Test-and-set指令实现互斥 利用Swap指令实现进程互斥 (1)关中断 实现方法 在进入锁测试之前,关闭中断,直到完成锁测试并上锁之后,才能打开中断。 优点 进程在临界区执行期间,计算机不响应中断,不会引发调度,不会发生进程切换或线程切换 保证了对锁的测试和关锁操作的连续性和完整性,有效地保证了互斥。 (1)关中断 缺点 ①滥用关中断权力可能导致严重后果; ②关中断时间过长,会影响系统效率,限制了处理器交叉执行程序的能力; ③关中断方法也不适用于多CPU 系统,因为,在一个处理器上关中断,并不能防止进程在其它处理器上执行相同临界段代码。 (2)利用Test-and-set指令实现互斥 方法 借助一条硬件指令“测试并建立”指令TS(Test-and-Set),该指令看作为一条原语。 为每个临界资源设置一个布尔变量lock,lock初值为false,表示该临界资源空闲。 (2)利用Test-and-set指令实现互斥 TS指令的一般性描述 fuction TS(var lock:boolean):boolean; begin TS:=lock; lock:=true; end 例:使用TS实现互斥的进程结构 repeat … while TS(lock) do skip; critical section; remainder section; until false (3)利用Swap指令实现进程互斥 含义 对换指令,在Intel 80x86又称为XCHG指令,用于交换两个字的内容。 处理过程描述 procedure Swap(var a,b:boolean) var temp:boolean; begin temp:= a; a:=b; b:= temp; end 互斥访问临界资源的方法 为每个临界资源设置一个全局的布尔变量lock,其初值为false , 在每个进程中再利用一个局部布尔变量key。 利用Swap指令实现进程互斥的循环进程repeat key:=true; repeat Swap( lock,key) until key=false; 临界区操作; lock:=false; … until false; 利用硬件指令的出现的问题 “忙等”,即进程在进入不了临界区时,不放弃处理器,而不断地进行测试。 结果 不符合“让权等待”,造成处理机浪费 解决方法 信号量机制 3.2 信号量机制 整型信号量和记录型信号量(掌握) AND型信号量和信号量集(理解) 管程机制(自学) 1.整型信号量 信号量的提出 1965年,荷兰学者首先Dijkstra提出关于信号量的概念,他把信号量定义为一个用于表示资源数目的整型量S 与一般整型量不同,仅能通过两个标准的原子操作wait(S)和signal(S)来访问(除初始化外) wait操作的描述 wait(S): while S≤0 do no-op; S:=S-1; signal操作的描述 signal(S):S:=S+1; 缺点 未遵循“让权等待”的准则 ,死等 2.记录型信号量 信号量定义 type semaphore=record value:integer; L:list of process; end 2.记录型信号量 Wait(S)的定义 procedure wait(S) var S:semaphore; begin S.value:=S.value-1; if S.value0 then block(S.L); end 含义 每做一次wait操作,相当于对资源个数减一 当资源分配完后,进程调用block原语阻塞自己,并插入到信号量链表中 2.记录型信号量 Signal(S)的定义 procedure signal(S) var S:semaphore; begin S.value:=S.value+1; if S.value≤0 then wakeup(S.L); end 含义: 对信号量每次signal操作,表示进程释放一个资源,系统中可供分配的资源个数加一 若s.value=0,表示在该信号量链表中,仍有阻塞进程,调用wakeup原语唤醒一个等待的进程。 若s.value的初值为1,表示互斥信号量 资源信号量 互斥型信号量 3.2.2 AND型信号量和信号量集 例:设有进程A、B,都需要访问共享数据D和E。设置信号量Dmutex、Emutex。 process A: process B : wait(Dmutex); wait(Dmutex); wait(Emutex); wait(Emutex); 问题:可能引起死锁 若进程A和B交替执行wait操作: process A : wait(Dmutex); process B : wait(Emutex); process A : wait(Emutex); process B : wait(Dmutex); 1.AND型信号量 基本思想: 将进程在整个运行过程中需要的所有资源,作为一个整体,一次性地全部分配,待进程使用完后再一起释放。只要尚有一个资源未能分配给进程,其它所有可能为之分配的资源,也不分配给他。 即资源要么全分配,要么一个也不分配。 AND信号量的操作描述 Swait(Simultaneous wait)定义如下: Swait(S1,S2,…,Sn) if Si≥1 and … and Sn≥1 then for i:=1 to n do Si:=Si-1; endfor else place the process in the waiting queue associated with the first Si found with Si1,and set the program count of this process to the beginning of Swait operation endif Ssignal(S1,S2,…,Sn) for i:=1 to n do Si:=Si+1; Remove all the process waiting in the queue associated with Si into the ready queue. endfor; 2.信号量集机制 在记录型信号量机制中,每执行一次wait(s)或signal(s)操作,仅能对信号量施以加1或减1操作,相应地,每次也只能获得或释放一个单位的临界资源。要想获得多个临界资源,就要多次执行wait操作,显然这是低效的。 另外,在有些情况下,当资源数量低于某个下限值时,便不予分配。因此,在每次分配之前都必须测试该资源的数量。 基于上述两点,对AND型信号量加以扩充,形成“信号量集”机制。 信号量集机制的描述 增加了两组参数,一组是进程对某个资源的每次需求量是d,另一组是系统剩余资源的下限值t; 当资源数量低于某一下限值时,便不予以分配; 进程运行时同时对这类的N个资源访问。 Swait(S1,t1,d1,…,Sn,tn,dn) if Si≥t1 and … and Sn≥tn then for i:=1 to n do Si:=Si-di; endfor else Place the executing process in the waiting queue of the first Si with Siti and set its program counter to the beginning of the Swait Operation. endif Ssignal(S1,d1,…,Sn,dn) for i:=1 to n do Si:=Si+di; Remove all the process waiting in the queue associated with Si into the ready queue endfor; 信号量集的几种特殊情况: ① Swait(S,d,d)。此时在信号量集中只有一个信号量S,但允许它每次申请d个资源,当现有资源数少于d时,不予分配。 ② Swait(S,1,1)。此时的信号量集已蜕化为一般的记录型信号量(S1时)或互斥信号量(S=1时)。 ③Swait(S,1,0)。这是一种很特殊且很有用的信号量操作。当S≥1时,允许多个进程进入某特定区; 当S变为0后,将阻止任何进程进入特定区。换言之,它相当于一个可控开关。 3.4 经典的同步问题 生产者消费者问题(掌握) 哲学家就餐问题(掌握) 读者写者问题(掌握) 补充:睡觉的理发师 3.4.1 生产者-消费者问题 问题描述 有一个生产者进程在生产产品,并将所生产出的产品,提供给一个消费者进程去消费。 为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将它所生产的产品,按序放入一个缓冲区中。消费者进程也按序,从一个缓冲区中取走产品去消费。 不允许消费者进程到一个空缓冲区去取产品; 不允许生产者进程,向一个已装满产品且尚未被取走的缓冲区中投放产品。 信号量的设置(初值) mutex.value=1 临界资源 empty.value=n 空缓冲区的个数 full.value=0 满缓冲区的个数/产品的个数 缓冲区的设置 buffer:n个存储空间的数组(循环队列) 缓冲区的位置指针 in 生产一个产品,in的位置加一 out 取出一个产品,out的位置加一 变量设置 var mutex,empty,full:semaphore:=1,n,0; buffer:array[0,…,n-1] of item; in,out:integer:=0,0; 并发进程的表达 begin parbegin producer consumer parend end 生产者进程 producer: begin repeat …… produce an item in nextp; wait(empty); wait(mutex); buffer(in):=nextp; in:=(in+1) mod n; signal(mutex); signal(full); until false end 生产者进程 producer: begin repeat …… produce an item in nextp; wait(empty); wait(mutex); buffer(in):=nextp; in:=(in+1) mod n; signal(mutex); signal(full); until false end 消费者进程 consumer: begin repeat wait(full); wait(mutex); nextc:= buffer(out) ; out:=(out+1) mod n; signal(mutex); signal(empty); consumer the item in nextc; until false; end 消费者进程 consumer: begin repeat wait(full); wait(mutex); buffer(in):=nextp; in:=(in+1) mod n; signal(mutex); signal(empty); consumer the item in nextc; until false; end 需要注意的问题: (1)互斥型信号量 wait(mutex)和signal(mutex)必须成对出现 (2)资源信号量 empty、full的wait和signal必须成对出现,且分别处于相互合作的不同进程中 (3)信号量的顺序 多个wait不能颠倒,首先执行对资源信号量的wait操作,然后再执行对互斥信号量的wait操作,否则会引起死锁 3.4.2 哲学家进餐问题 问题描述 有五个哲学家围坐在一圆桌旁,每人面前有一只空碗,每两人之间放一只筷子; 每个哲学家的行为是思考,感到饥饿,然后吃饭; 为了吃饭,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子。 算法思路 临界资源:筷子 为每个筷子设置一个互斥型信号量 Var chopstick:array[0,…,4] of semaphore 信号量初值:0 第i位哲学家的活动描述 repeat wait(chopstick[i]); wait(chopstick[(i+1)mod 5]);  … eat;  … signal(chopstick[i]); signal(chopstick[(i+1)mod 5]);  … think; until false; 问题: 假如五位哲学家同时饥饿而各自拿起左边的筷子时,就会使五个信号量chopstick均为0; 当他们再试图去拿右边的筷子时,都将因无筷子可拿而无限期地等待。 解决方法 (1)至多允许有四位哲学家同时去拿左边的筷子,最终能保证至少一位哲学家能够进餐,并在用完时释放出他的两只筷子 (2)仅当哲学家的左、右两只筷子均可用时,才允许他拿起筷子进餐 (3)规定奇数号哲学家先拿他左边的筷子,然后再去拿右边的筷子;而偶数哲学家则相反。 3.2.3 读者-写者问题 问题分析 读者进程 无读者、写者,新读者可以读 有写者等,但有其它读者正在读,则新读者也可以读 有写者写,新读者等 写者进程 无读者,新写者可以写 有读者,新写者等待 有其它写者,新写者等待 问题分析 临界资源: 读者计数器readcount 文件 信号量的设置 mutex=1 对readcount的互斥信号 wmutex=1 对读或写操作的互斥信号 算法设计 reader进程 1)仅当readcount=0时,表示尚无reader进程在读,reader进程才需要执行wait(wmutex)操作。若wait(wmutex)操作成功,reader进程便可去读,相应地,做readercounter+1。 2)仅当reader进程在执行了readercout减1操作后其值为0时,才须执行signal(wmutex)操作,以便让writer进程写。 算法思路 writer进程 写者进程每次写之前,必须执行wait(wmutex)操作,若wait(wmutex)操作成功,writer进程便可去写,写完后,须执行signal(wmutex)操作。 代码分析 变量设置 var rmutex,wmutex:semaphore∶=1,1; readcount:integer∶=0; 合作进程 begin parbegin reader writer parend end 读者进程 reader: begin repeat wait(rmutex); if readcount=0 then wait(wmutex); readcount∶=readcount+1; signal(rmutex); … perform read operation; … wait(rmutex); readcount∶=readcount-1; if readcount=0 then signal(wmutex); signal(rmutex); until false; end 写者进程 writer: begin repeat wait(wmutex); perform write operation; signal(wmutex); until false; end end 补充:睡觉的理发师 问题描述 设一个理发店由n 张供等候的人就座的椅子和一个理发师(及其理发椅和理发工具)组成。当一顾客走进理发店时,若供等候的椅子上坐满了人,则离开理发店;若理发师正在为他人理发,则找个空位子坐下等待;若理发师正在休息(睡眠),则要求他为自己理发。给出解此问题的同步算法。 信号量:customers=0;barbers=1;mutex=1 整型变量:waiting=0; 理发师进程 Begin While(true)then Begin P(customers); P(mutex); waiting:=waiting-1; V(mutex); Cut hair(); V(barbers); End End 顾客进程 Begin P(mutex); If (waitingn) then Begin waiting=:waiting+1; V(customers); V(mutex); P(barbers); Get_haircut(); End Else Begin V(mutex); End End 3.5 进程通信 进程通信的类型(掌握) 直接消息传递系统(理解) 信箱通信(了解) 直接消息传递系统实例(理解) 进程通信 指进程之间的信息交换。由于进程的互斥与同步,需要在进程间交换一定的信息,故不少学者将它们也归为进程通信,但只能把它们称为低级进程通信。 缺点 ①效率低; ②通信对用户不透明。 高级通信 在进程之间要传送大量数据时,应当利用OS提供的高级通信工具. 特点 ①使用方便:通信过程对用户是透明的,减少了通信程序编制上的复杂性; ②高效地传送大量数据,用户可直接利用高级通信命令(原语),高效地传送大量的数据。 3.5.1 进程通信的类型 共享存储器系统 消息传递系统 管道通信 1.共享存储器系统 在共享存储器系统中内存将被开辟一个共享存储区,相互通信的进程通过该共享存储区进行通信。 1.共享存储器系统 通信步骤 (1)申请共享存储区。 (2)连接共享存储区到进程的存储空间。 (3)互斥访问共享存储区。 (4)归还共享存储区。 2.消息传递系统 进程间的数据交换,是以格式化的消息(也称为报文)为单位的。程序员直接利用操作系统提供的一组通信命令(原语),实现大量数据的传递,通信过程对用户是透明的。 2.消息传递系统 直接通信方式: 发送进程利用OS所提供的发送命令,直接把消息发送给目标进程; 间接通信方式: 进程之间的通信,通过中间实体(也称为信箱)来暂存发送进程发送给目标进程的消息,接收进程则从该实体中发送给自己的消息。 3.管道 所谓“管道”,是指用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件 3.5.2 直接消息传递系统 直接通信原语 显式通信 Send(Receiver,message); 发送一个消息给接收进程; Receive(Sender,message); 接收Sender发来的消息; 隐式方式 在某些情况下,接收进程可与多个发送进程通信,因此,它不可能事先指定发送进程。例如,用于提供打印服务的进程,它可以接收来自任何一个进程的“打印请求”消息。对于这样的应用,在接收进程接收消息的原语中的源进程参数,是完成通信后的返回值,接收原语可表示为: Receive (id,message); 2.消息的格式 消息的格式: type message buffer=record sender;发送者进程标识符 size;消息长度 text;消息正文 next;指向下一个消息缓冲区的指针 end 3.进程同步方式 (1)发送进程阻塞,接收进程阻塞。 这种情况主要用于进程之间紧密同步,发送进程和接收进程之间无缓冲时。 (2) 发送进程不阻塞、接收进程阻塞。 这是一种应用最广的进程同步方式。平时,发送进程不阻塞,因而它可以尽快地把一个或多个消息发送给多个目标;而接收进程平时则处于阻塞状态, 直到发送进程发来消息时才被唤醒。 (3)发送进程和接收进程均不阻塞。 这也是一种较常见的进程同步形式。平时,发送进程和接收进程都在忙于自己的事情,仅当发生某事件使它无法继续运行时,才把自己阻塞起来等待。 4.通信链路(communication) 两种方式建立通信链路 ⑴由发送进程在通信之前,用显式的“建立连接”命令(原语),请求系统为之建立一条通信链路,在链路使用完后拆除链路。 ⑵发送进程无须明确提出建立链路的请求,只须利用系统提供的发送命令(原语),系统会自动地为之建立一条链路。 4.通信链路(communication) 根据通信方式的不同,则又可把链路分成两种 ①单向通信链路,只允许发送进程向接收进程发送消息,或者相反; ②双向链路,既允许由进程A向进程B发送消息,也允许进程B同时向进程A发送消息。 3.5.3 信箱通信 1.信箱Mailbox)的结构 (1)信箱头,用以存放有关信箱的描述信息,如信箱标识符、信箱的拥有者、信箱口令、信箱的空格数等; (2)信箱体,由若干个可以存放消息(或消息头)的信箱格组成,信箱格的数目以及每格的大小,是在创建信箱时确定。在消息传递方式上,最简单的情况是单向传递,消息的传递也可以是双向的。 2.信箱的类型 (1)私用信箱: 用户进程可为自己建立一个新信箱,并作为该进程的一部分,当拥有该信箱的进程结束时,信箱也随之消失; (2)公用信箱: 由操作系统创建,并提供给系统中的所有核准进程使用,核准进程既可把消息发送到该信箱中,也可从信箱中读取发送给自己的消息; (3)共享信箱: 由某进程创建,在创建时或创建后,指明它是可共享的,同时须指出共享进程(用户)的名字。 3.信箱通信原语 将一个消息发送到指定信箱 Send(mailbox,message) 从指定信箱中接收一个消息 Receive(mailbox,message) 3.5.4 直接消息传递系统实例 消息缓冲队列通信系统中的数据结构 发送原语 接收原语 1.消息缓冲队列通信系统中的数据结构 (1)消息缓冲区 type message buffer=record sender; 发送者进程标识符 size; 消息长度 text; 消息正文 next; 指向下一个消息缓冲区的指针 end 1.消息缓冲队列通信系统中的数据结构 (2) PCB中有关通信的数据项 type processcontrol block=record … mq; 消息队列队首指针 mutex; 消息队列互斥信号量 sm; 消息队列资源信号量 … end 2.发送原语 2.发送原语 procedure send(receiver,a) begin getbuf(a.size,i);//根据a.size申请缓冲区; i.sender:= a.sender;//将发送区a中的信息复制到消息缓冲区i中; i.size:=a.size; i.text:=a.text; i.next:=0; getid(PCB set,receiver.j);//获得接收进程内部标识符; wait(j.mutex); insert(j.mq,i); // 将消息缓冲区插入消息队列; signal(j.mutex); signal(j.sm); end 3.接收原语 procedure receive(b) begin j:= internal name;// j为接收进程内部的标识符; wait(j.sm); wait(j.mutex); remove(j.mq,i);// 将消息队列中第一个消息移出; signal(j.mutex); b.sender:=i.sender;//将消息缓冲区i中的信息复制到接收区b; b.size:=i.size; b.text:=i.text; end 3.5.5 线.互斥锁(mutex) 互斥锁是一种比较简单的同步机制、用于实现线程对共享资源的互斥访问。 由于操作互斥锁的时间和空间开销都较小,因而较适合于高频度使用的关键共享数据和程序段。 ★互斥锁的状态:开锁(unlock)、关锁(lock)状态。 ★对互斥锁进行操作的命令(函数):关锁lock、开锁操作unlock、 TRYLOCK 。 ★操作过程描述 ★TRYLOCK命令 当一个线程在利用TRYLOCK命令去访问mutex时,若mutex处于开锁状态,TRYLOCK将返回一个指示成功的状态码; 反之,若mutex处于关锁状态,则TRYLOCK并不会阻塞该线程,而只是返回一个指示操作失败的状态码。 2.条件变量 ★引入 在许多情况下,只利用mutex来实现互斥访问,可能会引起死锁,为此而引入了条件变量。 ★概念 每一个条件变量通常都与一个互斥锁一起使用,亦即,在创建一个互斥锁时,便联系着一个条件变量。单纯的互斥锁用于短期锁定,主要是用来保证对临界区的互斥进入。而条件变量则用于线程的长期等待,直至所等待的资源成为可用的。 ★实现方式 Lock mutexLock mutex check data structures; mark resource as free; while(resource busy); unlock mutex; wait(condition variable); wakeup(condition variable); mark resource as busy; unlock mutex; 3.信号量机制 为了提高效率,可为线程和进程分别设置相应的信号量。 (1)私用信号量:当某线程需利用信号量来实现同一进程中各线程之间的同步时,可调用创建信号量的命令来创建一私用信号量,其数据结构是存放在应用程序的地址空间中。私用信号量属于特定的进程所有,OS并不知道私用信号量的存在,一旦发生私用信号量的占用者异常结束或正常结束,但并未释放该信号量所占有空间的情况时,系统将无法使它恢复为0(空),也不能将它传送给下一个请求它的线)公用信号量:是为实现不同进程间或不同进程中各线程之间的同步而设置的。由于它有着一个公开的名字供所有的进程使用,故而把它称为公用信号量。其数据结构是存放在受保护的系统存储区中,由OS为它分配空间并进行管理,故也称为系统信号量。如果信号量的占有者在结束时未释放该公用信号量,则OS会自动将该信号量空间回收,并通知下一进程。可见,公用信号量是一种比较安全的同步机制。 小结 reader: begin repeat wait(rmutex); if readcount=0 then wait(wmutex); readcount∶=readcount+1; signal(rmutex); … perform read operation; … wait(rmutex); readcount∶=readcount-1; if readcount=0 then signal(wmutex); signal(rmutex); until false; end writer: begin repeat wait(wmutex); perform write operation; signal(wmutex); until false; end 消息的格式: type message buffer=record sender;发送者进程标识符 size;消息长度 text;消息正文 next;指向下一个消息缓冲区的指针 end Process A写 Process B读 共享文件 pipe 通信机制 第一消息缓冲区 : mq消息队列 mutex互斥指针 sm同步指针 PCB(B) Sender:A Size:5 Text:Hello Nptr : receive(b) : 发送者:A 长度:5 正文:Hello b? 0 : send(B,a) : 发送者:A 长度:5 正文:Hello a? 发送 接收 图3-4 发送与接收消息过程 进程A 进程B 生产者 进程 临界资源 消费者 进程 满 空 out in 满 空 out in wait(empty) (1)?empty:=empty-1; (2)?如果empty≥0,则表示有资源,该进程继续执行;如果empty0,则生产者进程被置成阻塞状态,并使其在empty信号量的队列中等待 满 空 out in signal(full) (1) full:=full+1; (2)如果full0,则该进程继续执行;如果full≤0,则释放full信号量队列的排头等待者并清除其阻塞状态 满 空 out in wait(full) (1)?full:=full-1; (2)?如果full≥0,则表示有资源,该进程继续执行;如果full0,则消费者者进程被置成阻塞状态,并使其在full信号量的队列中等待 满 空 out in signal(empty) (1) empty:=empty+1; (2)如果empty 0,则该进程继续执行;如果empty ≤0,则释放empty信号量队列的排头等待者并清除其阻塞状态 producer: begin repeat …… produce an item in nextp; wait(empty); wait(mutex); buffer(in):=nextp; in:=(in+1) mod n; signal(mutex); signal(full); until false end consumer: begin repeat wait(full); wait(mutex); nextc:= buffer(out) ; out:=(out+1) mod n; signal(mutex); signal(empty); consumer the item in nextc; until false; end 文件 写者 进程 读者 进程 读者 进程 . . . 写者 进程 . . . 文件 写者 进程 读者 进程 读者 进程 . . . 写者 进程 . . . * * 同步 进程之间的一种通信方式,有时序上的制约关系,或者说是进程之间为了协同工作而存在的一种等待关系。 互斥 进程之间对临界资源的一种竞争关系,排他性地对资源的访问方式。 程序1 Y=Y+1 output 程序2 Y=Y+2 output 内存共享区Y pcb1 pcb2 程序1 Y=Y+1 output 程序2 Y=Y+2 output 内存共享区Y pcb1 pcb2 临界区 代码示例 repeat entry section critical section exit section remainder section until false c语言描述 int TS(int lock) { int a; a=lock; lock=1; return(a); } 返回值:lock为true,返回true,lock为false,返回false 思考:在临界区时,lock的值是什么? struct semaphore { int value; list l; } *

  9分达人雅思写作线年度中考数学专题复习第十四讲二次函数的图象和性质(含详细参考 答案).doc

  结构思考力=STRUCTURE+THINKING_13612203.pdf

  汪博士解读PMP考试(助你吃透PMBOK指南第六版) - 第五版-汪小金-著.pdf

http://disyu.com/tongbutongxinliang/624.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有