当前位置:文档之家› 进程同步考研问题

进程同步考研问题

进程同步考研问题
进程同步考研问题

进程同步问题

A. 生产者-消费者问题类

1.(西北工大2000年试题)由三个进程get,copy和put以及两个缓冲区buffer1和buffer2完成

一项输入/输出操作。进程get的功能是把一张卡片上的信息从读卡机上读进buffer1;进程copy的功能是把buffer1中的信息复制到buffer2;进程put的功能是取出buffer2中的信息并从打印机上打印输出。试用P、V操作完成这三个进程间的尽可能并发正确执行的关系(用程序或框图表示),并指明信号量的作用和初值。

解:可设置6个信号量mutex1,mutex2,empty1,empty2,full1,full2。其中:mutex1和mutex2是互斥信号量,初值为1,分别用于对buffer1和buffer2的互斥访问;

empty1和empty2为同步信号量,初值为1,分别表示buffer1和buffer2是否空闲,1表示空闲,0表示不空闲;

full1和full2为同步信号量,初值为0,分别表示buffer1和buffer2中是否有可取用的信息,1表示有可取用的信息,0表示无可取用的信息。

semaphore mutex1, mutex2, empty1, empty2, full1, full2 ;

mutex1=mutex2=1; //互斥信号量

empty1=empty2=1; //生产者进程的同步信号量

full1=full2=0; //消费者进程的同步信号量

parbegin

process get( ) //读进程(生产者进程)

{

while (1) {

从读卡机读入一张卡片的信息;

P(empty1) //看看buffer1是否空闲

P(mutex1); //互斥访问buffer1

将信息放入buffer1;

V(mutex1);

V(full1); //通知进程copy,buffer1中已有信息科取(若copy正在等待,则唤

醒之)

}

}

process copy( ) //复制进程(既是消费者又是生产者进程)

{

while (1) {

P(full1) //看看buffer1是否有信息可取

P(mutex1); //互斥访问buffer1

从buffer1中复制出信息;

V(mutex1);

V(emtpy1); //通知get,buffer1中的信息已取走(可能唤醒get)

P(empty2); //看看buffer2是否空闲

P(mutex2); //互斥访问buffer2

将复制的信息放入buffer2;

V(mutex2);

V(full2); //通知put,buffer2中已有信息

}

}

process put( ) //输出进程(消费者进程)

{

while (1) {

P(full2); //测试buffer2中是否有信息

P(mutex2); //互斥访问buffer2

从buffer2中取出信息;

V(mutex2);

V(empty2); //通知copy,buffer2中的信息已取走

}

}

parend

【讨论】由于本题中对于两个缓冲区buffer1和buffer2来说,都只有一个生产者和一个消费者,因此互斥信号量mutex1和mutex2实际上是可以省去的。

以下第2、3、4题实际上与本题是同一道题。

2.(北京大学1990年试题)有三个进程PA、PB和PC协作解决文件打印问题:PA将文件记录

从磁盘读入主存的缓冲区1,每执行一次读一个记录;PB将缓冲区1的记录复制到缓冲区2,每执行一次复制一个记录;PC将缓冲区2的内容打印出来,每执行一次打印一个记录。缓冲区的大小和一个记录大小一样。试用P、V操作来保证文件的正确打印。

解:BEGIN

semaphore mutex1,mutex2,avail1,avail2,full1,full2;

mutex1 := 1;mutex2 := 1;{实际上mutex1,mutex2可以省去}

avail1 := 1;avail2 := 1;

full1 := 0;full2 := 0;

PARBEGIN

PA:BEGIN

L1:read from disk;

P(avail1);

P(mutex1);

put to buffer 1;

V(full1);

V(mutex1);

goto L1;

END

PB:BEGIN

L2:P(full1);

P(mutex1);

get from buffer 1;

V(avail1);

V(mutex1);

P(avail2);

P(mutex2);

put to buffer 2;

V(full2);

V(mutex2);

goto L2 ;

END

PC:BEGIN

L3:P(full2);

P(mutex2);

get from buffer 2;

V(avail2);

V(mutex2);

print RECORD

goto L3 ;

END

PAREND

END

3.有三个进程,Reader进程读入数据number1,将其放入缓冲器B1,Executor进程将B1中数

据取出,处理成数据number2,将其放入缓冲器B2,Printer进程将number2数据取出打印,假设B1和B2只能存放一个数据,用P、V操作管理这三个进程的执行。

解:解:采用P、V操作的同步算法如下:

BEGIN

semaphore empty1, full1, empty2, full2 ;

empty1.vale = empty2.value = 1 ;

ful2.value = full2.value = 0 ;

PARBEGIN

Reader:BEGIN

L1:read number1 ;

P(empty1) ;

B1=number1 ;

V(full1) ;

goto L1;

END

Executor:BEGIN

L2:P(full1) ;

take number1 from B1 ;

V(empty1) ;

Process number1-->number2 ;

P(empty2) ;

B2=number2 ;

V(full2) ;

goto L2;

END

Printer:BEGIN

L3:P(full2);

take number2 from B2 ;

V(empty2) ;

Print(number2) ;

goto L3;

END

COEND

END

4.假定系统有三个并发进程read, move和print共享缓冲器B1和B2。进程read负责从输入设

备上读信息,每读出一个记录后把它存放到缓冲器B1中。进程move从缓冲器B1中取出一记录,加工后存入缓冲器B2。进程print将B2中的记录取出打印输出。缓冲器B1和B2每次只能存放一个记录。要求三个进程协调完成任务,使打印出来的与读入的记录的个数,次序完全一样。请用PV操作,写出它们的并发程序。(注:本题与第3题是同一个题,与第5题类似)

解:参考程序如下:

begin

SR, SM1, SM2, SP: semaphore;

B1, B2 : record;

SR:=1; SM1:=0; SM2=1; SP:=0;

cobegin

process read

X : recoed;

begin

R: X:=从输入设备上读入的一个记录;

P(SR);

B1:=X;

V(SM1);

goto R;

end;

process move

Y : record;

begin

M: P(SM1);

Y :=B1;

V(SR);

加工Y中的记录;

P(SM2);

B2 := Y;

V(SP);

goto M;

end;

process print

Z : record;

begin

P: P(SP);

Z := B2;

V(SM2);

打印Z中的记录;

goto P;

end;

coend;

end;

5.今有3个并发进程R、M、P,它们共享一个缓冲器B。进程R负责从输入设备读入信息,

每读一个记录后把它存放在缓冲器B中。进程M在缓冲器B中加工进程R存入的记录。进程P把加工后的记录打印出来。缓冲器B中每次只能存放一个记录,当记录被加工输出后,缓冲器B中又可以存放一个新的记录。为协调它们的工作,采用PV操作进行管理。解:semaphore SR,SM,SP;

SR=1; SM=0; SP=0;

parbegin

Process R

{

while (1) {

从输入设备读入信息X;

P(SR); //看看缓冲区B是否是空的

B=X; //信息存入缓冲区B

V(SM); //通知M,缓冲区B中已有记录

}

}

Process M

{

while (1) {

P(SM); //测试R是否已在B中存放信息

在缓冲器B中加工进程R存入的记录;

V(SP); //通知P缓冲区B中的信息已可打印

}

}

Process P

{

while (1) {

P(SP); //测试M是否已将信息加工好

从B中取M加工后的信息Y;

V(SR); //通知R,缓冲区B已可房信息

Print(Y); //打印信息Y

}

}

parend

6.若一只盘子一次只能放一个水果,A只往盘中放苹果,B只往盘中放梨子,C只从盘中

取苹果,D只从盘中取梨子。试用:(1) 信号量和P、V操作;(2) 管程,写出同步算法。解:(1) 采用P、V操作的同步算法如下:

semaphore SAB=1; //A、B的资源信号量,同时又是它们的互斥信号量

semaphore SC=0; //C的资源信号量(用于与A同步)

semaphore SD=0; //D的资源信号量(用于与B同步)

begin

parbegin

process A: //进程A的算法描述

{

while(true) {

取一个苹果;

wait(SAB); //测试盘子是否为空

将一苹果放入盘中;

signal(SC) //通知C盘中已有苹果(可能唤醒C)

}

}

process C:

{

while(true) {

wait(SC); //测试盘子是否有苹果

从盘中取出苹果;

signal(SAB); //通知A(或B)盘子一空(可能唤醒A或B)

消费该苹果;

}

}

process B: //进程B的算法描述

{

while(true) {

取一个梨子;

wait(SAB); //测试盘子是否为空

将一梨子放入盘中;

signal(SD) //通知D盘中已有梨子(可能唤醒D)

}

}

process D:

{

while(true) {

wait(SD); //测试盘子是否有梨子

从盘中取出梨子;

signal(SAB); //通知A(或B)盘子一空(可能唤醒A或B)

消费该梨子;

}

}

parend

end

(2) 采用管程的同步算法如下:

首先定义管程MPC,该管程可描述如下:

type MPC=monitor

var flag: integer; //flag=0:盘中无水果;=1盘中有苹果;=2盘中有梨子

empty: condition; //用于A或B等待空盘子

W: array[1..2] of condition //W[1]用于等待苹果,W[2]用于等待梨子

procedure entry put(integer k)

begin

if flag>0 then empty.wait; //生产者A或B进程阻塞

flag=k;

放一k号水果入盘中; //设1号水果为苹果,2号水果为梨子

if W[k].queue then full.signal; //若有等待k号水果者,则唤醒之end

procedure entry get(integer k)

