收藏 分享(赏)

第二章 进程管理.ppt

上传人:Facebook 文档编号:2963267 上传时间:2018-09-30 格式:PPT 页数:137 大小:1,007.50KB
下载 相关 举报
第二章 进程管理.ppt_第1页
第1页 / 共137页
第二章 进程管理.ppt_第2页
第2页 / 共137页
第二章 进程管理.ppt_第3页
第3页 / 共137页
第二章 进程管理.ppt_第4页
第4页 / 共137页
第二章 进程管理.ppt_第5页
第5页 / 共137页
点击查看更多>>
资源描述

1、第二章 进程管理,2.1 进程的基本概念,2.1.1 程序的顺序执行及其特征,1. 程序的顺序执行S1: a=x+y;S2: b=a-5;S3: c=b+1;,2. 程序顺序执行时的特征,顺序性: (2) 封闭性: (3) 可再现性:,2.1.1 程序的顺序执行及其特征,2.1.2 前趋图,前趋图(Precedence Graph)是一个有向无循环图,记为DAG(Directed Acyclic Graph),用于描述进程之间执行的前后关系。结点:一个程序段或进程,乃至一条语句有向边:偏序或前趋关系把没有前趋的结点称为初始结点(Initial Node)没有后继的结点称为终止结点(Final

2、Node),每个结点还具有一个重量(Weight),用于表示该结点所含有的程序量或结点的执行时间。,前趋图中必须不存在循环,2.1.2 前趋图,2.1.3 程序的并发执行及其特征,1. 程序的并发执行,使一个程序分成若干个可同时执行的程序模块(结点)的方法称为并发程序设计,能够并发执行的程序称为并发程序。,S1: a=x+2S2: b=y+4S3: c=a+bS4: d=c+b,2.1.3 程序的并发执行及其特征,1. 程序的并发执行,2. 程序并发执行时的特征,1) 间断性 2) 失去封闭性 3) 不可再现性,2.1.3 程序的并发执行及其特征,2.1.4 程序并发执行的条件(保持可再现性)

3、,定义读集、写集 读集: 指程序 在执行期间所需参考的所有变量的集合,写集: 指程序 在执行期间要改变的所有变量的集合,Bernstein条件: 若两个程序P1和P2满足:,则程序P1和P2能并发执行,具有可再现性。 此条件也可描述为:两段程序间无共享变量或对共享变量仅有读操作,2.1.4 进程的特征与状态,1. 进程的特征和定义,1) 结构特征 2) 动态性 3) 并发性 4) 独立性 5) 异步性,进程最基本的特征 由创建而产生、由调度而执行、 由撤销而消亡,进程的重要特征 也是OS的重要特征,进程实体是一个能独立运行、独立分配资源和独立接受调度的基本单位,(1) 进程是程序的一次执行。

4、(2) 进程是一个程序及其数据在处理机上顺序执行时所发生的活动。 (3) 进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。在引入了进程实体的概念后,我们可以把传统OS中的进程定义为:“进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位”。,进程定义:,2. 进程的三种基本状态,2.1.4 进程的特征与状态,1、Ready (runnable; temporarily stopped to let another process run) 2、Running (actually using the CPU at that instant) 3、Blo

5、cked (unable to run until some external event happens),进程的三种基本状态的转换,Ready,Running,Blocked,Scheduler picks this process,Scheduler picks another process,Process blocks for input,Input becomes available,3. 挂起状态 引入挂起状态的原因 (1)终端用户的请求。 (2)父进程请求。 (3)负荷调节的需要。 (4) 操作系统的需要。,2.1.4 进程的特征与状态,进程状态的转换,活动就绪静止就绪。 (2

6、) 活动阻塞静止阻塞。 (3) 静止就绪活动就绪。 (4) 静止阻塞活动阻塞。,2.1.4 进程的特征与状态,引入挂起状态的进程状态转换图,活动就绪,静止就绪,活动阻塞,静止阻塞,执行,调度,中断,挂起,激活,唤醒,激活,挂起,唤醒,请求I/O,2.1.5 进程控制块,1. 进程控制块的作用,进程控制块的作用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其它进程并发执行的进程。或者说,OS是根据PCB来对并发执行的进程进行控制和管理的PCB是进程存在的惟一标志,2. 进程控制块中的信息,1) 进程标识符:进程标识符用于惟一地标识一个进程。一个进程通

