首页计算机计算机软件计算机操作系统 05 第四章 互斥同步与通讯(2).pptx

05 第四章 互斥同步与通讯(2).pptx

页数:79页文件大小:288.8 KB来源: 计算机操作系统ppt课件

本课件承接同步与通信主题,讲解适合分布式环境的会合机制及其与信号灯、管程的转换关系,并通过大量例题演示同步原语的正确性分析、死锁风险与常见编程陷阱,适合已掌握基本同步原语后的进阶练习。

4.3.6 会合,P/V操作、管程等同步机制适合于单机系统及具有公共内存的多CPU系统;并发执行流:调用
4.3.6 会合共享变量,分布系统:P/V操作问题;共享变量与访问进程在同一存储区,不适合分布环境
4.3.6 会合,分布系统:管程问题;管程与调用进程在同一存储区,不适合分布环境
查看本课件的文字版(共 79 页,供检索与复制)

第1页:4.3.6 会合

  • (Rendezvous)
  • P/V操作、管程等同步机制适合于单机系统及具有公共内存的多CPU系统;
  • 会合适合于不具有公共内存的分布式系统;
  • 80年代, Ada, Initiated by DOD;Ada 95, (Object-oriented)
  • 会合:两个并发执行流汇集到一处。
    • 并发执行流:调用;接受
    • 均发生,握手,同步。

第2页:4.3.6 会合共享变量

    • 共享变量与访问进程在同一存储区,不适合分布环境。
  • 分布系统:P/V操作问题

第3页:4.3.6 会合

  • 分布系统:管程问题
    • 管程与调用进程在同一存储区,不适合分布环境。P1:…共享变量CR2管程(被动):…CR1P2:……分布系统中的同步机制应避开被动成分

第4页:@B1@会合

  • 会合图示
    • 被调用者代调用者执行调用代码。4.3.6.1会合的描述调用语句调用语句接受语句选择语句任务task任务task任务task不同主机中主动成分—进程直接相互作用:会合同步机制。

第5页:4.3.6.1 会合的描述

  • 会合描述:
  • 一个任务可有多个入口,每个入口对应一段程序;
  • 一个任务调用另一个任务的入口,被调任务接受该调用,会合发生;
  • 调用者发出调用请求,被调者未接受该调用,调用者等待;
  • 被调者要接受调用,而当前尚无调用者时,被调用者等待;
  • 当多个任务调用某任务的同一个入口时,被调用者按先来先服务(FCFS)的次序接受调用;
  • 入口处可以携带调用参数,还可以有返回参数,以实现信息的交换;
  • 被调用者可以选择会合的入口。先到达会合处者等待后到达者。

第6页:4.3.6.1 会合的描述(续)

会合描述的图示:……调用语句……PCBPCB………入口<accept>……调用语句……PCBPCB…入口<accept>……select调用任务被调用任务入口队列(FIFO)

第7页:4.3.6.1 会合的描述(续3)

  • Ada实现会合的核心语句:
  • 1.调用语句<任务名称> . <入口名称> [ <实参表> ] ;
  • 2.接受语句accept <入口名称> [<形参表>][ do <语句序列> end<入口名称> ]
    • 形参表中可有入参数和出参数,分别用保留字in和out来区分。
    • 由于分布系统中没有公共内存,故形参全为值参,且不可为指针。

第8页:4.3.6.1 会合的描述(续4)

  • accept语句的语义:
  • 若无调用者,则等待;
  • 选取第一个调用者;
  • 会合开始,调用者等待;
  • 若有in参数,则取in参数;
  • 若有<语句序列>,则执行之;
  • 若有out参数,则送out参数;
  • 会合结束,调用者继续。会合期

第9页:4.3.6.1 会合的描述(续5)

accept语句流程有调用者选取队列中第一个调用者会合开始,调用者等待有in参数取in参数等待有语句序列执行语句序列有out参数送out参数会合结束,唤醒调用者TFFFFTTT

第10页:24.3.6.1 会合的描述