begin

if flag<>k then W[k].wait; //消费者C或D进程阻塞

从盘中取k号水果;

flag := 0;

if empty.queue then empty.signal; //若等待队列非空,则唤醒队首的一个生产者进程

end

begin

flag :=0; //初始化内部数据

end

A、B、C、D四个进程的同步算法可描述如下:

parbegin

Process A

begin

任取一个苹果;

MPC.put(1);

end

Process B

begin

任取一个梨子;

MPC.put(2);

end

Process C

begin

MPC.get(1);

吃苹果;

end

Process D

begin

MPC.get(2);

吃梨子;

end

parend

7.设自行车生产车间有两个货架,货架A可以存放8个车架,货架B可以存放20个车轮;又

设有4个工人,他们的活动是重复劳动,分别为:工人1 加工一个车架放入货架A中;

工人2、3分别加工车轮放入货架B中(每人每次放入1个车轮);工人4从货架A中取一个车架,再从货架B中取两个车轮,组装成一辆自行车。试用PV操作实现四个工人的合作。

【分析】信号量Aempty表示货架A的空位数,其初值为8;信号量Afull表示货架A上存放的车架数,其初值为0;信号量Bempty表示货架B的空位数,其初值为20;信号量Bfull

表示货架B上存放的车轮数,其初值为0;信号量mutex用于互斥(初值为1)。解:BEGIN

semaphore Aempty,Bempty,Afull,Bfull,mutex;

Aempty := 8;Bempty := 20;Afull := 0;Bfull := 0;mutex :=1;

PARBEGIN

Worker1:BEGIN

L1:生产1个车架;

P(Aempty);//测试货架A是否有空位置

P(mutex);//互斥使用货架A

车架放到货架A;

V(Afull);//货架A上的车架数增1,必要时唤醒等待的进

V(mutex);

goto L1;

END

Worker2、3:BEGIN

L2:生产1个车轮;

P(Bempty);//测试货架B是否有空位置

P(mutex);//互斥使用货架B

车轮放到货架B;

V(Bfull);//货架B上的车轮数增1,必要时唤醒等待的进

V(mutex);

goto L2;

END

Worker4:BEGIN

L3:P(Afull);//测试货架A上是否有车架

P(Bfull);P(Bfull);//测试货架B上是否有2个车轮

P(mutex);

取1个车架;取2个车轮;

V(Aempty);//货架A空位置增1

V(Bempty);V(Bempty);//货架B空位置增2

V(mutex);

组装成一辆自行车;

goto L3;

END

PAREND

END

8.假定有一个成品仓库,总共能存放8台成品,生产者进程把生产成品放入仓库,消费者

进程从仓库中取出成品消费。为了防止积压,仓库满时就停止生产。由于仓库搬运设备只有一套,故成品的存入和取出只能分别进行,试用P、V操作来实现该方案。

解:semaphore mutex, empty, full ;

mutex=1; //互斥信号量

empty=8; //生产者进程的同步信号量

full=0; //消费者进程的同步信号量

parbegin

process Pi //生产者进程

{

while (1) {

生产一个成品x;

P(empty) //看看仓库是否还有空间可放成品

P(mutex); //互斥使用搬运设备

用搬运设备将成品放入仓库;

V(full); //仓库中成品数增1(可能唤醒一个消费者)

V(mutex);

}

}

process Cj //消费者进程

{

while (1) {

P(full) //看看仓库是否有成品

P(mutex); //互斥使用搬运设备

用搬运设备将成品从仓库取出;

V(emtpy); //仓库中可放成品数增1(可能唤醒一个生产者)

V(mutex);

}

}

parend

9.有三个进程R、W1、W2共享一个缓冲器B,而B中每次只能存放一个数。当B中无

数时,进程R可将从输入设备上读入的数存放到缓冲器B中;若存放到B中的是奇数,则允许进程W1将其取出打印;若存放到B中的是偶数,则允许进程W2将其取出打印;

同时规定:进程R必须等缓冲器中的数被取出后才能再存放下一个数;进程W1或W2对每次存入缓冲器的数只能打印一次;W1和W2都不能从空的缓冲器中取数。用P、V 操作作为同步机制写出三个并发进程的同步算法。(动作部分可用文字描述)

解:semaphore S,S1,S2;

S=1; S1=S2=0;

parbegin