7、常有两种标识符:内部标识符、外部标识符 2) 处理机状态 3) 进程调度信息 4) 进程控制信息,2.1.5 进程控制块,3. 进程控制块的组织方式,1) 链接方式,2.1.5 进程控制块,2) 索引方式,3. 进程控制块的组织方式,2.1.5 进程控制块,2.2 进程控制,2.2.1 进程的创建,1. 进程图(Process Graph),2. 引起创建进程的事件,用户登录。 (2) 作业调度。 (3) 提供服务。 (4) 应用请求。,2.2.1 进程的创建,3. 进程的创建(Creation of Progress),(1)申请空白PCB。 (2) 为新进程分配资源。 (3) 初始化进程控

8、制块。 (4) 将新进程插入就绪队列,如果进程就绪队列能够接纳新进程, 便将新进程插入就绪队列。,2.2.1 进程的创建,2.2.2 进程的终止,1. 引起进程终止(Termination of Process)的事件 正常结束, 异常结束异常事件常见的有: 越界错误 保护错 非法指令 特权指令错 运行超时 等待超时 算术运算错 I/O故障,2.2.2 进程的终止,1. 引起进程终止(Termination of Process)的事件 外界干预这些干预有: 操作员或操作系统干预 父进程请求 父进程终止,2. 进程的终止过程(1) 根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从

9、中读出该进程的状态。(2) 若被终止进程正处于执行状态,应立即终止该进程的执行,并置调度标志为真,用于指示该进程被终止后应重新进行调度。(3) 若该进程还有子孙进程,还应将其所有子孙进程予以终止,以防他们成为不可控的进程。(4) 将被终止进程所拥有的全部资源,或者归还给其父进程, 或者归还给系统。(5) 将被终止进程(它的PCB)从所在队列(或链表)中移出, 等待其他程序来搜集信息。,2.2.2 进程的终止,2.2.3 进程的阻塞与唤醒,1. 引起进程阻塞和唤醒的事件,1) 请求系统服务 2) 启动某种操作 3) 新数据尚未到达 4) 无新工作可做,2. 进程阻塞过程进程的阻塞是进程自身的一种

10、主动行为。 a、先立即停止执行,把进程控制块中的现行状态由“执行”改为阻塞,并将PCB插入阻塞队列 b、转调度程序进行重新调度,将处理机分配给另一就绪进程,并进行切换,亦即,保留被阻塞进程的处理机状态(在PCB中),再按新进程的PCB中的处理机状态设置CPU的环境。,2.2.3 进程的阻塞与唤醒,3. 进程唤醒过程 a、首先把被阻塞的进程从等待该事件的阻塞队列中移出 b、将其PCB中的现行状态由阻塞改为就绪 c、将该PCB插入到就绪队列中 d、进程调度或返回,2.2.3 进程的阻塞与唤醒,2.2.4 进程的挂起与激活,1. 进程的挂起首先检查被挂起进程的状态,若处于活动就绪状态,便将其改为静止

11、就绪;对于活动阻塞状态的进程,则将之改为静止阻塞。,2. 进程的激活过程先将进程从外存调入内存,检查该进程的现行状态,若是静止就绪,便将之改为活动就绪;若为静止阻塞便将之改为活动阻塞。,2.3 进程同步,2.3.1 进程同步的基本概念,1. 两种形式的制约关系,间接相互制约关系(资源共享关系) (2) 直接相互制约关系(相互合作关系),2. 临界资源(Critical Resource),临界资源:一次只允许一个进程访问的资源,2.3.1 进程同步的基本概念,2. 临界资源(Critical Resource),生产者-消费者(producer-consumer)问题:同步关系:不允许消费者进

12、程到一个空缓冲区去取产品;也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。,2.3.1 进程同步的基本概念,2. 临界资源(Critical Resource),int n; int item; int count=0;,2.3.1 进程同步的基本概念,2. 临界资源(Critical Resource),可能出现的情况: 生产时countn,无多余buffer可用 消费时count0;无消息可用,2.3.1 进程同步的基本概念,2. 临界资源(Critical Resource),int n=100,count=0; void producer(void) int item