例4-10(分布系统会合例):单一资源管理tasksingle_resourceisentryrequire ;entryrelease ;endsingle_resource;taskbodysingle_resourceisbeginloopacceptrequire;acceptrelease;end loopendsingle_resource;single_resource.require;使用single_resource.release;single_resource.require;使用single_resource.release;HOST1HOST

第11页:3.选择语句

3.选择语句:同一时刻多个入口均有调用者时,可通过select语句选择一个入口的调用者与被调者会合。4.3.6.1会合的描述select[ when <布尔表达式>=> ]<接受语句>;[<语句序列>]{ or [ when <布尔表达式>=> ]<接受语句>;[ <语句序列>]}[ else <语句序列Selse> ]end select ;如果select语句中的某接受语句A之前的when条件为真,或A前面无when语句,则称A为开放的接受语句。

第12页:4.3.6.1会合的描述select语…

  • 4.3.6.1会合的描述select语句的语义:
  • 计算所有布尔表达式,为’真’者对应<accept>标记开放;
  • 无开放的<accept>:如果有ELSE部分则执行Selse,否则异常;break;
  • 无被调用的开放的<接受语句>(此时有开放的accept):如果有ELSE部分,则执行Selse,break;否则被调用者等待;
  • 任取一开放的且被调用的<接受语句>:
    • 会合开始,调用者等待;
    • 若有in参数,则取in参数;
    • 若有<语句序列>,则执行之;
    • 若有out参数,则送out参数;
    • 会合结束,调用者继续。会合期

第13页:4.3.6.1会合的描述select语

4.3.6.1会合的描述select语句流程计算所有布尔表达式为’真’者对应<accept>标记开放有开放的<accept>有else部分F有被调用的开放的<accept>T有else部分F等待F会合开始,调用者等待有in参数有语句序列F取in参数T执行语句序列T有out参数F送out参数Telse部分T建立异常条件Felse部分TF会合结束,调用者继续任取一开放且被调用的<accept>T

第14页:客栈Master主人4.3.6.2会合…

客栈Master主人4.3.6.2会合的例子例4-11客栈问题客栈问题描述客栈限制:一份猎物一份面包一份三明治一位客人主人活动:⑴接受猎物⑵接受面包⑶做三明治⑷给探险者...Explorers探险者Baker面包师Hunter狩猎者到客栈取一个三明治在外吃猎物交给客栈主人面包交给客栈主人

第15页:explorers

explorers:loop探险进客栈取三明治出客栈吃三明治end loophunter:loop狩猎进客栈送猎物出客栈end loopbaker:loop做面包进客栈送面包出客栈end loop入口进程定义入口入口4.3.6.2会合的例子例4-

第16页:任务及入口定义

任务及入口定义:procedureAdalodgeistask typeexplorer;taskhunter;taskbaker;taskmasterisentrydelivermeat;//狩猎者送猎物entrydeliverbread;//面包师送面包entrylodge;//探险家取三明治endmaster;4.3.6.2会合的例子例4-

第17页:task bodyexploreris…

task bodyexplorerisvictuals : food ;beginloopexplore ;master.lodge (victuals);//入客栈取三明治eat ( victuals ) ;end loopend explorer ;探险者任务:4.3.6.2会合的例子例4-

第18页:task bodyhunteriswa…

task bodyhunteriswalrus : food ;beginloophunt ( walrus ) ;master.delivermeat (walrus)end loopend hunter ;狩猎者任务:4.3.6.2会合的例子例4-

第19页:task bodyhunteriswa

task bodybakerisrolls : food ;beginloopbake ( rolls ) ;master.deliverbread ( rolls )end loopend baker ;面包师任务:4.3.6.2会合的例子例4-

第20页:task bodymasterisbr…

task bodymasterisbread, meat, sandwich : food ;proceduremakesandwichisbegincook (meat ) ;sandwich := bread + meat ;bread := 0 ;meat := 0 ;endmakesandwich;客栈主人任务:4.3.6.2会合的例子例4-

第21页:task bodymasterisbr

