执行V操作的进程继续运行。
9什么是线程?它与进程有什么关系?
答:线程是进程中实施调度和分派的基本单位。 线程和进程之间有如下关系:
① 一个进程可以有多个线程,但至少有一个线程;而一个线程只能在一个进程的地址空间内活动。
② 资源分配给进程,同一进程的所有线程共享该进程的所有资源。
③ 处理机分给线程,即真正在处理机上运行的是线程。 ④ 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
10什么是管程?它由哪几部分组成?有什么基本特性?
答:一个管程定义了一个数据结构和能为并发进程在其上执行的一组操作,这组操作能同步进程和改变管程中的数据。
一个管程由四个部分组成,它们是管程名称、局部与管程的共享数据的说明、对数据进行操作的一组过程和对该共享数据赋初值的语句。
管程具有以下特性:
① 管程内部的局部数据变量只能被管程内定义的过程所访问,不能被管程外面声明的过程直接访问
② 进程要想进入管程,必须调用管程内的某个过程
③ 一次只能有一个进程在管程内执行,而其余调用该管程的进程都被挂起,等待该管程成为可用的。就是说,管程自身能有效地实现互斥。
综合题
1如下图所示的工作模型中,有三个进程p0,p1,p2和三个缓冲区B0,B1,B2. 进程之间借助于
相邻缓冲区进行消息传递:每个进程每次从缓冲区中取一条消息,经加工处理后送入另一个缓冲区中,三个缓冲区分别可存放3,2,2个消息。初始时,仅缓冲区0有一个消息。试用P、V操作写出三个进程之间的同步及互斥流程。
答:这是一个生产者/消费者问题,而且每个进程既是生产者,也是消费者。(2’)
为此,应设置6个信号量:B0S1,B0S2,B1S1,B1S2,B2S1,B2S2,分别代表B0,B1,B2中是否有空缓冲和有数据。
B0S1,B0S2,B1S1,B1S2,B2S2:semaphore;
B0S1=2;B0S2=1;B1S1=2;B1S2=0;B2S1=2;B2S2=0; (2’) Cobegin (`6’=2’*3) P0 begin
P1 begin
P2 begin
P(B2S2)
从B2取一个数据 V(B2S1) 加工 P(B0S1)
将加工结果送B0 V(B0S2)
P(B0S2) 从B0取一个数据 V(B0S2) 加工 P(B1S1) 将加工结果送B1 V(B1S2)
P(B1S2) 从B1取一个数据 V(B1S1) 加工 P(B2S1) 将加工结果送B2 V(B2S2)
end end end coend
这道题也可以增加互斥信号量,以便P0与P1之间互斥使用B0缓冲区,P1与P2之间
互斥使用B1缓冲区,P2与P0之间互斥使用B0缓冲区。这里主要描述它们之间的同步关系。若考虑互斥共享缓冲区,请自己加上。
2设用三个队列管理缓冲区池的使用情况,分别为空白缓冲队列em,输入缓冲队列in,以及输出缓冲队列out。过程add_buf(type,numb)和take_buf(type,numb)分别用来把缓冲区numb插入type队列和从type队列中取出缓冲区numb。试描述进程从任一缓冲队列中得到一个缓冲区的过程get_buf(type,numb)和释放一个缓冲区numb进入缓冲队列的过程put_buf(type,numb)。
答:假定用信号量s代表任一队列的可用缓冲区个数。假定三个队列的初值分别为n1,n2,n3。对任一队列的操作必须互斥。因此再引入一个互斥使用任一队列的信号量mutex,其初值为1。这里type代表队列的类型,它的取值为输入、输出和空白。(4’)
当有进程希望从任一队列取一个缓冲区时,过程get_buf(type,numb)的动作如下:
get_buf(type,numb) (`3’) begin p(s)
p(mutex)
numb=take_buf(type,numb)
v(mutex) end
当有进程希望向任一队列送一个缓冲区时,过程put_buf(type,numb)的动作如下:
put_buf(type,numb) (`3’) begin
p(mutex)
add_buf(type,numb) v(mutex) v(s)
end.
3设有一个售票厅,可容纳100人购票。如果厅内不足100人则允许进入,进入后购票,购票后退出。如果厅内已有100人,则在厅外等候。试问: 1) 购票者之间是同步还是互斥?
用P、V操作表达购票者的工作过程。
解:1)购票者之间是互斥关系。(2’)
2) 一个售票厅可容纳100人购票,说明最多允许100个购票者共享售票厅;可引入一个信
号量empty,其初值为100。由于购票者必须互斥地进行购票,故应再设一个mutex,其初值为1。(4’)
用P、V操作表达购票者的工作过程如下:(`4’)
empty,mutex:semaphore; empty:=100; mutex:=1; begin p(empty)
p(mutex)
进入厅内购票,购票后退出
v(empty) v(mutex) end.
4某招待所有100个床位,住宿者入住要先登记(在登记表上填写姓名和床位号).离去时要注销登记(在登记表上删去姓名和床位号).请给出住宿登记及注销过程的算法描述. 答:某招待所有100个床位,为了正确管理,引入一个信号量empty代表空床位数,初值为100;住宿者入住要先登记(在登记表上填写姓名和床位号),显然,登记表是一个临界资源,必须互斥访问,引入一个mutex,其初值为1。(4’) 住宿登记及注销过程的算法描述如下: 住宿登记:(`3’)
begin p(empty) //检查有无床位
p(mutex) //申请登记
找出一个空床位将名字登入表中 v(mutex)
end
注销过程:(`3’)
begin p(mutex) //申请退房
找出自己的登记项,并删除该项的登记 v(mutex) v(empty)
end.
5有一个阅览室,共有100个座位。为了很好地利用它,读者进入时必须先在登记表上进行登记。该表表目设有座位号和读者姓名;离开时再将其登记项擦除。
试问:为描述读者的动作,应编写几个程序,应设几个进程、它们之间的关系怎样?并请用P、V操作描述进程之间的同步算法。
解:为了描述阅览室,用一个登记表来记录其使用情况。表中共有100项。每当有读者进入阅览室时,为了正确地登记,各读者应互斥使用(1’)。为此设两个信号量:mutex为互斥信号量,用来制约各读者互斥地进行登记,其初值为1;empty为同步信号量,用来制约各读者能同时进入阅览室的数量,其初值为100 (2’)。 下面用两个过程描述对表格应执行的动作: 登记过程:(`2’) 擦除过程:(`2’)
begin P(empty) P(mutex) 找到一个登记项登记
begin
P(mutex) 找到自己的登记项擦除 V(mutex)
V(mutex) V(empty)
end end
为了正确地描述读者的动作,可以将读者看成进程。若干读者希望进入阅览室时,调用
登记过程,退出阅览室时,调用擦除过程(1’)。
可见,一个程序可对应多个读者。可设的进程数由读者数决定,其动作如下:(`2’)
begin 调用登记过程
进入阅览室阅读 准备退出
调用擦除过程
end.
6一条河上架设了由若干个桥墩组成的一座桥。若一个桥墩只能站一个人,过河的人只能沿着桥向前走而不能向后退。过河时,只要对岸无人过,就可以过;但不允许河对岸的两个人同时过,以防止出现死锁。请给出两个方向的人顺利过河的同步算法。
解:假设一座桥由N个桥墩,也即最多允许有N个人同向过河,用一个计数器R记录同时过河的人数(2’)。用S1信号量保护计数器,其初值为1,R的初值为0;互斥使用桥的信号量用S表示,其初值为1。(2’) 同步算法描述如下: procedure goriver()
begin L:P(S1);
//为同时过河,申请对计数器计数
//申请过河
If R>N begin V(S1); goto L; end //同方向过河的人站满桥墩时,重新申请计数 R=R+1; If R==1 P(S);
V(S1); //释放计数器的使用权 (3’) 占有一个桥墩,并顺序过河到对岸; P(S1); R=R-1;
If R==0 V(S);
//如果已经无同向的人过河,释放占用权
V(S1); (3’)
end.
7在一个飞机订票系统中,多个用户共享一个数据库。各用户可以同时查询信息,若有一个用户要订票,须更新数据库时,其余所有用户都不可以访问数据库。请用P,V操作设计一个同步算法,实现用户查询与订票功能。要求:当一个用户订票而需要更新数据库时,不能因不断有查询者到来而使其长时间等待。利用信号量机制保证其正常执行。
解:这是典型的读者——写者问题,查询信息的用户是读者,订票用户是写者,并且要求写者优先。(2’)
变量说明:(`2’)
计数变量
rc——正在运行的查询者进程数目,初值为0.
信号量
Sw——控制订票者进程的活动,初值为1.
Src——互斥使用rc变量,初值为1.
S——当订票者到达时封锁后续的读进程,初值为1.
读者进程 P(S) P(Src)
rc=rc+1
if (rc==1) P(Sw) V(Src)
V(S) (2’) 查询库当中的信息 P(Src)
rc=rc-1;
if (rc==0) V(Sw) V(Src) (2’)
写者进程 (`2’) P(S)
P(Sw)
更新数据库内容 V(Sw) V(S)
8某车站售票厅,任何时刻最多可容纳20名购票者进入,当售票厅中少于20名购票者时,则厅外的购票者可立即进入,否则需在外面等待。若把一个购票者看作一个进程,请回答下列问题:
(1)用PV操作管理这些并发进程时,应怎样定义信号量,写出信号量的初值以及信号量各种取值的含义。
(2)根据所定义的信号量,把应执行的PV操作填入下述空格中,以保证进程能够正确地并发执行。
COBEGIN PROCESS PI(I=1,2,??) begin
进入售票厅;
购票;
退出;
end COEND
(3)若欲购票者最多为n个人,写出信号量可能的变化范围(最大值和最小值)。 答:(1)定义一信号量S,初始值为20。 (1’) 意义:(`3’=1’*3)
S>0 S的值表示可继续进入售票厅的人数 S=0 表示售票厅中已有20名顾客(购票者) S<0 |S|的值为等待进入售票厅的人数 (2)上空格为P(S) (2’) ;下空格为V(S) (2’)
(3)S的最大值为20 (1’ );S的最小值为20-n (1’ )
9在公共汽车上,司机和售票员各行其职,司机负责开车和到站停车;售票员负责售票和开门关门,当售票员关好车门后,驾驶员才能开车行使。试用P/V操作实现司机与售票员间的同步。
解答:semaphore mutex1=0,mutex2=0; (2’) main(){
cobegin driver() busman() coend
} (2’) driver(){