13、; while (TRUE) produce_item( /increment count of item in bufferif (count=1) wakeup(consumer) /was buffer empty? ,2.3.1 进程同步的基本概念,2. 临界资源(Critical Resource),void consumer(void) int item; while (TRUE) if (count=0) sleep(); /if buffer is empty, go to sleep remove_item(item); /take item out of buffercou

14、nt=count-1; /decrement count of item in bufferif (count=n-1) wakeup(producer); /was buffer full?consume_item(item); /print etem ,2.3.1 进程同步的基本概念,2. 临界资源(Critical Resource),2.3.1 进程同步的基本概念,执行顺序: 1、buffer空,即count0; 2、consumer读取count的值,准备判断其是否为0 3、进程调度,执行producer,产生item放入buffer,使count加1;则count1; 4、prod

15、ucer判断count1,唤醒consumer,由于consumer并没有sleep,故唤醒信号无效; 5、进程调度,consumer继续执行,发现调度前读取的count值为0,sleep; 6、producer执行,buffer迟早要满,从而sleep 7、两个进程永远sleep,不再执行,void producer(void) int item; while (TRUE) produce_item( if (count=1) wakeup(consumer) ,void consumer(void) int item; while (TRUE) if (count=0) sleep();

16、remove_item(item);count=count-1; if (count=n-1) wakeup(producer); consume_item(item); ,Situations like this, where two or more processes are reading or writing some shared data and the final result depends on who runs precisely when, are called race conditions.,竞争条件(Race Conditions),2.3.1 进程同步的基本概念,

17、3. 临界区(critical section),临界区(CS):进程中访问临界资源的那段代码 (The part of the program where the shared memory is accessed is called the critical section),2.3.1 进程同步的基本概念,3. 临界区(critical section),可把一个访问临界资源的循环进程描述如下: repeatcritical section; remainder section; until false;,2.3.1 进程同步的基本概念,4. 同步机制应遵循的规则,空闲让进。 (2) 忙

18、则等待。 (3) 有限等待。 (4) 让权等待。,2.3.1 进程同步的基本概念,互斥与同步解决方法(软件方法),Dekker算法、Peterson算法,Dekker算法,初步设想,定义全局变量turn,值0、1分别标志进程P0和P1可以进入CS:,turn=0:P0可以进入CS turn=1:P1可以进入CS,Dekker算法,初步设想,bool turn; /*共享的全局变量,BOOL类型*/P0 P1 while turn0 do nothing while turn1 do nothingturn=1; turn=0; ,忙等 busy waiting,Dekker算法,初步设想,问题

19、:,进程严格交替进入临界区。当turn=0时,P1必须等待P0进入CS执行,退出后,才能进入CS;即使此时CS空闲,不符合空闲让进 任何进程在CS内或外失败,其它进程将可能因为等待使用CS而无法向前推进,Dekker算法,改进1,使用全局共享数组flag标志CS状态: flag0或flag1=ture:表示P0或P1占用CS flag0或flag1=false:表示CS空闲,Dekker算法,改进1,bool flag2; /*共享的全局数组,BOOL类型*/P0 P1 while flag1 do nothing while flag0 do nothing flag0=true; flag

20、1=ture;flag0=false; flag1=false; ,Dekker算法,改进1,问题:,进程在CS内失败且相应的flag=ture,则其它进程永久阻塞 不能实现互斥,如执行顺序:,bool flag2; /*共享的全局数组,BOOL类型*/P0 P1 while flag1 do nothing while flag0 do nothing flag0=true; flag1=ture;flag0=false; flag1=false; ,设flag0=flag1=false,都可进入CS,不能实现互斥,违背忙则等待,Dekker算法,改进2,改进1:先检测CS状态 改为先置标志

21、位,Dekker算法,改进2,bool flag2; /*共享的全局数组,BOOL类型*/P0 P1 flag0=true; flag1=ture; while flag1 do nothing while flag0 do nothingflag0=false; flag1=false; ,Dekker算法,改进2,问题:,不能实现有空让进,有限等待,如执行顺序:,bool flag2; /*共享的全局数组,BOOL类型*/P0 P1 flag0=true; flag1=ture; while flag1 do nothing while flag0 do nothingflag0=fals

22、e; flag1=false; ,都无法进入CS,忙等,忙等,Dekker算法,结合初步设想和改进2,得到成功的Dekker算法,P0的执行流程,flag0=ture,flag1,turn,flag0=false,turn,flag0=ture,P0进入CS,退出CS,turn=1,flag0=false,其余代码,0,1,1,1,0,0,Peterson算法,代码更简洁。 两个全局共享变量:flag0、flag1表示临界区状态及哪个进程正在占用CS 全局共享变量turn:表示能进入CS的进程序号,Peterson算法,bool flag2,turn; /*共享的全局数组,BOOL类型*/P0

23、 P1 flag0=true; flag1=ture; turn=1; turn=0; while (flag1 ,当flag1=false或turn0,即当进程1没有要求进入CS,或仅允许进程0进入CS时,P0进入CS,2.3.2 信号量机制,1. 整型信号量原子操作(Atomic Operation):wait(S)和signal(S)这两个操作一直被分别称为P、V操作wait(S): while S0 sleep();S=S-1;signal(S): S=S+1;,#define N 100 typedef int semaphore; semaphore mutex=1; /contr

24、ols access to critical semaphore empty=N; /counts empty buffer slots semaphore full=0; /counts full buffer slots void producer(void) int item; while (TRUE) produce_item( /increment count of full slots ,信号量机制解决生产消费者问题,必须成对出现,void consumer(void) int item; while (TRUE) wait(full); /decrement full count

25、wait(mutex); /enter critical regionremove_item( /do something with the item ,信号量机制解决生产消费者问题,信号量实现前驱关系,Var a,b,c,d,e,f,g; semaphore=0,0,0,0,0,0,0;beginparbeginbegin S1; signal(a); signal(b); end;begin wait(a); S2; signal(c); signal(d); end;begin wait(b); S3; signal(e); end;begin wait(c); S4; signal(f

26、); end;begin wait(d); S5; signal(g); end;begin wait(e); wait(f); wait(g); S6; end;parendend,为解决整型信号量“忙等”问题提出的。 两个数据项,2. 记录型信号量,typedef structint value; /某类资源的数目L; /信号量链表 semaphore,2.3.2 信号量机制,相应地,wait(S)和signal(S)操作可描述为: wait(S)semaphore S;S.value=S.value-1;if S.value0 block(S.L) signal(S)semaphore

27、S;S.value=S.value+1;if S.value0 wakeup(S.L); ,2. 记录型信号量,3. AND型信号量,针对进程需共享多个临界资源,2.3.2 信号量机制,AND同步机制的基本思想是:将进程在整个运行过程中需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放。只要尚有一个资源未能分配给进程,其它所有可能为之分配的资源,也不分配给他。亦即,对若干个临界资源的分配,采取原子操作方式:要么全部分配到进程,要么一个也不分配。 (AND同步,或称为同时wait操作),#define N 100 typedef int semaphore; semaphore m

28、utex=1, empty=N, full=0; int in=0, out=0; void producer(void) int nextp; while (TRUE) produce_item(nextp); /generate next item to put in bufferSwait(empty,mutex); bufferin=nextp;in=(in+1) mod N; Ssignal(mutex,full); ,AND信号量机制解决生产消费者问题,void consumer(void) int nextc; while (TRUE) Swait(full,mutex); ne

29、xtc=buffer(out);out=(out+1) mod N;Ssignal(mutex,empty); consume_item(nexpc); ,AND信号量机制解决生产消费者问题,4. 信号量集,设置阈值,资源数大于阈值,则分配资源,小于阈值,则不予分配,2.3.2 信号量机制,一般“信号量集”的几种特殊情况:(1) Swait(S, d, d)。 此时在信号量集中只有一个信号量S, 但允许它每次申请d个资源,当现有资源数少于d时,不予分配。(2) Swait(S, 1, 1)。 此时的信号量集已蜕化为一般的记录型信号量(S1时)或互斥信号量(S=1时)。(3) Swait(S,

30、1, 0)。这是一种很特殊且很有用的信号量操作。当S1时,允许多个进程进入某特定区;当S变为0后,将阻止任何进程进入特定区。换言之,它相当于一个可控开关。,4. 信号量集,2.4 经典进程的同步问题,2.4.1 生产者消费者问题,2.4.2 哲学家进餐问题,问题描述:5个哲学家,5只碗、5只筷子,1. 问题描述,利用记录型信号量解决哲学家进餐问题,筷子五个信号量构成信号量数组:semaphore chopstick4;,#define N 5 /number of philosophers viod philosopher(int i) /i: which philosopher(0 to N

31、-1) while(ture)think(); /philosopher is thinkingwait(chopsticki); /take left chopstickwait(chopsticki+1 %5); /take right chopstickeat();signal(chopsticki); /put left chopstick back on the tablesignal(chopsticki+1 %5);/put right chopstick back on the table ,存在的问题,死锁五位哲学家同时饥饿而各自拿起左边的筷子,(1) 至多只允许有四位哲学家

32、同时去拿左边的筷子,最终能保证至少有一位哲学家能够进餐,并在用毕时能释放出他用过的两只筷子,从而使更多的哲学家能够进餐。(2) 仅当哲学家的左、右两只筷子均可用时,才允许他拿起筷子进餐。 (3) 规定奇数号哲学家先拿他左边的筷子,然后再去拿右边的筷子;而偶数号哲学家则相反。按此规定,将是1、 2号哲学家竞争1号筷子;3、4号哲学家竞争3号筷子。即五位哲学家都先竞争奇数号筷子,获得后,再去竞争偶数号筷子,最后总会有一位哲学家能获得两只筷子而进餐。,解决方法,思路:,解决方法(例),1、哲学家状态数组:state表示哲学家当前状态:吃、思考、饥饿(准备拿筷子) 2、哲学家进入吃状态的前提其邻居(左

33、右)哲学家均不在吃的状态,#define N 5 /number of philosophers #define LEFT (i-1)%N /number of is left neighbor #define RIGHT (i+1)%N /number of is right neighbor #define THINKING 0 / philosopher is thinking #define HUNGRY 1 / philosopher is trying to get chopstick #define EATING 2 / philosopher is eating int sta

34、teN; /to keep track of everyones state semaphore mutex=1; /mutual exclusion for CS semaphore sN; /one semaphore per philosopher,代码:,void philosopher(int i) /i: which philosopher (0 to N-1) while (TURE)think(); / philosopher is thinkingtake_chopstick(i); /acquire two chopsticks or blockeat();put_chop

35、stick(i); /put both chopsticks back on table ,代码:,void take_chopstick(int i)/i: which philosopher (0 to N-1) wait(mutex); /enter CSstatei=HUNGRY;/recode fact that philosopher i is hungrytest(i); /try to acquire 2 chopstickssignal(mutex); /exit CSwait(si); /block if chopstick were not acquired ,void

36、test(int i)/i: which philosopher (0 to N-1) if (statei=HUNGRY ,void put_chopstick(int i)/i: which philosopher (0 to N-1) wait(mutex); /enter CSstatei=THINKING;/philosopher i has finished eatingtest(LEFT); /see if left neighbor can now eattest(RIGHT); /see if right neighbor can now eatsignal(mutex);

37、/exit CS ,semaphore chopstick4; void philosopher(int i) while(TURE)think();Sswait(chopstick(i+1) %5, chopsticki);eat();Ssignat(chopstick(i+1) % 5, chopsticki); ,利用AND信号量机制解决哲学家进餐问题,2.5 管程机制,2.5.1 管程(monitor)的基本概念,1. 管程的定义,定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程和改变管程中的数据,A monitor is a collection

38、 of procedures, variables, and data structures that are all grouped together in a special kind of module or package.,2.5.1 管程的基本概念,1. 管程的定义,管程由三部分组成: 局部于管程的共享变量说明; 对该数据结构进行操作的一组过程; 对局部于管程的数据设置初始值的语句。此外,还须为管程赋予一个名字。,type monitor-name=monitorvariable declarationsprocedure entry P1();begin end;procedur

39、e entry P2();begin end; procedure entry Pn();begin end;begininitialization code;end,管程的语法,1、目前、并发Pascal、Pascal_Plus、Modula2、Java等程序设计语言支持管程机制 2、管程本身被作为一种临界区,实现管程时,需考虑互斥、同步和控制变量等问题 3、进程可在任何需要的地方调用管程中的过程,但不能在管程外直接访问管程内的数据结构 4、任何时刻,管程中只能有一个活跃进程。管程的互斥操作通常由编译程序支持,编译时自动为每个管程建立一个初值为1的互斥信号量,说明,5、管程实现进程同步,是指

40、在管程中设置一对同步操作原语,wait和signal。与作用于信号量的wait和signal不同的是,管程中的wait和signal作用于条件变量。条件变量不具有累加功能,如果管程中的进程发出一个信号量,却没有在对应的条件变量上对应的条件变量上等待,则该信号量没有作用,会丢失。 6、进程阻塞等待的原因很多,为区别,设置不同的条件变量,将因为不同时间阻塞的进程组织在不同的队列中 7、当一个进程利用管程申请资源而不同满足时,将调用wait原语阻塞自己,并进入相应阻塞队列。当某进程释放出一个临界资源,将用signal原语唤醒等待在该临界资源上的一个阻塞进程 8、目前常用的操作系统很少采用管程机制实现

41、进程的互斥于同步,说明,2.5.2 利用管程解决生产者-消费者问题,建立管程Proclucer-Consumer, 或简称为PC。 两个过程:(1) put(item)过程(2) get(item)过程,type producer-consumer=monitorVar in,out,count:integer;buffer:array0,n-1 of item;notfull, notempty:condition;procedure entry put(item)beginif countn then notfull.wait;buffer(in) =nextp;in =(in+1) mo

42、d n;count =count+1;if notempty.queue then notempty.signal;end,条件变量,procedure entry get(item)beginif count0 then notempty.wait;nextc =buffer(out);out =(out+1) mod n;count =count-1;if notfull.quene then notfull.signal;endbegin in =out =0; count =0 end,变量初始化,则生产者和消费者可描述为:,producer:beginrepeatproduce an

43、 item in nextp;PC.put(item);until false;endconsumer:beginrepeatPC.get(item);consume the item in nextc;until false;end,2.6 进程通信,进程通信IPC:进程间的信息交换。,进程通信:低级进程通信、高级进程通信,低级进程通信:少量的信息交换,没有专门的通信机制,如信号量机制缺点:效率低,通信对用户不透明,高级进程通信:大量的信息交换,有专门的通信机制,通信对用户透明,Interprocess Communication,2.6.1 进程通信的类型,1. 共享存储器系统(Share

44、d-Memory System),基于共享数据结构的通信方式。 缺点:低效、适合传递少量数据 (2) 基于共享存储区的通信方式。,在消息传递系统中,进程间的数据交换,是以格式化的消息(message)为单位的直接通信方式、间接通信方式,2.6.1 进程通信的类型,2. 消息传递系统(Message passing system),2.6.1 进程通信的类型,3. 管道(Pipe)通信,所谓“管道”,是指用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件。,Unix中的管道,创建管道 #include int pipe(int fd2);返回两个文件描述字:fd0用

45、于打开来读,fd1用于打开来写,Unix中的管道,单个进程中的通道,管道由单个进程创建,但很少在单个进程中使用,Unix中的管道,典型用途,1、单个进程创建管道后,调用fork派生子进程,Unix中的管道,典型用途,2、父进程关闭管道的读出端,子进程关闭同一管道的写入端。从而在父子进程提供了一个单向数据流,Unix中的管道,例,命令: who|sort|lp,Unix中的管道,半双工管道、全双工管道,协调 互斥:读时不写、写时不读 同步:协调读写速度等问题 确定对方是否存在,只有确定了对方已存在时,才能进行通信,3. 管道(Pipe)通信,2.6.2 消息传递通信的实现方法,1. 直接通信方式

46、 原语:Send(Receiver, message); 发送一个消息给接收进程;Receive(Sender, message); 接收Sender发来的消息。,注:原语SEND、RECEIVE和信号量类似,为系统调用管程monitor是由编程语言构造和设计,直接消息传递通信的解决生产消费者问题,void producer(void) int item; message m; /message buffer while (TRUE) produce_item(item); /generate next item to put in bufferbuild_message(m,item); /

47、construct a message to sendsend(consumer,m); /send item to consumer ,直接消息传递通信的解决生产消费者问题,void consumer(void) int item; message m; /message buffer while (TRUE) receive(producer,m); /get message containing itemextract_item(m,item); /take item out of messageconsumer_item(item); /do something with item ,2. 间接通信方式,(1) 信箱的创建和撤消。进程可利用信箱创建原语来建立一个新信箱。创建者进程应给出信箱名字、信箱属性(公用、私用或共享);对于共享信箱, 还应给出共享者的名字。当进程不再需要读信箱时,可用信箱撤消原语将之撤消,利用信箱传递消息,2. 间接通信方式,(2) 消息的发送和接收。当进程之间要利用信箱进行通信时,必须使用共享信箱,并利用系统提供的下述通信原语进行通信。 Send(mailbox, message); 将一个消息发送到指定信箱; Receive(mailbox, message); 从指定信箱中接收一个消息;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 中等教育 > 小学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报