begin//master开始bread := 0 ; meat := 0; sandwich := 0 ;loopselectwhen bread=0 =>acceptdeliverbread ( br: in food)dobread := br;enddeliverbread;orwhen meat=0 =>acceptdelivermeat(mt: in food)domeat := mt ;enddelivermeat ;or客栈主人任务:4.3.6.2会合的例子例4-

第22页:task bodymasteri…(续)

when (sandwich<>0)or(bread<>0 and meat<>0) =>acceptlodge (snack: out food )//入店取三明治doif sandwich=0thenmakesandwichend if ;snack := sandwich ;endlodge ;sandwich := 0//会合期之外。该语句里外都行客栈主人任务:4.3.6.2会合的例子例4-

第23页:explorers

explorers: array [1 .. Numberofexploers] of explorer;begin null; end Adalodge ;elseif ( bread <> 0 ) and ( meat <> 0 )and ( sandwich = 0 )thenmakesandwichend if//栈主人活动end selectend loopend master客栈主人任务:4.3.6.2会合的例子例4-

第24页:4.3.6.2 会合的例子例

用Ada语言中的会合解决读者/写者问题,要求写者优先。即编写一个任务,其中有如下四个入口:start_read;finish_read;start_write;finish_write.提示:可以使用嵌套的accept语句。

第25页:4.3.6.2 会合的例子例(续)

taskreaders_writersisentrystart_read; entryfinish_read;entrystart_write; entryfinish_write;endreaders_writes;task body readers_writers isvarread_count , write_count: integer;begin read_count := 0; write_count := 0 ;loopselect

第26页:4.3.6.2 会合的例子例(续3)

when write_count = 0=>acceptstart_readdoread_count++;endstart_read;orwhen read_count > 0=>acceptfinish_readdoread_count--;endfinish_read;orwhen (write_count > 0)=>acceptfinish_writedowrite_count--;endfinish_write ;or

第27页:4.3.6.2 会合的例子例(续4)

when write_count = 0 =>acceptstart_writedowhileread_count > 0doacceptfinish_readdoread_count--;endfinish_read ;end whilewrite_count++;endstart_write;end selectend loop;end readers_writers;

第28页:4.3.6.2 会合的例子例(续5)

读者活动
readers_writes . start_read ;读操作;Readers_writers . finish_read ;
写者活动
readers_writers . start_write ;写操作;readers_writers . finish_write ;

第29页:4.3.6.2 会合的例子例(续6)

taskboundedbufferisentryputin;entrygetout;endboundedbuffer ;taskbodyboundedbufferisb :array[ 0 .. k-1 ]ofinteger ;ip , op :0 .. k-1 ;count :integer ;beginip:=0; op:=0; count:=0;loop4.3.6.2会合的例子Bounded buffer problem

第30页:4.3.6.2 会合的例子例(续7)

selectwhen(count < k ) =>acceptputin ( item :ininteger )dob [ ip ] := item ;ip := ( ip + 1 ) mod k ;count := count + 1 ;endputin ;orwhen(count > 0 ) =>acceptgetout ( item :outinteger )doitem := b [ op ] ;op := ( op + 1 ) mod k ;count := count–1 ;endgetout ;endselectendloopendboundedbuffer ;4.3.6.2会合的例子Bounded buffer problem

第31页:生产者活动do