Process R {

while (1) {

从输入设备上读入的数x; P(S); B=x;

if (x%2==1) V(S1); //若是奇数,则通知W1 else V(S2); //若是偶数,则通知W2 } }

Process W1 {

while (1) {

P(S1); //看看缓冲器B 中是否有奇数 y=B; //从缓冲器B 中取奇数存于y

V(S); //通知R ,缓冲器已空,可以在往里存数了 Print(y); //打印 } }

Process W2 {

while (1) {

P(S2); //看看缓冲器B 中是否有偶数 y=B; //从缓冲器B 中取偶数存于y

V(S); //通知R ,缓冲器已空,可以在往里存数了 Print(y); } }

parend

10. 进程P1使用缓冲区buffer 向进程P2,P3,P4发送消息(如图2-1所示),要求每当Pl

向buffer 中发消息时,只有当P2,P3,P4进程都读取这条消息后P1才可向buffer 中发送新的消息。试用信号量机制描述如下图所示进程的动作过程。(本题是下题的特例)

图2-1

解:设P1、P2、P3、P4的资源信号量分别为S1、S2、S3、S4

semaphore S1,S2,S3,S4;

S1.value=3;S2.vale=S3.vale=S4.value=0; (3分) parbegin process P1

P 1

buffer

P2

P3

P4

{

while (condition)

{

P1生成一个消息;

P(S1);P(S1);P(S1);

P1将消息存入缓冲区buffer;

V(S2);V(S3);V(S4);

}

}

process Pi(i=2,3,4)

{

while (condition)

{

P(Si);

Pi从buffer中取出消息;

V(S1);

Pi消费(使用)该消息;

}

}

parend

另一解法如下(此法更一般化,可用来解下题):

semphore S1[3], S[3];

for (i=0;i<3;i++) {

S1[i]=1;

S[i]=0;

}

parbegin

process P1

{

while (1) {

P1生成一个消息;

for (i=0;i<3;i++) P(S1[i]); //看看P2~P4是否将消息取走

P1将消息存入缓冲区buffer;

for (i=0;i<3;i++) V(S[i]); //通知P2~P4缓冲区buffer中已有消息}

}

Process P2

{

while(1) {

P(S[0]); //看看buffer中是否已有消息

从buffer中取出消息;

V(S1[0]); //通知P1, P2已从缓冲区buffer中取走消息

消费(使用)该消息;

}

}

Process P3

{

while(1) {

P(S[1]); //看看buffer中是否已有消息

从buffer中取出消息;

V(S1[1]); //通知P1, P3已从缓冲区buffer中取走消息

消费(使用)该消息;

}

}

Process P4

{

while(1) {

P(S[2]); //看看buffer中是否已有消息

从buffer中取出消息;

V(S1[2]); //通知P1, P4已从缓冲区buffer中取走消息

消费(使用)该消息;

}

}

parend

11.(北大1994年试题)进程A1,A2,...,An1通过m个缓冲区向进程B1,B2,...,Bn2

不断地发送消息。发送和接收工作遵循如下规则:

①每个发送进程一次发送一个消息,写入一个缓冲区,缓冲区大小与消息长度一样;

②对每个消息,B1,B2,...,Bn2都需各接收一次,读入各自的数据区内;

③ m个缓冲区都满时,发送进程等待,没有可读的消息时,接收进程等待。

试用P、V操作组织正确的发送和接收操作。(上题是本题的特例)

【分析】这是P-C问题变形。把这一组缓冲区看成n2组缓冲区。

解:设置一个信号量mutex实现诸进程对缓冲区的互斥访问;两个信号量数组empty[n2]和full[n2]描述n2组缓冲区的使用情况。mutex初值为1,数组empty的元素初值为m,数组full 的元素初值为0。

var mutex: semaphore :=1;

empty,full: array[0..n2-1] of semaphore;

i: integer;

for (i=0;i

{

empty[i]=m;full[i]=0;

}

Aj ( ) //j=1,2,...,n1

{

while (1) {

......

for (int i=0;i

P(empty[i]);

P(mutex);

将消息放入缓冲区;

V(mutex);

for (i=0;i

V(full[i]);

......

}

}

Bi ( ) //i=1,2,...,n2

{

while (1)

{

......

P(full[i]);

P(mutex);

将消息从缓冲区取出;

V(mutex);

V(empty[i]);

......

}

}

parbegin

A1( );

A2( );

......

An1( );

B1( );

B2( );

......

Bn2( );

parend

12.进程P1使用缓冲区buffer向进程P2,P3,P4发送消息(如第10题的图2-1所示),要

求每当Pl向buffer中发消息时,只有当P2,P3,P4进程都读取这条消息后P1才可向buffer中发送新的消息。试用管程机制描述四个进程的动作过程。

解:定义管程如下(用伪代码):

type P_C=monitor

var flag : array[2..4] of integer;

cc: array[1..4] of condition;

procedure put( ) //P1调用此过程将消息放入缓冲区

begin

if flag[2]+flag[3]+flag[4]>0 then cc[1].wait;

将消息放入缓冲区buffer;

for i := 2 to 4 do

begin

flag[i] := 1;

if cc[i].queue then cc[i].signal;

end

end

procedure get(integer i) //P2、P3、P4调用此过程从buffer中取消息begin

if flag[i]=0 then cc[i].wait; //若buffer中无消息则等待

从buffer中取消息;

flag[i] := 0;

if flag[2]+flag[3]+flag[4] = 0 and cc[1].queue then cc[1],signal;

end

begin

flag[2] := flag[3] := flag[4] := 0; //初始化数据

end

采用管程描述P1、P2、P3、P4四个进程的活动如下:

parbegin

P1( )

begin

repeat

生成一个消息;

P_C.put( );

until false

end

P2( )

begin

repeat

P_C.get(2);

消费从缓冲区中取到的消息;

until false

end

P3( )

begin

repeat

P_C.get(3);

消费从缓冲区中取到的消息;

until false

end

P4( )

begin

repeat

P_C.get(4);

消费从缓冲区中取到的消息;

until false

end

parend

13.某自动质量检测系统有三个进程Q、A、B组成。进程Q每次取一件产品检测,把检测后

的产品存放在货架F上,F的容量为每次只能存放一件产品。若货架上存放的是合格产品则让进程A取出,并在产品上贴标签后包装;若货架上存放的是不合格产品则让进程B取出后,将其丢入废物箱。回答下列问题:

(1)写出用PV操作管理时应定义的信号量及初值:①。

(2)完成下列算法中的填空,使它们能按上述要求正确地并发执行。

进程Q:取一件产品检测;

②;

F:=检测后的产品

If F=合格产品then ③

else ④进程A: _____⑤;

y:=F中产品;

______⑥;

对产品贴标签且包装;

进程B:____⑦;

z:=F中产品;

____⑧;

把产品丢入废物箱;

解:(1) ①定义信号量empty,fulla,fullb,初值分别为1,0,0。

(2) ②P(empty); ③V(fulla); ④V(fullb);

⑤P(fulla); ⑥V(empty);

⑦P(fullb); ⑧V(empty);

14.系统有三个进程Read,Write1,Write2共享一个整数缓冲器B,B中每次只能存放一个整数。

Read进程每次启动输入设备输入一个整数到n。若n中是奇数,则由进程Write1将其取出打印;若n中是偶数,则由进程Write2将其取出打印。规定输入与打印整数的个数和次序完全一致。

要求:(1)完善如下程序,在下列A、B空白处填入有关语句,并说明物理意义。

begin S, SO, SE: semaphore;

n: integer;

S:=1;

SO:=0;

SE:=0;

Parbegin

process Read

Begin

L1:从输入设备读一整数到n;

P(S);

B:=n;

if n mod 2=1 then V(SO)

else V(SE);

goto L1

end;

process Write1

begin

L2: P(SO);

Y:=B;

(A) ;

print Y;

goto L2

end;

process Write2

begin

L3: (B) ;

Z:=B;

V(S);

Print Z;

goto L3

end;

Parend;

end;

(2)说明信号量S,SO,SE作用及它们的初值的物理意义。

(3)Read进程中V(SO)与V(SE)对调,程序功能将发生什么变化。

解:(1) (A) V(S) (B) P(SE)

(2) 信号量S,SO,SE作用是实现进程Read、Write1和Write2之间的同步。信号量S的初

值为1,表示开始时缓冲器B是空的,可以存放一个整数,当缓冲器B中存有整数时,其值变为0;信号量SO的初值为0,表示开始时缓冲器B中没有奇数,当缓冲器B中

存有一个奇数时,SO的值变为1;信号量SE的初值为0,表示开始时缓冲器B中没有

偶数,当缓冲器B中存有一个偶数时,SE的值变为1。

(3) Read进程中V(SO)与V(SE)对调,程序功能将变为:若缓冲器中存放的整数n为奇数

时,则由进程Write2将其取出打印;若n中是偶数,则由进程Write1将其取出打印。

15.(2009全国试题)三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。P1每

次用produce( )生成一个正整数并用put( )送入缓冲区某个单元中;P2每次用getodd( )从缓冲区中取出一个奇数并用countodd( )统计奇数个数;P3每次用geteven( )从缓冲区中取出一个偶数并用counteven( )统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义的信号量的含义。要求用伪代码描述。(本题与第9题、第14题实际上是同一题)

解:定义P1的资源信号量empty来表示缓冲区中空单元个数,用于P1与P2、P3的同步;定义P2的资源信号量S1来表示缓冲区中奇数的个数,用于P2和P1的同步;定义P3的资源信号量S2来表示缓冲区中偶数的个数,用于P3和P1的同步;定义互斥信号量mutex,用于三个进程互斥访问缓冲区。算法描述如下:

var empty,s1,s2,mutex: semaphore := N,0,0,1;

Parbegin

P1: begin

x := produce( ); /* 生成一个数*/

P(empty); /* 判断缓冲区是否有空单元*/

P(mutex); /* 是否有进程访问缓冲区*/

put( ); /* 将生成的数送入缓冲区的某个单元*/

if x mod 2=0 then

V(S2); /* 如果是偶数,向P3发出信号*/

else

V(S1); /*如果是奇数,向P2发出信号*/

V(mutex);

end

P2: begin

P(S1); /* 缓冲区中是否有奇数*/

P(mutex);

getodd( );

V(empty); /* 向P1发出信号*/

V(mutex);

countodd( ); /* 原答案将此行放在临界区中,因只有P2调用,不需互斥,故

移至此*/

end

P3: begin

P(S2);

P(mutex);

geteven( );

V(empty);

V(mutex);

counteven( );

end

Parend

16.设有n个缓冲区构成的循环缓冲区,每个缓冲区能容纳一个整数。写进程Writer把整数

逐个存入缓冲区,读进程Reader则逐个从缓冲区中读出并打印输出,要求打印的与输入的完全一样,即个数、次序、数值一样。试问:

(1)写进程与读进程间具体的制约关系如何?

(2)用PV操作写出这两个进程的同步算法程序。

解:(1) 写进程与读进程间具体的制约关系是同步和互斥关系。

(2) 采用PV操作的同步算法程序如下:

semaphore mutex, empty, full;

mutex=1; //互斥信号量,用于两个进程互斥访问缓冲区

empty=n; //同步信号量,表示空闲缓冲区的数量

full=0; //同步信号量,表示放有整数的缓冲区个数

parbegin

process Writer( )

{

while (1) {

produce_an_integer( );

P(empty);

P(mutex);

write_an_integer_to_buffer( );

V(mutex);

V(full);

}

}

process Reader( )

{

while (1) {

P(full);

P(mutex);

get_an_integer_from_buffer( );

V(mutex);

V(empty);

print_an_integer( );

}

}

parend

17.一组生产者进程和一组消费者进程共享9个缓冲区,每个缓冲区可以存放一个整数。生

产者进程每次一次性向3个缓冲区写入整数,消费者进程每次从缓冲区取出一个整数。

请用:(1)信号量和P、V操作;(2)管程,写出并发进程能正确执行的算法程序。

解:(1) 信号量和P、V操作的算法描述如下:

semaphore empty=9; //生产者的资源信号量,表示空缓冲区个数

seamphore full=0; //消费者的资源信号量,表示满缓冲区个数

seamphore mutex=1; //互斥信号量,用于互斥访问共享变量i或j

int i=0; //生产者使用是缓冲区下标

int j=0; //消费者使用是缓冲区下标

parbegin

process producer m(m=1, 2, 3, …)

begin

int a,b,c; //该生产者使用的局部变量

repeat

生产者获得3个整数a, b, c ;

P(empty); P(empty); P(empty); //得到3个空缓冲区

P(mutex); //生产者互斥访问共享变量i

buffer[i]=a; //整数a存入缓冲区

i=(i+1) mod 9;

buffer[i]=b; //整数b存入缓冲区

i=(i+1) mod 9;

buffer[i]=c; //整数c存入缓冲区

i=(i+1) mod 9;

V(mutex);

V(full); V(full); V(full); //通知消费者缓冲区已有数据(满缓冲区数增3)until false

end

process consumer k(k=1, 2, 3, …)

begin

int x;

repeat

P(full); //看看缓冲区是否有整数

P(mutex); //消费者互斥访问共享变量j

x=buffer[j]; //从缓冲区取整数到x中

j=(j+1) mod 9

V(mutex);

V(empty); //空缓冲区数增1

consume x;

until false

end

parend

(2)采用管程机制解决上述问题。

首先定义管程PC,该管程可描述如下:

type PC=monitor

var i, in, out, count: integer;

buffer: array[0..8] of integer;

full, empty: condition;

procedure entry put(integer a[ ])

begin

P: if count+3>n then {

empty.wait; //生产者进程阻塞

goto P;

}

for (i=0; i<3; i++) { //一次连续放3个整数

buffer[in] := a[i];

in := (in+1) mod 9;

count := count+1;

}

for (i=0;i<3;i++)

if full.queue then full.signal; //若等待队列非空,则唤醒一个消费者(最多唤醒3

个)

end

procedure entry get(int x)

begin

if count≤0 then full.wait; //消费者进程阻塞

x := buffer[out];

out := (out+1) mod 9;

count := count-1;

if empty.queue then empty.signal; //若等待队列非空,则唤醒队首的一个生产者进程

end

begin

in :=out :=0; count :=0; //初始化内部数据

end

生产者和消费者进程可描述如下:

process producer ( ) //生产者进程

begin

a: array[0..2] of integer;

repeat

生成3个整数存于数组a中;

PC.put(a); until false; end

process consumer ( ) //消费者进程

begin

var x :integer; repeat

PC.get(x); consume x; until false; end

18. 有n 个输入进程、m 个计算进程和p 个输出进程,通过循环缓冲区A 和循环缓冲区B 进行

数据传送,如下图2-2所示。

图2-2

已知缓冲区A 有N 个缓冲块,缓冲区B 有M 个缓冲块。输入进程每次输入1个数据块存入缓冲区A 的1个缓冲块中;计算进程每次从缓冲区A 取出1个数据块,处理后的数据块存入缓冲区B 的1个缓冲块中;输出进程每次从缓冲区B 中取出1个数据块进行输出操作。试用P 、V 操作实现进程间的同步与互斥。 【说明】n 个输入进程和m 个计算进程构成一对生产者-消费者问题;m 个计算进程和p 个输出

进程构成另一对生产者-消费者问题。计算进程担当双重较色,即既是消费者,又是生产者。

解:semaphore mutex1, mutex2, empty1, full1, empty2, full2;

int in1, out1, in2, out2; mutex1=1; //互斥信号量,用于互斥访问共享变量in1和out1 mutex2=1; //互斥信号量,用于互斥访问共享变量in2和out2 empty1=N; //同步信号量,表示缓冲区A 的空缓冲区个数 empty2=M; //同步信号量,表示缓冲区B 的空缓冲区个数 full1=0; //同步信号量,表示缓冲区A 的满缓冲区个数 full2=0; //同步信号量,表示缓冲区B 的满缓冲区个数 in1=out1=in2=out2=0; //共享变量,表示缓冲区的下标变量 parbegin

process input i ( ) //n 个输入进程,i=1, 2, ... , n {

while (1) {

读入一个数据块X; P(empty1); //判断缓冲区A 是否有空闲位置放数据块,若无则等待 P(mutex1); //互斥访问共享变量in1和缓冲区A bufferA[in1]=X;

输入进程1 输入进程2

输入进程n

计算进程1 计算进程2

计算进程m …

输出进程1 输出进程2

输出进程p

缓冲区A

缓冲区B

我的人大考研经历

我的人大考研经历 我是在炎炎夏日接到人大录取通知书的,院子里的花香还是沁人心扉,不觉忆起一年前曾对妈妈说过的话:期望明年待到花开时,我能收到通知书。是啊,一年了,当一年成为回忆时,成功也悄然而至,虽然还只是一小步的胜利。曾不止一位朋友问我考人大的感受,我总笑着说:“如果想证明自己,就去考人大吧。”我是个喜欢笑的男生,我想每天的微笑能让我暂时忘记不快,乐观也许是战胜困难的利器。微笑面对自己,面对朋友,面对成功,也面对挫折……… N位欲考人大的同学叫我写篇心得给他参考下,为了履行我答应同学的诺言,为了纪念那段难忘的考研岁月,也为了献给各位曾经考研以及将欲考研的朋友们。 一. 关于人大 在网上总能看到“人大到底难考不”这一问题的提出,其实,我想提出这个问题的朋友已经知道人大的实力,所以才会问这个问题,既然人大实力是公认的:人大文科排名全国第二,仅次于北大。那么“人大到底难考不”其实已经有了答案。只是在这一答案出现后,不免有更多的人在向往的同时,会问一句:“人大到底有多难考”。其实这才是最难回答的问题。考人大的大部分都是实力很强的考生,既然你能考人大,那么证明你多少还是具备一些强硬素质和能力的,从这一方面说,对实力很牛的考生来说,人大也不算太难考。但另一方面,正如我上述的,正因为考人大的都是实力很强的考生,那么竞争必然是激烈的,甚至是残酷的,在众多强手面前,你能否杀出重围,这又是个问题,因此,从这一点来看,人大又是比较难考的。 人大的法律,新闻,政治,经济等等专业是王牌中的王牌专业,无论从实力还是报考人数来说,都是全国最牛的院校之一。以我为例,我报考的是人大国际关系专业,由于人大此专业实力很强,与北大,复旦并称“国关三派”,报考人大国关的人数持续上升,但因为人大一般不再扩招,所以录取比例越来越低。我是今年报考的,初试期间,四川考场一共有大约三十多人报考人大此专业,但是到了复试阶段,只有自己一人得幸杀出重围,由此可见竞争惨烈程度。所以,对想报考人大强势专业的考生来说,人大的确比较难考。 二.人大录取是否公平 也常能在网上看见许多关于所谓人大录取“黑幕”的帖子,当时,自己也多少有些担心。因为自己是一所普通大学学经济的考生,典型的三跨生(跨专业跨省份跨学校),也有一些忧虑。但是凭借自己在初试以及复试中的优良发挥,还是证明了自己的实力,也最终成功进入人大。其实,人大录取还是很公平的,以我参加复试为例,参加人大国关复试的,很多都不是人大本校的,大家来自四面八方,国关复试也很注重专业知识,当然要求也很严。(只要英语口语,听力,专业知识一门不合格,那就立即淘汰)事后得知人大国关复试过程中共淘汰了百分之二十参加复试的考生,录取考生是按初试加复试得出的名次排列的,完全按实力录取,显得很公平,所以欲考人大的朋友,请放心,只要你有实力(当然,运气和机遇还是要有一点的),人大是不会放弃你的。

操作系统OS报告读者与写者问题(进程同步问题)

目录 一、课程设计目的及要求 (1) 二、相关知识 (1) 三、题目分析 (2) 四、概要设计 (4) 五、代码及流程 (5) 六、运行结果 (11) 七、设计心得 (12) 八、参考文献 (12)

一、课程设计目的及要求 读者与写者问题(进程同步问题) 用n 个线程来表示n个读者或写者。每个线程按相应测试数据文件的要求,进行读写操作。请用信号量机制分别实现读者优先和写者优先的读者-写者问题。 读者-写者问题的读写操作限制: 1)写-写互斥; 2)读-写互斥; 3)读-读允许; 写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 二、相关知识 Windows API: 在本实验中涉及的API 有: 1线程控制: CreateThread 完成线程创建,在调用进程的地址空间上创建一个线程,以执行指定的函数;它的返回值为所创建线程的句柄。 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD DWORD dwStackSize, // initial stack size LPTHREAD_START_ROUTINE lpStartAddress, // thread function LPVOID lpParameter, // thread argument DWORD dwCreationFlags, // creation option LPDWORD lpThreadId // thread identifier ); 2 ExitThread 用于结束当前线程。 VOID ExitThread( DWORD dwExitCode // exit code for this thread ); 3Sleep 可在指定的时间内挂起当前线程。 VOID Sleep( DWORD dwMilliseconds // sleep time ); 4信号量控制: WaitForSingleObject可在指定的时间内等待指定对象为可用状态; DWORD WaitForSingleObject( HANDLE hHandle, // handle to object DWORD dwMilliseconds // time-out interval );

考研是一段艰辛的历程

考研是一段艰辛的历程,要经过很多道坎儿。在经过艰苦的复习,紧张的笔试之后,还要面临残酷的复试。而复试考察内容涉及面广,包括英语听力考试、专业课笔试、实践课考察(我经历的是上机测试)、面试等内容,更是考研最后一道难过的坎儿。 我报考的是北京邮电大学计算机学院,复试的专业课笔试内容包括操作系统、数据库、计算机网络和软件工程四门课程。由于计算机专业是一门非常注重实践的学科,因此复试时还有上机测试。当年复试一步步走来,收获颇丰,想借此与大家一起分享我的所得。 实习,复试前的意外收获 研究生考试的成绩公布一般在来年的3、4月份,从考试结束到成绩公布这段时间比较漫长,与其这样焦急地等待,还不如找份实习工作,边工作边复习等待,这样既可以增加自己的项目经验,还可以吸引注意力,不必为考研成绩太过操心。 过完春节,我就返回北京寻找实习工作。运气还不错,不到一个星期就找到了一份满意的实习工作,而且工作的地点离北京邮电大学相当近。白天在公司上班,晚上抽一些时间看专业课,这样的生活让人很充实。 因为复试笔试考的4门课程原来都系统学习过,所以每天晚上只需抽出一点时间温故复习就足够了,主要的精力还是放在每天的工作上,在工作中能快速地提高自己。对计算机专业的学生来说,在公司平台参与实际的项目是快速增加自己项目经验的重要途径。计算机是一门非常强调实践的学科,只有实际做出来才有真正的价值,高分不一定代表很

强的实践动手能力。计算机专业导师对这一点非常地清楚,所以拥有项目经验对于考研录取也是一项非常重要的优势。后来的复试证明了这一点,我很庆幸自己在等待笔试成绩这段时间找了份实习工作。 中意的导师,第一时间联系到他 成绩线公布确定自己通过初试之后,一定要马上联系导师,越快越好。因为这个时候,其他的同学也会马上行动起来,机会不等人,好的资源总是受到众人的追捧。 联系导师的方法有很多,在这里介绍我当年采用的方法。 1.网站搜索。学校网站一般都会有介绍导师的信息,稍微留意一下都会有不少的收获。有的学校信息比较丰富,如我报考的北京邮电大学,学校网站上不仅有导师的研究方向、个人学术经历、所属的研究中心等等,甚至还有导师的E-mail、办公室电话或者手机号码。当然,有些学校导师的信息比较少,但至少通过学校网站可以知道你所报考专业的导师名字,知道了导师的名字之后还可以通过其他渠道了解导师的信息。 2.BBS咨询。学校的BBS也是一个重要的信息来源,不可忽视。如北京邮电大学的“北邮人论坛”,人气非常高,平均在线人数达到8000人之多,你能在论坛的考研专区及时得到许多非常有价值的考研情报。我曾经在“北邮人论坛”上发过求助帖子,得到了许多热心的师兄师姐的帮忙。 3.电话联系。通过网络、BBS等方法了解到导师的情况之后,就可以电话联系导师了。在联系导师的时候,你可以把自己的优势例如动手

实验二(1)进程同步

实验二(2)进程同步 一、实验目的 1、生产者-消费者问题是很经典很具有代表性的进程同步问题,计算机中的很多同步问题都可抽象为生产者-消费者问题,通过本实验的练习,希望能加深学生对进程同步问题的认识与理解。 2、熟悉VC的使用,培养和提高学生的分析问题、解决问题的能力。 二、实验内容及其要求 1.实验内容 以生产者/消费者模型为依据,创建一个控制台进程,在该进程中创建n个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。 2.实验要求 学习并理解生产者/消费者模型及其同步/互斥规则;设计程序,实现生产者/消费者进程(线程)的同步与互斥; 三、实验算法分析 1、实验程序的结构图(流程图); 2、数据结构及信号量定义的说明; (1) CreateThread ●功能——创建一个在调用进程的地址空间中执行的线程 ●格式 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize,

LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParamiter, DWORD dwCreationFlags, Lpdword lpThread ); ●参数说明 lpThreadAttributes——指向一个LPSECURITY_ATTRIBUTES(新线程的安全性描述符)。dwStackSize——定义原始堆栈大小。 lpStartAddress——指向使用LPTHRAED_START_ROUTINE类型定义的函数。 lpParamiter——定义一个给进程传递参数的指针。 dwCreationFlags——定义控制线程创建的附加标志。 lpThread——保存线程标志符(32位) (2) CreateMutex ●功能——创建一个命名或匿名的互斥量对象 ●格式 HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCTSTR lpName); bInitialOwner——指示当前线程是否马上拥有该互斥量(即马 ●参数说明 lpMutexAttributes——必须取值NULL。上加锁)。 lpName——互斥量名称。 (3) CreateSemaphore ●功能——创建一个命名或匿名的信号量对象 ●格式 HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCTSTR lpName ); ●参数说明 lpSemaphoreAttributes——必须取值NULL。

考研心路历程我记得……

考研心路历程:我记得…… 后知后觉,我的考研日子也就这样悄无声息地结束了。曾经,在考研的战场上匍匐前进,度日如年,感觉考研的日子是一段永无止尽的黑暗岁月,整个节奏是压抑和煎熬。如今,再回首,那只是一段失去的岁月,那只是一段破茧成蝶的青春,那只是一节哭过笑过的插曲。 很多年过去了,我依稀记得四年前高考落榜的泪水,依稀记得漫步在武大华科内心的起伏,依然记得自己对那些成功学子的羡慕和觊觎。是的,我的想法很简单,很虚荣,只是因为向往名校,只是因为不甘心,只是因为想要证明自己,我才埋下了考研的种子并且绝不回头。 现在回想我的大学生活,不得不承认,大一大二嘴里念着考研,信誓旦旦地说着考研,只是一种脱口而出的口号,一种没有历经寒彻骨的无知,一种初生牛犊不怕虎的稚气。当大三下悄然来临,当自己感到考研的气息在冷冷地逼近,当耳畔到处弥漫着复习的声音,那时才真正知道,曾经轻描淡写的考研生活就要在自己身上发生了。在此时此刻,似乎面临着又一次高三和梦想的抉择,我感到心力交瘁,握在手里的梦想和踩在脚下的生活,我含泪坚持我心中最真实的渴望,忍痛向自由潇洒的生活挥手告别。 我记得那时候在课堂上,在自习室里默默地啃着英语单词和高数课本时,脑袋里会莫名其妙地浮现出很多奇奇怪怪地想法,会诧异于自己此时此刻所做的琐碎之事,会对自己要开始枯燥单调的生活萌生些许躁动,也会时不时地怀疑自己做这一切的动机和意义。那时的我是懵懂的,对考研没有计划,没有方向,只是单纯地按部就班,照猫画虎;只知道我将在这条路上义无反顾地走下去,怎么走,如何面对路上的荆棘,我没有想过,也没有意识到。当一个个不曾想过的问题接踵而至时,我措手不及。专业学校的选择,资料信息的搜集,复习计划的安排……所有的琐碎之事在刹那间被无限放大,全都跳出来成为困扰我的头等大事。刚钻进考研大军的自己,被淹没在漫无边际的无知和慌乱之中。两眼愣愣地追随这条队伍,脚步紧跟其后,心却被掏空,不知自己为何这样坚持,为何这样为难自己。我就像一直没有触角的苍蝇,拼命的飞,却找不到方向,处处碰壁的疼痛不足为谈,内心深处揪心的慌乱和撩人的躁动才是真正折磨自己的。 我记得自己在专业学校间苦苦挣扎,也许真的是车到山前必有路,船到桥头自然直,一些事就那么水到渠成的决定了。从大一就抱着考经济统计的梦想,在现实面前我一次次妥协了,从人大,厦大至最后的华工,经历了一次次自我剖析和踌躇徘徊,我忍痛撕毁我曾经设计好的蓝图,用心酸又强劲的笔画上了我新的一页毅然选择了华科的控制系。把自己几年前的梦摧毁掉,有不舍也有别人不懂的遗憾,但我知道,着是为了自己的明天,谁说下一张蓝图不会更美更灿烂了?当一切蓝图都绘画好时,剩下来的就是践行了,在心里默默地激励自己,祝福自己。 我记得,我和几个研友每天定时来到自习室,机械似的重复没有休止的工作,如同西绪弗斯的石头一样,今天好不容易推到山顶了,第二天早上,它仍冷冰冰地躺在山脚。我们不多说话,一个微笑代替所有的寒暄,一句简单的问候代替所有的闲谈,我们都把所有的力气

第二章-操作系统进程(练习题答案)

第二章进程管理 1.操作系统主要是对计算机系统全部 (1) 进行管理,以方便用户、提高计算机使 用效率的一种系统软件。它的主要功能有:处理机管理、存储管理、文件管理、 (2) 管 理和设备管理等。Windows和Unix是最常用的两类操作系统。前者是一个具有图形界面的 窗口式的 (3) 系统软件,后者是一个基本上采用 (4) 语言编制而成的 的系统软件。在 (5) 操作系统控制下,计算机能及时处理由过程控制反馈的信息 并作出响应。 供选答案: (1): A. 应用软件 B. 系统软硬件 C. 资源 D. 设备 (2): A. 数据 B. 作业 C. 中断 D. I/O (3): A. 分时 B. 多任务 C. 多用户 D. 实时 (4): A. PASCAL B. 宏 C. 汇编 D. C (5): A. 网络 B. 分时 C. 批处理 D. 实时 答案:CBBDD 2.操作系统是对计算机资源进行的 (1) 系统软件,是 (2) 的接口。 在处理机管理中,进程是一个重要的概念,它由程序块、 (3) 和数据块三部 分组成,它有3种基本状态,不可能发生的状态转换是 (4) 。 虚拟存储器的作用是允许程序直接访问比内存更大的地址空间,它通常使用 (5) 作为它的一个主要组成部分。 供选答案: (1): A. 输入和输出 B. 键盘操作 C. 管理和控制 D. 汇编和执行 (2): A. 软件和硬件 B. 主机和外设 C. 高级语言和机器语言 D. 用户和计算机 (3): A. 进程控制块 B. 作业控制块 C. 文件控制块 D. 设备控制块 (4): A. 运行态转换为就绪态 B. 就绪态转换为运行态 C. 运行态转换为等待态 D. 等待态转换为运行态 (5): A. 软盘 B. 硬盘 C. CDROM D. 寄存器 答案:CDADB 3.在计算机系统中,允许多个程序同时进入内存并运行,这种方法称为 D。 A. Spodling技术 B. 虚拟存储技术 C. 缓冲技术 D. 多道程序设计技术 4.分时系统追求的目标是 C。 A. 高吞吐率 B. 充分利用内存 C. 快速响应 D. 减少系统开销 5.引入多道程序的目的是 D。

考研历史资料

世界文明史 一、文字 1.刻痕和结绳计事(原始人) 2.图画文字(新石器,北美,文字的第一阶段) 3.象形文字:(埃及)用一定物体的形象符号来表示一定意义的文字, 有一定的读音,是真正意义的文字。 4.楔形文字:(苏美尔,世界最早的文字)由表意符号,表音符号和 限定符号3部分组成。 5.腓尼基字母:共22个字母,是线性符号 6.线性文字A:希腊古王宫时期克里特文明 7.迈锡尼线形文字:迈锡尼圆顶墓王朝 二、古代西方文明 1、苏美尔—巴比伦 《吉尔伽美什史诗》是世界上最早的英雄叙事诗。 塔庙:苏美尔建筑的典型代表,筑在高台上(乌尔大塔庙) 萨尔贡二世王宫遗址:现存霍尔萨巴德,典型的亚述建筑 2、古埃及 短篇小说:《两兄弟的故事》《一个能言善辩的农夫》 《辛努海特的故事》《船舶遇难记》《占领尤巴城》诗歌:反应劳动者生活的:《打谷歌》《搬谷歌》 颂诗:《尼罗河颂》《阿谷颂》

战记:《斯特摩斯三世年代记》 教育性作品:古王国时期《普塔霍特普的教育》 中间期:《聂菲尔列胡预言》《伊浦味陈词》《对美丽卡拉王的教育》中王国:《杜啊乌夫之子赫琪给其子柏比的教谕》 埃及历法:制定了太阳历,把一年分三季,每季4个月,共12个月,每月30天,共360天,其余5天作为节日之用。 数学纸草文献:莫斯科数学纸草、林德纸草、阿纳斯塔西纸草 创造了十进位的计数制度,并创造了表示数字的若干符号 医学:木乃伊 建筑:金字塔、卡尔纳克神庙、卢克索尔神庙 圆雕:狮身人面像 绘画:《纸草丛的猫》《三个女音乐家》 3、古印度 吠陀:早《梨俱吠陀》《沙摩吠陀》《耶柔吠陀》《阿闼婆吠陀》后期《梵书》《森林书》《奥义书》 史诗:《摩诃he婆罗多》:讲述婆罗多族的后裔居楼王族的堂兄弟 之间的斗争。是古代南亚的一部百科全书。 《罗摩衍那》讲述阿瑜陀国十车王的长子罗摩远征楞伽岛 的恶魔十首王罗波那的故事。 《佛本生经》佛教文学,巴利文写成。编于前3世纪 《摩奴法典》古印度法制史上第一部正规的权威法律典籍。 《政事论》(《利论》)记叙孔雀帝国政事,开国大臣考底利

山东大学操作系统实验报告4进程同步实验

山东大学操作系统实验报告4进程同步实验

计算机科学与技术学院实验报告 实验题目:实验四、进程同步实验学号: 日期:20120409 班级:计基地12 姓名: 实验目的: 加深对并发协作进程同步与互斥概念的理解,观察和体验并发进程同步与互斥 操作的效果,分析与研究经典进程同步与互斥问题的实际解决方案。了解 Linux 系统中 IPC 进程同步工具的用法,练习并发协作进程的同步与互斥操作的编程与调试技术。 实验内容: 抽烟者问题。假设一个系统中有三个抽烟者进程,每个抽烟者不断地卷烟并抽烟。抽烟者卷起并抽掉一颗烟需要有三种材料:烟草、纸和胶水。一个抽烟者有烟草,一个有纸,另一个有胶水。系统中还有两个供应者进程,它们无限地供应所有三种材料,但每次仅轮流提供三种材料中的两种。得到缺失的两种材料的抽烟者在卷起并抽掉一颗烟后会发信号通知供应者,让它继续提供另外的两种材料。这一过程重复进行。请用以上介绍的 IPC 同步机制编程,实现该问题要求的功能。 硬件环境: 处理器:Intel? Core?i3-2350M CPU @ 2.30GHz ×4 图形:Intel? Sandybridge Mobile x86/MMX/SSE2 内存:4G 操作系统:32位 磁盘:20.1 GB 软件环境: ubuntu13.04 实验步骤: (1)新建定义了producer和consumer共用的IPC函数原型和变量的ipc.h文件。

(2)新建ipc.c文件,编写producer和consumer 共用的IPC的具体相应函数。 (3)新建Producer文件,首先定义producer 的一些行为,利用系统调用,建立共享内存区域,设定其长度并获取共享内存的首地址。然后设定生产者互斥与同步的信号灯,并为他们设置相应的初值。当有生产者进程在运行而其他生产者请求时,相应的信号灯就会阻止他,当共享内存区域已满时,信号等也会提示生产者不能再往共享内存中放入内容。 (4)新建Consumer文件,定义consumer的一些行为,利用系统调用来创建共享内存区域,并设定他的长度并获取共享内存的首地址。然后设定消费者互斥与同步的信号灯,并为他们设置相应的初值。当有消费进程在运行而其他消费者请求时,相应的信号灯就会阻止它,当共享内存区域已空时,信号等也会提示生产者不能再从共享内存中取出相应的内容。 运行的消费者应该与相应的生产者对应起来,只有这样运行结果才会正确。

考研感悟一年的经历一年的收获

考研感悟:一年的经历一年的收获考研已经结束快一个月了,所有关于考研的经历与回忆似乎都在离我渐渐远去。或许很多年后,成功与失败也已不会像现在这般刻骨铭心,但曾经那段没日没夜拼搏的日子却会让我一生铭记。一直打算将自己考研的整个历程用文字记录下来,纪念自己去年一年的考研时光,纪念那一段简单而充实的日子。这次刚好有这个机会,写一下我的考研经历,就与大家分享自己的心得体会,希望对后面考研的学弟学妹有所帮助。 打算考研从大二就开始了,那时候对自己本科所读的学校一直不满意,所以希望通过考研能圆自己一个名校梦,真正开始考研却是从大三下学期开始。我的本科专业是物理学,物理学大多都是理论分析和计算,自己不太感兴趣,所以跨考了微电子专业。一志愿报考的是中科院微电子所,但由于中科院微电子所录取分数非常高,最终没有进入,心里着实有些遗憾。不过很幸运地调剂进入了广州的一所211学校,专业和导师都很不错,算是圆了自己的一个考研梦。 对于一个刚开始考研的人,心里面一定有着许多的迷茫和困惑,包括自己是不是应该考研,专业和学校应该如何抉择,考研复习应该如何规划等。下面我通过自己一年的考研心得向后面考研的人说说自己的体会,如果你们能从中有所收获,我也会感到莫大的欣慰。 首先是应不应该考研的问题,这是许多应届本科生以及一些已经参加了工作的人都迷茫的问题。其实对我们来说,考研或许不是最好的选择,但绝对是一个不错的选择。大家都知道,国家现在年年扩招,本科生开始走以前专科生的路线,比起十年前本科生来说,已经贬值了许多。我们虽然在大学

期间学了很多门专业课,但大多内容宽泛而深度不够。如果希望在自己的专业领域有进一步的发展,那么读研能够真正让你有所收获。 有的人考研是为了继续钻研学问,有的人考研是为了找一份好的工作,有的人或许仅仅是弥补自己心中的遗憾。我想说不管你考研最终是为了什么,但你一定要给自己找一个能让自己为了目标坚持下去的理由。在考研的过程中,我见过太多半途而废的人,有的人刚考研一两个月就退出了,觉得吃不了考研的那份苦;有的人到半路就消失了,认为自己不适合考研;有的人是到了最后放弃了,觉得看不到一丝希望也离开了。真正经过一年考研,对我来说最大的收获不是考研最终的结果,而是其中所经历的过程。如果你真正经历了考研的整个过程,我觉得不管是你在专业知识的理解上还是自己的心志和毅力方面,都会有这巨大的提升。考研这个过程会让你对自己的人生有着新的感悟。 下面是关于如何选择自己的专业和学校的问题,很多人在确定专业和学校的时候,不知道是先确定专业还是先确定学校。这一点我和大家说一下,考研一般是先确定自己所要报考的专业,再确定学校。除非是你对某个学校有着特殊的情结,非他不读。在你确定自己的专业后,通过上网查询哪些学校研究生阶段开设这门课程,从而选择适合自己的学校。在确定学校时,可能也会让人很纠结,因为如果是第一次考研,大家都不知道自己实力如何,所以很多人想报考好的学校又不敢选择。其实学校的确定不一定要那么早,只要是在网上报名之前选择就可以了,那时候根据自己的复习进度,其实你心里面对自己的实力应该大概有一个基本的认识了。不过学校的确定还是越早越好,因为这样你可以更好的复习你的专业课,不同的学校哪怕是同一个

考研历程:从辞职到考研

考研历程:从辞职到考研 一、考研原因 从脑海里有了辞职考研念头开始,关注辞职考研论坛已经有两年多了,两年来看到了无数人经过艰苦努力最后终成正果的欣喜,也看到了无数人辛苦拼搏却没能顺利如愿的心酸,经过将近一年多纠结,奋斗,迷茫,煎熬,我终于能够安静的坐下来和大家聊聊这一年来自己辞职考研的经验心得,也算是作为对论坛的一点回馈,希望我的考研经历能够给所有的大龄考研青年一些帮助。切入正题,本人88年出生,2011年毕业于江苏某不知名非211本科,材料专业,现已被上海某研究所录取,今年的考研成绩政治68,英语68,数学130,专业课130+,还算说的过去的成绩,我参加过两次考研,第一次是大四报考天津大学,由于准备不够充分没能过线,失望太大放弃了调剂直接签了工作,这三年来考研占据我整个脑子身体,好在我咬着牙坚持下来了,也有足够的勇气给大家分享我这几年的心路历程! 先说为什么要辞职考研,只要脑子里有了考研的念头,如果不去实现,会一直存在你脑子里然后折磨你一辈子!毋庸置疑将来的就业市场研究生绝对是主力,很多高管岗位要求都是研究生,考个研究生无落对于职业发展还是薪资待遇都是有极大帮助的,趁着现在年轻思路清晰还能拿得起书本,就应该为自己的梦想拼搏一把,在自己的理想面前,什么家人的反对,放弃优厚工作等等都是浮云,其他所有的东西在将来的工作中都能得到,唯有考研不是生命中任何时候都能做到的,既然决定了考研,就不要犹豫,更不要担心考上考不上的问题,只要决定了,什么也不要考虑,直接拿起书本复习积极准备,迈出这一步你就是成功了一大半了,即使不成功也会让你下半辈子过的安心一些,大不了再去工作,这条路很艰辛很煎熬,但是如果你咬咬牙挺过来了,回头来看,那段艰苦的岁月会是你人生中过的最充实的日子!也许你可以找出一万个放弃考研的理由,但是有一个理由足以让你充满信心坚持下去,那就是:考研是你的梦想! 二、相关事宜的处理 辞职考研手续办理是个关键的步骤,比如档案,党组织关系,户口等等。说一下我的经历,去年八月二十号正式提交离职申请,跑完各级部门的签字,最后到财务处办理工资结算,已经八月三十号了,当晚和部门工作组吃过散伙饭第二天我坐上火车回到母校正式投入考研复习。档案我和人事部商量暂时放在公司,待考上再迁走,如果公司不同意档案留在公司,可以放在当地的人才市场,到时候拿着学校发给你的调档函直接提取;党组织关系可以继续留在公司,但是党费一定要按时交同事帮忙交,原则规定半年以上不参加党内活动,就要面临退党处理,所以最好给党政部门说点好话,一般只要交付党费就没事,实在不行的话就开回家里的街道办;集体户口不用管,公司也无权干涉,到候拿着录取通知书可以迁到学校。像我一样,工作刚满一年可能要面临转正问题,我走的急没办理转正定级,能办还是提前办理转正定级为好;至于五险一金,保险不能支取,只要停交就会自动封存,待将来再次工作转移到工作的城市,公积金可以在考上以后提取现金,也可以继续封存和保险一样将来再转移。总之,这些认识手续一定要办理妥当,这样才能安心复习,避免不必要的麻烦。 三、考研复习 考研复习地点最好选择在有学习氛围的场所,比如大学母校,目标院校等,尽量不要在家里自己复习,家里的干扰太多,而且容易引起父母的担心,在学校考研自习室不仅有良好的学习氛围,更能通过和研友们的交流,了解最新的考研动态,休息的时候大家聊聊天,放

回忆我的考研历程_心得体会

回忆我的考研历程 本文是关于心得体会的回忆我的考研历程,感谢您的阅读! 朝花夕拾·莫忘初心——回忆我的考研历程 六月的毕业季终于到来,葱郁斑驳的树荫下交织着欢笑与泪水。大学生活终于扬起尾巴,一场青春的繁华盛宴缓缓落下帷幕。走在天颐湖畔的石板小径上,回忆往昔,往事浮现,或清晰,或朦胧,有的刻骨铭心,有的刻意忘却,但度过的每一天、读过的每一本书、认识的每一个人、去过的每一个地方,却都是这个故事里难以割舍的回忆。从大学开始,我一直坚持着这样一个习惯:用三言两语概括并记录下一天的所行所思。四年后,翻阅着还几百页的“成长记录”,方知自己再也不复当年。随着旧时岁月的光影越来越渺远,对大学生活做一个完整回顾与总结的念头便愈发强烈,但千头万绪,却不知从何说起,又何处止歇。 在进入大学的第一天,我便问自己,这四年我能学到什么?四年后我会成为一个什么样的人?四年后我又身在何方?其实到今天为止,我都没给这些问题一个令自己满意的答复。因为,这四年,尤其是后两年的经历,让我见识到了太多更加开阔的东西,这就不断矫正甚至否定了自己曾经一些幼稚与浅薄的想法。但到了今天,我又怎敢说自己就是成熟呢?在从学校回家的路上,想起无数往昔的瞬间,用文字记下的是回忆,是历史,更是思考…… 一、扫一扫记忆碎片 2009年9月5日,我来到山东师范大学文学院报道。和很多同学一样,带着对新生活无限向往的热情,开始了大学的新旅程。因为学校离家不远,高中又是在山师附中读的,自然对山师大有种特殊的感情。但自己心里也知道,这不过是一所普通的一本大学,进校后还需潜心读书,多加学习。不过,当时身为井底之蛙的自己并不知道“大学何为”,只是带着自小对读书的偏爱,时常进入图书馆胡乱翻阅,泛泛而看,而不求甚解。 对于大学生活的认知,当时并没有太过明确的目标。或许是骨子里有那么一点不安分,开学后便积极参加了学生会、班级和社团组织的许多活动。最为幸运的是,结识并融入了中文一班这个大家庭。或许是身为班长的缘故,忙碌的日子总是大于空虚的时间。到现在我还经常想起,与周倩、海洋、张强为了一个活动的策划而争论得面红耳赤的场景。那段记忆虽然忙碌而疲惫,却是温暖而纯净的。

一位考研大神的考研历程(仅供参考)

从苦行僧到清华状元的蜕变历程 档案 姓名:戴震宇 考研成绩:总分447分,数学147分,政治81分,英语82分,专业课137分 本科院校:华中科技大学机械科学与工程学院机械设计制造及其自动化 报考院校:清华大学精密仪器与机械学系 2008年研究生考试过去了,我成为这次考试中的一个幸运儿;回想过去大半年时间,无限感慨。半年来,我过着苦行僧式的生活,每天早出晚归,脑海里思考最多的就是学习,我很惊奇:在过了3年猪一般懒散的生活后,我还能重新拾起高中所拥有的那种勇气和决心为着更高的目标艰苦奋斗。时常和朋友谈起这些,我都感觉十分诧异;说实话,现在想起过去半年的生活,确实是比较苦的,不过当时并没有觉得,因为当时根本就不会考虑到这些。 初次踏上考研之路的你们,也许会觉得自己是在黑暗中摸索。但当你胜利到达成功的彼岸,回过头去,身后的路已是阳光灿烂——我曾这样走过。所以,我希望我的经验和教训能够让你们不再迷茫,能够在你们的身上体现出更光辉的价值! 在全面介绍我的考研历程之前,首先,我想和大家共同探讨几个问题: 1.为什么考研? 2.考研到底有多大价值? 3.什么样的人可以考上研? 4.考什么学校,什么专业? 第一个问题,在大三的时候我们就开始考虑毕业出路——读研,工作,出国。对于出国,我想如果没有经济实力的话,很少有人会考虑。读研成为了我们大多数人的选择,因为本科生实在是不好找工作,而且待遇差,不过也有些专业比较好就业,比如我们专业,所以我们班很多人都工作了,应该说是很大一部分。当然我不否认还是有人能找到比较好的工作,但是你们看看这又有多大比例呢?寥寥无几。所以我相信考研是改变人生命运的一次不可错过的机会。 当时为什么不想工作?一则我觉得我自己掌握的知识实在是太少了,根本没有出去工作的心理准备,二则希望考个更好的学校提升一下自己;此外,据我了解(在成绩出来之前我曾经去找过工作,华为等公司),本科生出去所找的工作在条件,待遇等等方面上都与我的理想相差太远,首先是那个工作是枯燥的,乏味的,绝对不是你们所想象的那么好,其次待遇,我去面试一个大连高金数控公司,现在是私营企业,他说他们只能给一个本科生2000元一个月,不知道大家听到这个数字有什么想法,说实话——真寒心啊,我们寒窗苦读,读了这么多年出来不过是一个农民工的工资,那还不如不读,大家看看现在CPI多高啊,更别提那个房价了,要是这样,我们恐怕只能靠父母了。好多工作过的人都回头来考研,一个原因就在于与期望值的差距,其实出去后再回来考是很难的,一则心很难收回来,二则很多东西都忘光了,需要从头再来,三则工作经验在复试的时候是很不受重视的,相反,应届生则很受青睐。 关于第二个问题,说到考研有多大价值。 我给大家列举一个我们华工机械的例子,我们班本科生如果是沿海大概3000-4000一个月,内陆譬如说南京可能不到3000,当然了,这个不绝对,但是在我们学校读两年研后研究生平均工资6000,可能还会更高。所以说基本上再读两年身价会翻倍,当然了,如果考个更好的学校待遇肯定还会高。

李建伟版实用操作系统第二版最新习题 3 进程同步与通信

李建伟版实用操作系统第二版最新习题 3 进程同步与通信 一、选择题 题号1 2 3 4 5 6 7 8 9 10 答案A D D C B C A B A A 题号11 12 答案D C 二、综合题 1、答:临界资源也称独占资源、互斥资源,它是指某段时间内只充许一个进程使用的资源。比如打印机等硬件资源,以及只能互斥使用的变量、表格、队列等软件资源。各个进程中访问临界资源的、必须互斥执行的程序代码段称为临界区,各进程中访问同一临界资源的程序代码段必须互斥执行。 为防止两个进程同时进入临界区,可采用软件解决方法或同步机构来协调它们。但是,不论是软件算法还是同步机构都应遵循下述准则: ①空闲让进。②忙则等待。③有限等待。④让权等待。 2、答:忙等待意味着一个进程正在等待满足一个没有闲置处理器的严格循环的条件。因为只有一个CPU 为多个进程服务,因此这种等待浪费了CPU 的时钟。 其他类型的等待:与忙等待需要占用处理器不同,另外一种等待则允许放弃处理器。如进程阻塞自己并且等待在合适的时间被唤醒。忙等可以采用更为有效的办法来避免。例如:执行请求(类似于中断)机制以及PV 信号量机制,均可避免“忙等待”现象的发生。 3、答: 在生产者—消费者问题中,Producer 进程中P(empty)和P(mutex)互换先后次序。先 执行P(mutex),假设成功,生产者进程获得对缓冲区的访问权,但如果此时缓冲池已满,没有空缓冲区可供其使用,后续的P(empty)原语没有通过,Producer 阻塞在信号量empty 上,而此时mutex 已被改为0,没有恢复成初值1。切换到消费者进程后,Consumer 进程执行P(full)成功,但其执行P(mutex)时由于Producer 正在访问缓冲区,所以不成功,阻塞在信号量mutex 上。生产者进程和消费者进程两者均无法继续执行,相互等待对方释放资源,会产生死锁。 在生产者和消费者进程中,V 操作的次序无关紧要,不会出现死锁现象。 4、答:

我的考研历程

我的考研历程 现在是2008年9月份了,距离去年我准备考研已有一年的时间了。我一直很想把我考研这段难忘的经历记录下来。可是由于种种原因,或者说是我懒,就一直没有动笔。这篇文章直到今天才算完成,我不是一下子写完的,我只能一点一点写,随心所欲。 一、考研前 我的第一学历应该是专科,就是因为知道专科毕业不好找工作,而且我也不想过早踏入社会,才选择了专升本,升上了一所本科院校,开始我的两年学习生活。当时想着既然已经是本科生了,毕业后应该能找一个差不多的工作了吧。有人问我考研不考,我说没想好,因为在我心里,研究生是一个很崇高、很神圣的学位,我如此愚笨,是不可能考上的。再说,我对考研情况一无所知,也不知道要考哪个学校好。所以,在我专升本的头半年(专升本两年学制)我是没有下决心考研的。后来随着时间的推移,我的想法慢慢发生了变化。我觉得时间过得太快了,转眼本科还要毕业了,而我心里也越来越恐慌,即对工作、对社会还有一种恐惧感。我想,如果还能继续当学生多好啊,而唯一的办法就是考研,继续深造。于是考研这个想法在我心里生了根。 2007年4月,我们上一届师兄师姐考研复试结束,我们系请了几位成绩优秀的同学来我们班里给我们传授经验。他们一个个谈了自己考研的想法和经验,我们在底下认真的听,还随时问他们一些问题。我记得其中一个女孩说过:其实,考研最重要的是四个字:水到渠成。只要你努力了,踏踏实实学习了,最后自然会有一份收获的。“水到渠成”给了我深刻的印象,我万分同意。当我看着他们在台上神采飞扬,我心里暗想:明年的这个时候,我能不能坐在讲台上为师弟师妹们传授经验呢? 后来我就开始到书店选购考研书籍了。关于考研方面的书可真多,我买了一本英语考研必备,很厚的一本书,又买了石春桢的题,大家都知道很难的。每天看一点,因为那时候才大三(专升本),考研的心还没有完全定下来,所以学习比较松散,真正的复习备考是从暑假开始的。 二、复习备考 人家都说考研都是从进入大四前的暑假开始的。我也这么做。在忙完了大三最后一学期的期末考试后,就开始考虑报考研辅导班的问题了。那时启航在我们学校里做招生宣传,我跟几个同学商量,决定就报启航,因为据说启航里的陈先奎老师很厉害。启航开课时间是8月1号,我可以在家呆一个月。以前放暑假我都是在家呆足两个月才去学校,这一次只能呆一个月,我心里有点不舍。但一想到要考研,还是狠狠心。这一个月,我在家也并没有像以前一样闲着玩,而是有目的地看书。每天上午看一会,包括英语、以前学过的政治经济学课本,因为有人说政经是考研科目最难的,所以要及早下手。就这样,我虽然没有下狠功夫,但这一个月也总算看完了几本课本,到上辅导班的时候最起码有个底了。 由于暑假要来学校上辅导班,寝室又不能住,我们早就在学校附近租了一个房子。一共四、五个人住吧。现在想起来,那时的时光还真是让人留恋。我离开家来到租的房子,开始了我的租房生活。本来说好的8月1日就开课,可是那一年不知怎么回事,一直拖,考研大纲很晚才下来,其他的辅导班也是拖,我们直到8月26日(大概是这个日子)才开始开课,这时我们学校已经开学了。 我在房子租住的时候,很自由,不像在寝室还要熄灯。在这里,一切随意。不过我跟另外一个女生在一个屋里住,也不是特别随便。但她一般都去学校找固定教室学习,而我没有固定作座位,只好在小屋里看书,倒也清净。屋里有一张大桌子,还有很大的太师椅,我坐进去很舒服。学习的时间是上午、下午、晚上。由于我这个人从来不会下狠功夫逼迫自己,所以学习时还是很随心的。中午出去买饭带回来吃,晚上去学校打热水,然后买几个凉菜回屋

操作系统-进程同步习题

第二章进程同步 一、选择最合适的答案 1. 用P、V操作管理临界区时,信号量的初值一般应定义为()。 A.–1 B.0 C.1 D.任意值 2. 有m个进程共享同一临界资源,若使用信号量机制实现对一临界资源的互斥访问,则信号量的变化范围是()。 A.1至–(m-1) B.1至m-1 C.1至–m D.1至m 3. 在下面的叙述中,正确的是()。 A.临界资源是非共享资源 B.临界资源是任意共享资源 C.临界资源是互斥共享资源 D.临界资源是同时共享资源 4. 对进程间互斥地使用临界资源,进程可以() A.互斥地进入临界区 B.互斥地进入各自的临界区 C.互斥地进入同一临界区 D.互斥地进入各自的同类资源的临界区 5. 设两个进程共用一个临界资源的互斥信号量mutex,当mutex=1时表示()。 A.一个进程进入了临界区,另一个进程等待 B.没有一个进程进入临界区 C.两个进程都进入了临界区 D.两个进程都在等待 6. 设两个进程共用一个临界资源的互斥信号量mutex,当mutex=-1时表示()。 A.一个进程进入了临界区,另一个进程等待 B.没有一个进程进入临界区 C.两个进程都进入了临界区 D.两个进程都在等待 7.当一进程因在记录型信号量S上执行P(S)操作而被阻塞后,S的值为()。 A.>0 B.<0 C.≥0 D.≤0 8.当一进程因在记录型信号量S上执行V(S)操作而导致唤醒另一进程后,S的值为()。 A.>0 B.<0 C.≥0 D.≤0 9.如果信号量的当前值为-4,则表示系统中在该信号量上有()个进程等待。 A.4 B.3 C.5 D.0 10.若有4个进程共享同一程序段,而且每次最多允许3个进程进入该程序段,则信号量的变化范围是()。 A. 3,2,1,0 B. 3,2,1,0,-1 C. 4,3,2,1,0 D. 2,1,0,-1,-2 11.若信号S的初值为2,当前值为-1,则表示有( )个等待进程? A.0 B.1 C.2 D.3 12.如果有三个进程共享同一互斥段,而且每次最多允许两个进程进入该互斥段,则信号量的初值应设置为()。 A. 3 B. 1 C. 2 D. 0 13.并发进程之间() A.彼此无关 B.必须同步 C.必须互斥 D.可能需要同步或互斥

[操作系统]经典进程同步问题题库

1、测量控制系统中的数据采集任务把所采集的数据送一单缓冲区;计算任务则从该缓冲区中取出数据并进行计算。试写出利用信号量机制实现两者共享单缓冲区的同步算法。 Var Sempty,Sfull: semaphore:= 1,0 Begin Parbegin Collection:begin repeat 采集一个数据; wait(Sempty); 数据放入缓冲区; signal(Sfull); untill false; end; Compute:begin repeat wait(Sfull); 从缓冲区取出数据; signal(Sempty); 计算; ` until false; end; Parend End 2、有一阅览室,共有100个座位。读者进入时必须先在一种登记表上登记,该表为每一座位列一个表目,包括座号和读者姓名。读者离开时要注销掉登记内容。试用wait和signal原语描述读者进程的同步问题。 var mutex, readcount :semaphore := 1,100; Begin Parbegin Process Reader:begin repeat wait(readcount); wait(mutex); <填入座号和姓名完成登记>; signal(mutex); <阅读> wait(mutex) <删除登记表中的相关表项,完成注销> signal(mutex); signal(readcount); until false; end; parend; End; 1)、桌上有一空盘,只允许放一个水果,爸爸专向盘中放苹果,妈妈专向盘中放桔子;女儿专吃盘中的苹果,儿子专吃盘中的桔子;试用wait 和signal原语实现爸爸、妈妈、女儿、儿子之间的同步问题。 var Sempty, Sapple, Sorange,: semaphore:= 1,0,0; begin parbegin Father: begin repeat wait(Sempty); ; signal(Sapple); until false; end; Mother: begin repeat wait(Sempty); ; signal(Sorange); until false; end; Son: begin repeat wait(Sorange); ; signal(Sempty); until false; end; Daughter: begin repeat wait(Sapple); ; signal(Sempty); until false; end; parend; end; 1、在4×100米接力赛中,4个运动员之间存在如下关系,运动员1跑到终点把接力棒交给运动员2;运动员2一开始处于等待状态,在接到运动员1传来的接力棒后才能往前跑,他跑完100米后交给运动员3,运动员3也只有在接到运动员2传来的棒后才能跑,他跑完100米后交给运动员4,运动员4接到棒后跑完全程。请试用信号量机制对其上过程进行分析。 var s1,s2,s3:semaphpre:=0,0,0; begin parbegin Athlete1: begin Run 100m; signal(s1); end; Athlete2: begin wait(s1); Run 100m; signal(s2); end; Athlete3: begin wait(s2); Run 100m; signal(s3); end; Athlete4: begin wait(s3); Run 100m; end; parend; end 2、在公共汽车上,司机和售票员各行其职,司机负责开车和到站停车;售票员负责售票和开、关车门;当售票员关好车门后驾驶员才能开车行驶。试用wait和signal操作实现司机和售票员的同步。

相关主题
文本预览
相关文档 最新文档