




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、4.3.6 会 合 (Rendezvous) P/V操作、管程等同步机制 适合于单机系统及具有公共内存的多CPU系统; 会合适合于不具有公共内存的分布式系统; 80年代, Ada, Initiated by DOD; Ada 95, (Object-oriented) 会 合: 两个并发执行流汇集到一处。并发执行流:调用;接受均发生, 握手, 同步。 共享变量与访问进程在同一存储区, 不适合分布环境。 分布系统:P/V 操作问题4.3.6 会 合(Cont.)共享变量( 被动 )CR1P1:CR2P2: 分布系统:管程问题 管程与调用进程在同一存储区, 不适合分布环境。P1:共享变量CR2管程
2、(被动):CR1P2:分布系统中的同步机制应避开被动成分4.3.6 会 合(Cont.) 会合图示 被调用者代调用者执行调用代码。4.3.6.1 会合的描述调用语句调用语句接受语句选择语句任 务task任 务task任 务task不同主机中主动成分进程直接相互作用:会合同步机制。 会合描述: 一个任务可有多个入口,每个入口对应一段程序; 一个任务调用另一个任务的入口, 被调任务接受该调用,会合发生; 调用者发出调用请求,被调者未接受该调用,调用者等待; 被调者要接受调用,而当前尚无调用者时,被调用者等待; 当多个任务调用某任务的同一个入口时, 被调用者按先来先服务(FCFS)的次序接受调用;
3、入口处可以携带调用参数,还可以有返回参数, 以实现信息的交换; 被调用者可以选择会合的入口。 先到达会合处者等待后到达者。4.3.6.1 会合的描述(Cont.)会合描述的图示:调用语句PCBPCB入口调用语句PCBPCB入口select调用任务被调用任务入口队列(FIFO)4.3.6.1 会合的描述(Cont.)Ada实现会合的核心语句:1. 调用语句 . ;2. 接受语句 accept do end 形参表中可有入参数和出参数,分别用保留字 in 和 out 来区分。 由于分布系统中没有公共内存,故形参全为值参,且不可为指针。 4.3.6.1 会合的描述(Cont.)accept 语句的语
4、义: 若无调用者,则等待; 选取第一个调用者; 会合开始,调用者等待; 若有 in 参数,则取 in 参数; 若有,则执行之; 若有 out 参数,则送 out 参数; 会合结束,调用者继续。会合期4.3.6.1 会合的描述(Cont.)accept 语句流程有调用者选取队列中第一个调用者会合开始,调用者等待有 in 参数取 in 参数等 待有语句序列执行语句序列有 out 参数送 out 参数会合结束,唤醒调用者TFFFFTTT4.3.6.1 会合的描述(Cont.)例4-10 (分布系统会合例):单一资源管理task single_resource is entry require ; e
5、ntry release ;end single_resource;task body single_resource is begin loop accept require; accept release; end loop end single_resource;single_resource.require; 使用single_resource.release;single_resource.require; 使用single_resource.release;HOST1HOST24.3.6.1 会合的描述(Cont.)3. 选择语句: 同一时刻多个入口均有调用者时, 可通过selec
6、t 语句选择一个入口的调用者与被调者会合。4.3.6.1 会合的描述(Cont.)select when = ; or when = ; else end select ;如果select语句中的某接受语句 A 之前的when条件为真, 或 A 前面无when语句,则称A为开放的接受语句。4.3.6.1 会合的描述(Cont.)select 语句的语义: 计算所有布尔表达式,为真者对应标记开放; 无开放的: 如果有ELSE部分则执行Selse ,否则异常; break; 无被调用的开放的 (此时有开放的accept): 如果有ELSE部分,则执行Selse,break; 否则被调用者等待; 任
7、取一开放的且被调用的: 会合开始,调用者等待; 若有 in 参数,则取 in 参数; 若有,则执行之; 若有 out 参数,则送 out 参数; 会合结束,调用者继续。会合期4.3.6.1 会合的描述(Cont.)select 语句流程计算所有布尔表达式为真者对应标记开放有开放的有else部分F有被调用的开放的T有else部分F等 待F会合开始,调用者等待有 in 参数有语句序列F取 in 参数T执行语句序列T有 out 参数F送 out 参数Telse部分T建立异常条件Felse部分TF会合结束,调用者继续任取一开放且被调用的T客 栈Master 主人4.3.6.2 会合的例子 例4-11
8、客栈问题 客栈问题描述 客栈限制:一份猎物 一份面包一份三明治一位客人主人活动: 接受猎物 接受面包 做三明治 给探险者.Explorers探险者Baker面包师Hunter狩猎者到客栈取一个三明治在外吃猎物交给客栈主人面包交给客栈主人explorers:loop 探 险 进客栈 取三明治 出客栈 吃三明治end loophunter:loop 狩 猎 进客栈 送猎物 出客栈end loopbaker:loop 做面包 进客栈 送面包 出客栈end loop入口进程定义 入口入口4.3.6.2 会合的例子(Cont.) 例4-11 客栈问题任务及入口定义:procedure Adalodge
9、is task type explorer ; task hunter ; task baker ; task master is entry delivermeat ; /狩猎者送猎物 entry deliverbread ; /面包师送面包 entry lodge ; /探险家取三明治 end master ;4.3.6.2 会合的例子(Cont.) 例4-11 客栈问题task body explorer is victuals : food ; begin loop explore ; master.lodge (victuals) ; /入客栈取三明治 eat ( victuals
10、) ; end loop end explorer ;探险者任务:4.3.6.2 会合的例子(Cont.) 例4-11 客栈问题task body hunter is walrus : food ; begin loop hunt ( walrus ) ; master.delivermeat (walrus) end loop end hunter ;狩猎者任务:4.3.6.2 会合的例子(Cont.) 例4-11 客栈问题task body baker is rolls : food ; begin loop bake ( rolls ) ; master.deliverbread ( r
11、olls ) end loop end baker ;面包师任务:4.3.6.2 会合的例子(Cont.) 例4-11 客栈问题task body master is bread, meat, sandwich : food ; procedure makesandwich is begin cook (meat ) ; sandwich := bread + meat ; bread := 0 ; meat := 0 ; end makesandwich ;客栈主人任务:4.3.6.2 会合的例子(Cont.) 例4-11 客栈问题begin /master开始 bread := 0 ; m
12、eat := 0; sandwich := 0 ; loop select when bread=0 = accept deliverbread ( br: in food) do bread := br; end deliverbread; or when meat=0 = accept delivermeat(mt: in food) do meat := mt ; end delivermeat ; or客栈主人任务:4.3.6.2 会合的例子(Cont.) 例4-11 客栈问题 when (sandwich0)or (bread0 and meat0) = accept lodge (
13、snack: out food ) /入店取三明治 do if sandwich=0 then makesandwich end if ; snack := sandwich ; end lodge ; sandwich := 0 /会合期之外。该语句里外都行客栈主人任务:4.3.6.2 会合的例子(Cont.) 例4-11 客栈问题explorers: array 1 . Numberofexploers of explorer;begin null; end Adalodge ; else if ( bread 0 ) and ( meat 0 ) and ( sandwich = 0 )
14、 then makesandwich end if /栈主人活动 end select end loopend master客栈主人任务:4.3.6.2 会合的例子(Cont.) 例4-11 客栈问题用 Ada 语言中的会合解决读者/写者问题,要求写者优先。即编写一个任务,其中有如下四个入口: start_read; finish_read; start_write; finish_write. 提示:可以使用嵌套的 accept 语句。4.3.6.2 会合的例子(Cont.) 例4-12 读者-写者问题task readers_writers is entry start_read ; en
15、try finish_read ; entry start_write ; entry finish_write ;end readers_writes ;task body readers_writers is var read_count , write_count : integer;begin read_count := 0; write_count := 0 ; loop select4.3.6.2 会合的例子(Cont.) 例4-12 读者-写者问题when write_count = 0 = accept start_read do read_count+; end start_
16、read; orwhen read_count 0 = accept finish_read do read_count-; end finish_read; or when (write_count 0) = accept finish_write do write_count-; end finish_write ; or 4.3.6.2 会合的例子(Cont.) 例4-12 读者-写者问题 when write_count = 0 = accept start_write do while read_count 0 do accept finish_read do read_count-
17、 ; end finish_read ; end while write_count+; end start_write;end selectend loop;end readers_writers;4.3.6.2 会合的例子(Cont.) 例4-12 读者-写者问题读者活动:readers_writes . start_read ;读操作;Readers_writers . finish_read ;写者活动:readers_writers . start_write ;写操作;readers_writers . finish_write ;4.3.6.2 会合的例子(Cont.) 例4-1
18、2 读者-写者问题task boundedbuffer is entry putin ; entry getout ;end boundedbuffer ;task body boundedbuffer is b : array 0 . k-1 of integer ; ip , op : 0 . k-1 ; count : integer ; begin ip:=0; op:=0; count:=0; loop4.3.6.2 会合的例子(Cont.) Bounded buffer problem select when (count accept putin ( item : in inte
19、ger ) do b ip := item ; ip := ( ip + 1 ) mod k ; count := count + 1 ; end putin ; or when (count 0 ) = accept getout ( item : out integer ) do item := b op ; op := ( op + 1 ) mod k ; count := count 1 ; end getout ; end select end loopend boundedbuffer ; 4.3.6.2 会合的例子(Cont.) Bounded buffer problem生产者
20、活动 do 加工一件物品 item ; boundedbuffer.putin(item) ; /物品放入箱中 while ( 1 )消费者活动:do boundedbuffer.getout(item) ; /箱中取一物品; 消耗物品 item ; while ( 1 )4.3.6.2 会合的例子(Cont.) Bounded buffer problem4.4 进程高级通信低级通信 (简单信号) 进程互斥:相关或不相关进程之间; 进程同步:相关进程之间。 高级通信 (大宗信息的交换) memory sharing message passing direct vs. indirect sy
21、mmetric vs. non-symmetric buffering vs. non-buffering4.4.1 进程通信的概念进程通信:进程之间的互斥、同步及信息交换统称为进程通信(Inter-Process Communication : IPC)。4.4.2 进程通信的模式1. 共享内存模式(shared memory)OS 提供: 公共内存; 互斥同步机制。P1P2公共内存通信实现:进程之间运用OS提供的互斥同步机制 实现对公共内存信息读/写。直接: 进程-进程间接: 进程-信箱-进程4.4.2 进程通信的模式(Cont.)2. 消息传递模式(message passing)P1s
22、endP2receiveM 进程之间无公共内存; OS 提供系统调用命令: 发送命令send 接收命令receive 消息传递过程由 OS 完成, 对用户透明。4.4.3 直接方式对称形式 (symmetric): sender and receiver name each other send ( R , message ) ; receive ( S , message ) ;send (R,M)R:直接方式: 相互通信进程在通信时,直接指定接收者 或发送者的名字。receive (S,N)S:一对一通信4.4.3 直接方式(Cont.)非对称形式 (asymmetric):多对一 onl
23、y sender names receiver send ( R , message ) ; receive ( pid , message ) ;send (R,M1)S1:send (R,M2)S2:receive (pid,N)R:传送途径: 缓冲途径、非缓冲途径C/S model4.4.3.1 有缓冲途径适用于消息传递模式、直接方式(非对称形式)。发送过程: 发送进程执行send; OS为发送进程分配缓冲区; 将send消息拷贝到缓冲区; 将缓冲区链接到接收进程的消息链中。接收过程: 接收进程执行receive; OS在接收进程的消息链中取出消息缓冲区, 并将其内容拷贝到接收进程空间;
24、 释放缓冲区。4.4.3.1 有缓冲途径(Cont.)缓冲消息通信示图:SPCBsend(R,M)M:发送者SsizetextRPCBreceive(pid,N)N:sizetext接收者Rmsg2msgn.msg1缓冲消息链是互斥区sizetextsenderlink载有消息的缓冲:消息队列互斥: var m_mutex : semaphore; (1) P ( m_mutex ) ; 入/出队列动作 ; V ( m_mutex ) ;4.4.3.1 有缓冲途径(Cont.)消息队列同步: var S_msg : semaphore; (0) 收取消息前:P ( S_msg ) ; 消息入队
25、后:V ( S_msg ) ;消息队列有入队列(发送)、出队列(接收)操作,需要互斥和同步管理。msgi:Buffer pool managementvar S_buf, b_mutex : semaphore ; (k,1)申 请:P ( S_buf ) ;P ( b_mutex ) ;头缓冲区出链;V ( b_mutex ) ;释 放:P ( b_mutex ) ;缓冲区入链头 ;V ( b_mutex ) ;V ( S_buf ) ;bufbufbufHead4.4.3.1 有缓冲途径(Cont.)发送/接收消息时,要对系统提供的缓冲池进行申请和释放操作,该缓冲池需要互斥和同步管理。假定
26、系统在缓冲池提供 k 个消息缓冲区。发送/接收原语send ( R , M ) 根据 R 找接收者; P ( S_buf ) ; P ( b_mutex ) ; 从缓冲池链头取一空 buf ; V ( b_mutex ) ; size,M,sender = buf P ( m_mutex ) ; 消息 buf 入 R 消息队列链尾; V ( m_mutex ) ; V ( S_msg ) ; receive ( pid , N ) P ( S_msg ) ; P ( m_mutex ) ; 消息队列头消息msg1出链; V (m_mutex ) ; (msg1.size,msg1.text)=
27、 N msg1.sender = pid P ( b_mutex ) ; msg1入缓冲池链头; V ( b_mutex ) ; V ( S_buf ) ;4.4.3.1 有缓冲途径(Cont.)Remarks: send/receive 为高级通信原语, 可用低级原语实现; send/receive不是真正意义的原语, 可以被中断。 每个进程的PCB中都要定义 S_msg 和 m_mutex . S_buf和b_mutex是操作系统定义的公共信号量。4.4.3.1 有缓冲途径(Cont.)适用于消息传递模式,直接方式,非对称形式。发送/接收过程:发送进程执行 send, 若接收进程未执行到
28、receive,则发送者等待;接收进程执行 receive, 若发送进程未执行到 send,则接收者等待;发送 / 接收都发生,信息由发送者复制到接收者。4.4.3.2 无缓冲途径发送/接收的同步:每个进程的PCB中两个信号量。semaphore S_m ; / 初值为 0, 用于接收者等待。semaphore S_w ; / 初值为 0, 用于发送者等待。通过通用寄存器4.4.3.2 无缓冲途径(Cont.) send(R, M):根据 R 找到消息接收者;发送消息进程个数增1, 执行V(R.S_m), 通知进程 R 要发消息 (如等待将其唤醒);等待 R 执行到 receive, 即执行
29、P ( S.S_w ) 。receive(pid, N):等待消息到达, 即执行 P (R.S_m ) ;消息由发送进程空间 M 复制到接收进程空间 N ;唤醒发送消息进程, 即执行 V (S.S_w ) 。发送/接收原语R进程Send所在进程4.4.3.2 无缓冲途径(Cont.)发送/接收示图OSHALregistersend(R,M);M:S_mS_W发送进程 Sreceived(pid,N);N:S_mS_W接收进程 R优 点:节省空间(不需要buffer)缺 点:并发性差: 发送进程需要等待接收进程执行receive 把信息复制到接收进程空间后才能继续。4.4.3.2 无缓冲途径(C
30、ont.)Mailbox(FIFO)发送 send_MB (MB,M): 将消息M发送到信箱MB.接收 receive_MB (MB,N): 从信箱MB接收消息到N.特点: multi-sender multi-receiver; multi-sender one receiver4.4.4 间接方式间接方式: 通信进程之间在通信时不指定对方名字, 而是指定一个中间媒体信箱。 又称作信箱方式。msg1msg2msg3typedef mailbox struct int in, out; /*初值均为0; 取值范围0k-1*/ semaphore s1, s2 ; ( k , 0 ) semap
31、hore mutex ; ( 1 ) message letterk ; ;mailbox mb ; /编译时并不分配空间create_MB ( mb ) ; /系统调用, 为mb分配空间delete_MB ( mb ) ; /系统调用, 释放mb空间4.4.4 间接方式(Cont.)通信实现: 信箱即可以在操作系统空间, 也可以在用户空间。 考虑信箱在操作系统空间的通信实现。send_MB (mailbox mb; message M) P ( mb.s1 ) ; /信箱有空位? P ( mb.mutex ) ; mb.letter mb.in = M ; mb.in = ( mb.in +
32、 1 ) % k ; V ( mb.mutex ) ; V ( mb.s2 ) /消息增加一个 4.4.4 间接方式(Cont.)receive_MB(mailbox mb; message *N) P ( mb.s2 ) ; /申请消息 P ( mb.mutex ) ; *N= mb.letter mb.out ; mb.out = ( mb.out + 1 ) % k ; V ( mb.mutex ) ; V ( mb.s1 ) ; /空位增加一个4.4.4 间接方式(Cont.)4.4.4 间接方式(Cont.)creat_MB(mb);.receive_MB(mb,N);delete_
33、MB(mb); N:.send_MB(mb,M); M:OS Creat_MB Delete_MB Send_MB Receive_MBmsg1msg2msg3mailbox mb;通信实现示图(信箱在系统空间):msg1msg2msg3创建信箱的进程为信箱拥有者, 可以调用receive_MB.4.5 系统举例4.5.1 Java中的管程类似管程的对象object每个object有一个互斥锁lock,一般未用;说明为synchronized的method启用互斥锁;每个object内部有一个等待队列;wait() : 释放lock, 状态改为blocked, 进入wait set.notif
34、y() :在wait set中取任意线程,移到entry set, 状态改为runnable. (Signal and continue)notifyAllwait set所有线程移到entry set, 状态改为runnable.4.5.1 Java中的管程(Cont.)entry set and wait setObjectLock ownerentry setwait setAcquire locknotify(), notifyAll()wait()4.5.1 Java中的管程(Cont.)entry set and wait set锁的持有者执行 wait 操作, 状态改为block
35、ed, 释放所持有的锁 , 进入 wait set ; 若 entry set 非空 , 选择其一进入同步方法。锁的持有者执行 notify 操作 , 任选 wait set 上的一个线程 , 入 entry set , 状态改为 runnable . 执行notify操作的线程继续。锁的持有者执行 notifyAll 操作 , wait set 上的所有线程出 wait set , 入 entry set , 状态改为 runnable . 执行notifyAll操作的线程继续。例:生产/消费问题public class BoundedBuffer /*类定义开始*/public Bound
36、edBuffer ( ) /*缓冲区变量定义*/ count=0; in=0; out=0; buffer = new Object BUFFER_SIZE ; private static final int BUFFER_SIZE=5;private int count, in, out ;private Object buffer ;4.5.1 Java中的管程(Cont.)4.5.1 Java中的管程(Cont.)例:生产/消费问题(Cont.)public synchronized void enter(Object item) while ( count = BUFFER_SIZE
37、 ) try wait(); /被唤醒后重新检测等待条件 catch (InterruptedException e) count+; buffer in = item ; in = ( in+1 ) % BUFFER_SIZE ; notify ( ) ; 4.5.1 Java中的管程(Cont.)例:生产/消费问题(Cont.)public synchronized Object remove ( ) while ( count = 0 ) try wait(); catch (InterruptedException e) count - ; item = buffer out ; ou
38、t = ( out + 1 ) % BUFFER_SIZE ; notify ( ) ; return ( item ) ; /*类定义结束*/4.5.1 Java中的管程(Cont.)例:生产/消费问题(Cont.)生产者活动:do 加工一件物品item; pc.enter( item ); while ( 1 )消费者活动:do item=pc.remove; 消耗物品item; while ( 1 )BoundedBuffer pc; /*定义对象 pc */4.5.1 Java中的管程(Cont.)例:读者/写者问题public class Database /* 类定义开始 */pu
39、blic Database ( ) readcount = 0 ; dbReading = false ; dbWriting = false ; private int readercount;private boolean dbReading;private boolean dbWriting;4.5.1 Java中的管程(Cont.)例:读者/写者问题(Cont.)public synchronized void startRead ( ) while ( dbWriting = true ) try wait ( ) ; catch(InterruptedException e) re
40、adcount + ; if ( readcount = 1 ) dbReading = true ; public synchronized void endRead() readcount - ; if ( readcount = 0 ) dbReading = false ; notifyAll () ;4.5.1 Java中的管程(Cont.)例:读者/写者问题(Cont.)public synchronized void startWrite ( ) while(dbReading=true|dbWriting=true) try wait(); catch (Interrupted
41、Exception e) dbWriting=true;public synchronized void endWrite ( ) dbWriting=false; notifyAll(); /*类定义结束*/4.5.1 Java中的管程(Cont.)Java synchronization rulesA thread that owns the lock for an object can enter another synchronized method (or block) for the same object.A method can nest synchronized method
42、 invocation for different objects. Thus a thread can simultaneously own the lock for several different objects.If a method is not declared as synchronized, then it can be invoked regardless of lock ownership, even while another synchronized method for the same object is executing. If the wait set fo
43、r an object is empty, then a call to notify() or notifyAll() has no effect.4.5.2 Linux进程通信4.5.2.1 共享内存textdata栈共享存储区进程P的逻辑空间textdata栈进程Q的逻辑空间内存空间共享内存通信keysizeshmaddrpagetable其它shmid:共享存储区表AABB4.5.2.1 共享内存(Cont.)(1) 共享存储区建立int shmget(key, size, shmflg)key_t key; int size, shmflg; 检查共享存储区表,查找与key相同的表项
44、。 若有,则该区已建立,返回shmid。 若无,且shmflg=IPC_CREAT、size合法, 则分配页表及相应页面; 根据参数key、size和shmflg, 在共享存储区表中填写新的表项,返回共享存储区描述符。4.5.2.1 共享内存(Cont.)(2) 共享存储区的附接char *shmat(shmid, shmaddr, shmflg)int shmid, shmflg; char *shmaddr;shmid: shmget返回的共享存储区描述符;shmaddr: 共享存储区对应的 进程虚拟空间的起始地址;shmflg: 读写标志。 等于SHM_RDONLY表示只读; 等于0表示
45、可读写;函数返回值:共享存储区对应进程空间的虚拟地址。共享区首地址?4.5.2.1 共享内存(Cont.)(3) 共享存储区的分离int shmdt( shmaddr )char *shmaddr;shmaddr: 要分离的虚拟地址, 即shmat返回的虚拟地址。4.5.2.1 共享内存(Cont.)(4) 共享存储区使用例:进程P: char * A; shmid0=shmget(key0 ,1024, IPC_CREAT); A*shmat(shmid0, A, SHM_RDONLY); ; i=shmdt( A );进程Q: char *B; shmid0=shmget(key0 ,10
46、24, IPC_CREAT); B*shmat(shmid0, B, 0); ; i=shmdt( B );4.5.2.2 signal、pipe与持久对象Signal是一种软件中断, 通知程序某种事件的发生。Signal产生: 按下CTRL+C产生SIGINT; 硬件中断, 如除0, 非法内存访问(SIGSEV)等; Kill 函数可以对进程发送Signal; Kill命令。实际上是对Kill函数的一个包装; 软件中断: 当Alarm Clock超时(SIGURG); 当Reader中止之后又向管道写数据 (SIGPIPE).4.5.2.2 signal、pipe与持久对象pipe是用于进程
47、间传递消息。持久对象(persistent object)可以被进程创建和撤销,也可能被移到后备存储器中。4.5.3 Windows 2000/XP 的并发控制同步对象Win32应用程序接口功能描述信号量CreateSemaphore创建一个信号量变量,由参数给出初值。OpenSemaphore打开已经存在的信号量对象,返回句柄。ReleaseSemaphore释放对信号量对象的引用。互斥锁CreateMutex创建一个新互斥锁对象。OpenMutex打开已经存在的互斥锁对象,返回句柄。ReleaseMutex释放对互斥对象的占有。事 件CreateEvent创建一个事件对象。OpenEven
48、t打开事件对象,返回句柄。SetEvent设置事件对象为有信号状态。ResetEvent重置事件对象。PulseEvent探测事件对象。临界区InitializeCriticalSection初始化一个临界区对象。EnterCriticalSection等待进入临界区,得到使用权时返回。TryEnterCriticalSection以非等待方式申请临界区互斥权,申请失败则返回0。LeaveCriticalSection释放一个临界区的使用权。DeleteCriticalSection撤销临界区对象。UNIX进程高级通讯机制Pipe: an unnamed file with two fds ,
49、 one for write, and the other for read. The size of pipe file is limited to 4 blocks(one block is 512 bytes). int fd 2 ; pipe ( fd ) : 功能:创建一个pipe文件返回:fd 0: 读描述符; fd 1: 写描述符。pipe 可以被子进程继承.管道读/写:write(fd1,buf1,count1);/将buf1中count1个字节写入管道;read(fd0,buf2,count2);/把管道中count2个字节读到buf2.无名管道UNIX进程高级通讯机制(Cont.)实现特点: pipe作为文件, 需要两次I/O, 但一般不会真正执行I/O操作。pipe文件大小的限制 (Eg. 2k), 循环使用, 避免缓冲资源紧张;缓冲与延迟写(delayed write), 写到内存缓冲区, 只要内存资源不紧张, 缓冲区不另作它用, 不会写到外存; 读时可在内存缓冲区中得到。基于文件系统实现, 与文件统一的界面;管道数据读出后就清除。缓冲区通讯方式UNIX进程高级通讯机制(Cont.) 管道读规则 管道写端不存在: 所有进程都关闭了写端。 则认为已经读到了数据的末尾, 读函数返回的读出字节数为0; 管道写端关闭后, 写
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年房地产企业风险管理与财务稳健性:行业分析与风险应对报告
- 2025年智能家居系统互联互通标准下的智能家居设备互联互通性产业链价值研究报告
- 砍伐林木合同转让协议书
- 机关文明健康协议书模板
- 糖尿病健康管理合同协议
- 研发写字楼租赁合同范本
- 船坞甲板加工合同协议书
- 电梯销售合同终止协议书
- 独栋办公楼租赁合同范本
- 理发店合伙合同协议模板
- 道路交通事故安全警示教育培训
- 中俄运输合同范例
- 2025年小红书账号经营权转协议
- (新版)口腔执业医师资格考试(重点)题(附答案)
- 初中语文教材结构分析课件
- 植入物的处置流程
- 基于核心素养的单元整体教学设计
- 《看病歌诀》全文背诵版
- 《彩妆的库存管理》课件
- 影视剧后期制作合作协议
- GB/T 15972.40-2024光纤试验方法规范第40部分:传输特性的测量方法和试验程序衰减
评论
0/150
提交评论