生产者活动do {加工一件物品item ;boundedbuffer.putin(item);//物品放入箱中} while ( 1 )消费者活动:do {boundedbuffer.getout(item);//箱中取一物品;消耗物品item ;} while ( 1 )4.3.6.2会合的例子Bounded buffer problem

第32页:4.4 进程高级通信

  • 低级通信(简单信号)
    • 进程互斥:相关或不相关进程之间;
    • 进程同步:相关进程之间。
  • 高级通信(大宗信息的交换)
    • memory sharing
    • message passing
    • direct vs. indirect
    • symmetric vs. non-symmetric
    • buffering vs. non-buffering4.4.1进程通信的概念进程通信:进程之间的互斥、同步及信息交换统称为进程通信(Inter-Process Communication : IPC)。

第33页:4.4.2 进程通信的模式

1.共享内存模式(shared memory)OS提供:⑴公共内存;⑵互斥同步机制。P1P2公共内存通信实现:进程之间运用OS提供的互斥同步机制实现对公共内存信息读/写。

第34页:4.4.2 进程通信的模式(续)

  • 直接:进程-进程间接:进程-信箱-进程4.4.2进程通信的模式2.消息传递模式(message passing)P1sendP2receiveM
  • 进程之间无公共内存;
  • OS提供系统调用命令:
    • 发送命令send
    • 接收命令receive
  • 消息传递过程由OS完成,对用户透明。

第35页:4.4.3 直接方式

  • 对称形式(symmetric):sender and receiver name each other
    • send ( R , message ) ;
    • receive ( S , message ) ;……send (R,M)……R:直接方式:相互通信进程在通信时,直接指定接收者或发送者的名字。……receive (S,N)……S:一对一通信

第36页:4.4.3 直接方式(续)

  • 非对称形式(asymmetric):多对一only sender names receiver
    • send ( R , message ) ;
    • receive ( pid , message ) ;……send (R,M1)……S1:……send (R,M2)……S2:……receive (pid,N)……R:传送途径:缓冲途径、非缓冲途径C/Smodel

第37页:4.4.3.1 有缓冲途径适用于消息传递

  • (非对称形式)。发送过程:
  • 发送进程执行send;
  • OS为发送进程分配缓冲区;
  • 将send消息拷贝到缓冲区;
  • 将缓冲区链接到接收进程的消息链中。接收过程:
  • 接收进程执行receive;
  • OS在接收进程的消息链中取出消息缓冲区,并将其内容拷贝到接收进程空间;
  • 释放缓冲区。

第38页:4.4.3.1 有缓冲途径缓冲消息通信示

:PCB…send(R,M)……M:发送者SsizetextPCB…receive(pid,N)……N:sizetext接收者Rmsg2msgn...msg1缓冲消息链是互斥区

第39页:sizetextsenderlink载…

sizetextsenderlink载有消息的缓冲:消息队列互斥:var m_mutex : semaphore; (1)P ( m_mutex ) ;入/出队列动作;V ( m_mutex ) ;4.4.3.1有缓冲途径消息队列同步:var S_msg : semaphore; (0)收取消息前:P ( S_msg ) ;消息入队后:V ( S_msg ) ;消息队列有入队列(发送)、出队列(接收)操作,需要互斥和同步管理。msgi:

第40页:Buffer pool managem…

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有缓冲途径发送/接收消息时,要对系统提供的缓冲池进行申请和释放操作,该缓冲池需要互斥和同步管理。假定系统在缓冲池提供k个消息缓冲区。

第41页:4.4.3.1 有缓冲途径

发送/接收原语send ( R , M )根据R找接收者;P ( S_buf ) ;P ( b_mutex ) ;从缓冲池取一空buf ;V ( b_mutex ) ;size,M,sender => bufP ( 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)=>Nmsg1.sender =>pidP ( b_mutex ) ;msg1入缓冲池链;V ( b_mutex ) ;V ( S_buf ) ;

第42页:4.4.3.1 有缓冲途径(续)

  • Remarks:
  • send/receive为高级通信原语,可用低级原语实现;
  • send/receive不是真正意义的原语,可以被中断。
  • 每个进程的PCB中都要定义S_msg和m_mutex .

第43页:4.4.3.1 有缓冲途径(续3)

  • 适用于消息传递模式,直接方式,非对称形式。发送/接收过程:
  • 发送进程执行send,若接收进程未执行到receive,则发送者等待;
  • 接收进程执行receive,若发送进程未执行到send,则接收者等待;
  • 发送/接收都发生,信息由发送者复制到接收者。4.4.3.2无缓冲途径发送/接收的同步:每个进程的PCB中两个信号量。semaphore S_m ;//初值为0,用于接收者等待。semaphore S_w ;//初值为0,用于发送者等待。通过通用寄存器

第44页:4.4.3.1 有缓冲途径(续4)

  • 4.4.3.2无缓冲途径send(R, M):
  • 根据R找到消息接收者;
  • 发送消息进程个数增1,执行V(R.S_m),通知进程R要发消息(如等待将其唤醒);
  • 等待R执行到receive,即执行P ( S.S_w )。receive(pid, N):
  • 等待消息到达,即执行P (R.S_m );
  • 消息由发送进程空间M复制到接收进程空间N;
  • 唤醒发送消息进程,即执行V (S.S_w )。发送/接收原语R进程Send所在进程

第45页:4.4.3.1 有缓冲途径(续5)

4.4.3.2无缓冲途径发送/接收示图OSHALregister……………send(R,M);……………M:……S_mS_W……发送进程S……………received(pid,N);……………N:……S_m’S_W'……接收进程R

第46页:4.4.3.2 无缓冲途径

  • 优点:
    • 节省空间(不需要buffer)
  • 缺点:
    • 并发性差:发送进程需要等待接收进程执行receive把信息复制到接收进程空间后才能继续。

第47页:4.4.3.2 无缓冲途径(续)

Mailbox(FIFO)发送send_MB (MB,M):将消息M发送到信箱MB.接收receive_MB (MB,N):从信箱MB接收消息到N.特点:multi-sender⇒multi-receiver;multi-sender⇒one receiver4.4.4间接方式间接方式:通信进程之间在通信时不指定对方名字,而是指定一个中间媒体—信箱。又称作信箱方式。…msg3msg2msg1

第48页:4.4.3.2 无缓冲途径(续3)

typedefmailboxstruct {int in, out; semaphore s1, s2 ; ( k , 0 )semaphore mutex ; ( 1 )message letter[k] ;} ;mailboxmb;//编译时并不分配空间create_MB ( mb ) ;//系统调用,为mb分配空间delete_MB ( mb ) ;//系统调用,释放mb空间4.4.4间接方式通信实现:信箱即可以在操作系统空间,也可以在用户空间。考虑信箱在操作系统空间的通信实现。

第49页:4.4.4 间接方式

send_MB (mailbox mb; message M){ P ( mb.s1 ) ;//信箱有空位?P ( mb.mutex ) ;mb.letter [mb.in ] = M ;mb.in = ( mb.in + 1 ) % k ;V ( mb.mutex ) ;V ( mb.s2 )//消息增加一个}

第50页:4.4.4 间接方式(续)

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 ) ;//空位增加一个}

第51页:4.4.4 间接方式(续3)

creat_MB(mb);………….receive_MB(mb,N);…………delete_MB(mb);…………N:………….send_MB(mb,M);……………………M:OSCreat_MBDelete_MBSend_MBReceive_MB…msg3msg2msg1mailbox mb;通信实现示图(信箱在系统空间):…msg3msg2msg1创建信箱的进程为信箱拥有者,可以调用receive_MB.

第52页:4.5 系统举例

  • 4.5.1 Java中的管程类似管程的对象object
  • 每个object有一个互斥锁lock,一般未用;
  • 说明为synchronized的method启用互斥锁;
  • 每个object内部有一个等待队列;
  • wait() :
    • 释放lock,状态改为blocked,进入wait set.
  • notify() :
    • 在wait set中取任意线程,移到entry set,状态改为runnable. (Signal and continue)
  • notifyAll
    • wait set所有线程移到entry set,状态改为runnable.

第53页:4.5 系统举例(续)

4.5.1 Java中的管程entry setandwait setObjectLockownerentry setwait setAcquire locknotify(), notifyAll()wait()

第54页:4.5 系统举例(续3)

  • 4.5.1 Java中的管程entry setandwait set
  • 锁的持有者执行wait操作,状态改为blocked,释放所持有的锁,进入wait set ;若entry set非空,选择其一进入同步方法。
  • 锁的持有者执行notify操作,任选wait set上的一个线程,入entry set ,状态改为runnable .执行notify操作的线程继续。
  • 锁的持有者执行notifyAll操作, wait set上的所有线程出wait set ,入entry set ,状态改为runnable .执行notifyAll操作的线程继续。

第55页:例:生产/消费问题

例:生产/消费问题public classBounded Buffer{ public BoundedBuffer ( ){ count=0; in=0; out=0;buffer = new Object [ BUFFER_SIZE ] ;}private static finalintBUFFER_SIZE=5;privateintcount, in, out;privateObject[]buffer;4.5.1 Java中的管程

第56页:4.5.1 Java中的管程例

4.5.1 Java中的管程例:生产/消费问题publicsynchronizedvoid enter(Object item){ while ( count == BUFFER_SIZE )try{ wait();//被唤醒后重新检测等待条件}catch (InterruptedException e){ }count++;buffer [ in ] = item ;in = ( in+1 ) % BUFFER_SIZE ;notify ( ) ;}

第57页:4.5.1 Java中的管程例(续)

4.5.1 Java中的管程例:生产/消费问题publicsynchronizedObject remove( ){ while ( count == 0 ){try{ wait();}catch (InterruptedException e){ }}count--;item = buffer [ out ] ;out = ( out + 1 ) % BUFFER_SIZE ;notify ( ) ;return ( item );}}

第58页:4.5.1 Java中的管程例(续3)

4.5.1 Java中的管程例:生产/消费问题生产者活动:do {加工一件物品item;pc.enter( item );} while ( 1 )消费者活动:do { item=pc.remove;消耗物品item;} while ( 1 )Bounded Bufferpc;

第59页:4.5.1 Java中的管程例(续4)

4.5.1 Java中的管程例:读者/写者问题public classDatabase{public Database ( ){ readcount = 0 ;dbReading = false ; dbWriting = false ;}private intreadercount;private booleandbReading;private booleandbWriting;

第60页:4.5.1 Java中的管程例(续5)

4.5.1 Java中的管程例:读者/写者问题publicsynchronizedvoid startRead( ){ while ( dbWriting == true )try{ wait ( ) ;}catch(InterruptedException e){}readcount ++ ;if ( readcount == 1 ) dbReading = true ;}publicsynchronizedvoid endRead(){ readcount--;if ( readcount == 0 ) dbReading = false ;notifyAll () ;}

第61页:4.5.1 Java中的管程例(续6)

4.5.1 Java中的管程例:读者/写者问题publicsynchronizedvoid startWrite( ){ while(dbReading==true||dbWriting==true)try{ wait();}catch (InterruptedException e) { }dbWriting=true;}publicsynchronizedvoid endWrite( ){dbWriting=false;notifyAll();}}

第62页:4.5.1 Java中的管程例(续7)

  • 4.5.1 Java中的管程Java synchronization rules
  • A thread that owns the lock for an object can enteranother synchronized method (or block) for the sameobject.
  • A method can nest synchronized method invocation fordifferent objects. Thus a thread can simultaneously ownthe lock for several different objects.
  • If a method is not declared as synchronized, then it canbe invoked regardless of lock ownership, even whileanother synchronized method for the same object isexecuting.
  • If the wait set for an object is empty, then a call to notify()or notifyAll() has no effect.

第63页:4.5.1 Java中的管程例(续8)

4.5.2 Linux进程通信4.5.2.1共享内存textdata栈共享存储区进程P的逻辑空间textdata栈进程Q的逻辑空间内存空间共享内存通信其它pagetableshmaddrsizekey…………………………共享存储区表AA’BB’

第64页:4.5.2.1 共享内存

  • (1)共享存储区建立int shmget(key, size, shmflg)key_t key; int size, shmflg;{
  • ①检查共享存储区表,查找与key相同的表项。若有,则该区已建立,返回shmid。
  • ②若无,且shmflg=IPC_CREAT、size合法,则分配页表及相应页面;
  • ③根据参数key、size和shmflg,在共享存储区表中填写新的表项,返回共享存储区描述符。}

第65页:4.5.2.1 共享内存(续)

(2)共享存储区的附接char *shmat(shmid, shmaddr, shmflg)int shmid, shmflg; char *shmaddr;shmid: shmget返回的共享存储区描述符;shmaddr:共享存储区对应的进程虚拟空间的起始地址;shmflg:读写标志。等于SHM_RDONLY表示只读;等于0表示可读写;函数返回值:共享存储区对应进程空间的虚拟地址。

第66页:4.5.2.1 共享内存(续3)

(3)共享存储区的分离int shmdt( shmaddr )char *shmaddr;shmaddr:要分离的虚拟地址,即shmat返回的虚拟地址。

第67页:4.5.2.1 共享内存(续4)

  • 4.5.2.2 signal、pipe与持久对象Signals是一种软件中断,通知程序某种事件的发生。Signal产生:
  • 按下CTRL+C产生SIGINT;
  • 硬件中断,如除0,非法内存访问(SIGSEV)等;
  • Kill函数可以对进程发送Signal;
  • Kill命令。实际上是对Kill函数的一个包装;
  • 软件中断:当Alarm Clock超时(SIGURG);当Reader中止之后又向管道写数据(SIGPIPE).

第68页:4.5.2.1 共享内存(续5)

4.5.2.2 signal、pipe与持久对象pipe是用于进程间传递消息。持久对象(persistent object)可以被进程创建和撤销,也可能被移到后备存储器中。

第69页:4.5.2.1 共享内存(续6)

4.5.3 Windows 2000/XP的并发控制功能描述Win32应用程序接口同步对象创建一个信号量变量,由参数给出初值。CreateSemaphore信号量打开已经存在的信号量对象,返回句柄。OpenSemaphore释放对信号量对象的引用。ReleaseSemaphore创建一个新互斥锁对象。CreateMutex互斥锁打开已经存在的互斥锁对象,返回句柄。OpenMutex释放对互斥对象的占有。ReleaseMutex创建一个事件对象。CreateEvent事件打开事件对象,返回句柄。OpenEvent设置事件对象为有信号状态。SetEvent重置事件对象。ResetEvent探测事件对象。PulseEvent初始化一个临界区对象。InitializeCriticalSection临界区等待进入临界区,得到使用权时返回。EnterCriticalSection以非等待方式申请临界区互斥权,申请失败则返回0。TryEnterCriticalSection释放一个临界区的使用权。LeaveCriticalSection撤销临界区对象。DeleteCriticalSection

第70页:UNIX进程高级通讯机制Pipe

UNIX进程高级通讯机制Pipe:an unnamed file with two fds , one for write, andthe other for read. The size of pipe file is limited to 4blocks(one block is 512 bytes).int fd [ 2 ] ;pipe ( fd ) :功能:创建一个pipe文件返回:fd [0]:读描述符;fd [1]:写描述符。pipe可以被子进程继承.管道读/写:write(fd[1],buf1,count1);//将buf1中count1个字节写入管道;read(fd[0],buf2,count2);//把管道中count2个字节读到buf2.无名管道

第71页:UNIX进程高级通讯机制实现特点

  • UNIX进程高级通讯机制实现特点:pipe作为文件,需要两次I/O,但一般不会真正执行I/O操作。
  • pipe文件大小的限制(Eg. 2k),循环使用,避免缓冲资源紧张;
  • 缓冲与延迟写(delayed write),写到内存缓冲区,只要内存资源不紧张,缓冲区不另作它用,不会写到外存;读时可在内存缓冲区中得到。
  • 基于文件系统实现,与文件统一的界面;
  • 管道数据读出后就清除。缓冲区通讯方式

第72页:UNIX进程高级通讯机制实现特点(续)

  • UNIX进程高级通讯机制管道读规则
  • 管道写端不存在:所有进程都关闭了写端。
    • 则认为已经读到了数据的末尾,读函数返回的读出字节数为0;
    • 管道写端关闭后,写入的数据将一直存在,直到读出为止。
  • 管道写端存在:
    • 如果请求的字节数目大于PIPE_BUF,则返回管道中现有的数据字节数;
    • 如果请求的字节数目不大于PIPE_BUF,
  • 则返回管道中现有数据字节数(此时,管道中数据量小于请求的数据量);
  • 或者返回请求的字节数(此时,管道中数据量不小于请求的数据量)。

第73页:UNIX进程高级通讯机制实现特点(续3)

  • UNIX进程高级通讯机制管道写规则
  • 向管道中写入数据时, linux将不保证写入的原子性;
  • 管道缓冲区一有空闲区域,写进程就会试图向管道写入数据;
  • 如果管道缓冲区满,且读进程不读走管道缓冲区中的数据,那么写操作将一直阻塞;
  • 只有在管道的读端存在时,向管道中写入数据才有意义;否则,向管道中写入数据的进程将收到内核传来的SIFPIPE信号,应用程序可以处理该信号,也可以忽略(默认动作则是应用程序终止)。
  • 在向管道写入数据时,至少应该存在某一个进程,其中管道读端没有被关闭,否则就会出现上述错误。

第74页:UNIX进程高级通讯机制实现特点(续4)

  • Signals是一种软件中断,通知程序某种事件的发生。Signal产生:
  • 按下CTRL+C产生SIGINT;
  • 硬件中断,如除0,非法内存访问(SIGSEV)等;
  • Kill函数可以对进程发送Signal;
  • Kill命令。实际上是对Kill函数的一个包装;
  • 软件中断:当Alarm Clock超时(SIGURG);当Reader中止之后又向管道写数据(SIGPIPE).UNIX信号通讯机制

第75页:中断与信号相同点

  • 中断与信号相同点:
  • 都采用异步通信方式
  • 当检测到信号或中断时,暂停当前程序的执行,转去执行相应处理程序
  • 处理完后回到断点
  • 信号和中断都可进行屏蔽中断与信号不同点:
  • 中断有优先级,信号没有
  • 信号处理在目态,中断处理在管态
  • 中断响应是及时的,信号响应通常都有较大的延迟。UNIX信号通讯机制

第76页:Signal发生时的三种选择

Signal发生时的三种选择:
忽略Signal
大部分Signal都可以Ignore,除了SIGKILL和SIGSTOP;
捕捉Signal
可以让内核来调用我们所指定的函数。(SIGKILL和SIGSTOP无法捕捉.)
执行缺省行为
如果不做任何处理,则执行缺省动作。大部分Signal的缺省行为都是中止进程。UNIX信号通讯机制

第77页:Signal发生时的三种选择(续)

  • UNIX信号通讯机制struct proc {…char p_sig ;…} proc [ NPROC ] ;struct user {…int u_signal [ NSIG ] ;…}
  • 系统调用signal(sig, func),预置信号处理程序
    • u_signal[sig]=func;
  • func=0时接收信号进程终止自己;
  • func=1时忽略;
  • func=非0/1时为处理程序指针.
    • 进程初创时继承其父进程信号处理程序.
  • 信号发送与接收
    • 任何时候都可接收,记录在p_sig中.
  • 处理
    • 被调度选中即将由核心态转到目态.(用户处理的中断)

第78页:Windows2000/xp的管道1.…

  • Windows2000/xp的管道
  • 1.无名管道:BOOL CreatePipe(PHANDLE hReadPipe,PHANDLE hWritepipe,LPSECURITY_ATTRIBUTES lpPipeAt,DWORD nSize)
  • 2.命名管道:服务器端:\\.\pipe\PipeName;客户端:\\serverName\pipe\PipeNameCreateNamedPipe:在服务器端建立管道;ConnectNamedPipe:在服务器端等待客户连接请求;CallNamedPipe:客户进程建立与服务器管道连接;ReadFile, WriteFile:管道读写。

第79页:Windows2000/xp的mail…

Windows2000/xp的mailslot服务器端:\\.\mailslot\[path]name客户进程:\\range\mailslot\[path]namerange:本地或服务器CreatMailslot:服务器端创建邮件槽;GetMailslotInfo:服务器查询邮件槽信息;ReadFile:服务器读邮件槽;WriteFile:客户端发送消息。

顶部目录