内容发布更新时间 : 2024/12/23 7:24:25星期一 下面是文章的全部内容请认真阅读。
end
6.试从多个方面比较线程和进程 从四个方面:
(1) 调度:在传统的操作系统中,拥有资源的基本单位和独立调度、分派的基本单位都是进
程。而在引入线程的os中,则把线程作为调度和分派的基本单位,而把进程作为资源拥有的基本单位。使传统进程的两个属性分开,线程便能轻装运行,从而可显著地提高系统的并发程度。在同一进程中,线程的切换不会引起进程切换,在由一个进程中的线程切换到另一进程中的线程时,将会引起进程切换。(2)并发性:在引入线程的os中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间,亦可并发执行,因而使操作系统具有更好的并发性,从而能更有效地使用系统资源和提高系统吞吐量。(3)拥有资源:不论是传统的操作系统,还是设有线程的操作系统,进程都是拥有资源的一个独立单位。一般地说,线程不拥有系统资源,但它可以访问期隶属进程的资源。(4)系统开销:创建或撤销进程时,系统都要为之分配或回收资源。而线程切换只需保存和设置少量寄存器的内容。因此,进程切换的开销远大于线程切换的开销。
7.汽车司机与售票员之间必须协同工作。假定某辆公共汽车上有一名司机与两名售票员,汽车当前正在始发站停车上客,写出它们的同步过程(用管程或信号量机制均可)(哈尔滨工业大学2000)
var run1 run2,stop1,stop2:semaphore:=0,0,0,0; begin parbegin
driver:begin repeat
p(run1); p(run2); 开车; 停车; v(stop1); v(stop2); until false end
seller1:begin repeat 上乘客;
关车门; v(run1); 售车票; p(stop1); 开车门; 下乘客;
until false end
seller2:begin
repeat
上乘客;
6 / 13
关车门; v(run2); 售车票; p(stop2); 开车门; 下乘客;
until false end parend end
分析:司机必须等到两个售票员都完成关车门后(两次p操作)才能开车,同样到站后应让两个售票员都知道(两次v操作)
8.今有三个并发进程R、M、P,它们共享了一个可循环使用的缓冲区B,缓冲区B共有N个单元。进程R负责从输入设备读信息,每读一个字符后,把它存入到缓冲区B的一个单元中;进程M负责处理读入的字符,若发现读入的字符中有空格,则把它改成“,”;进程P负责把处理后的字符取出并打印输出。当缓冲区单元中的字符被进程P取出后,则又可用来存放下一次读入的字符。请用PV操作为同步机制写出它们能正确并发执行的程序。
设置四个信号量:
mutex:用于实现对缓冲区的互斥访问,初值为1; empty:表示缓冲区中可用单元数目,初值为N; full1:表示已读入字符个数,初值为0; full2:表示已处理字符个数,初值为0。 相应地设置in,out1,out2. Semaphore mutex=1; Semaphore empty=N; Semaphore full1=0; Semaphore full2=0; Char bhffer[N];
Int in=0,out1=out2=0; Main() {
cobegin R(); M(); P(); Coend } R() {
while(true) {
char x;
读入一个字符到x; p(empty);
7 / 13
p(mutex); buffer[in]=x; in=(in+1)%N; v(mutex); v(full1); } } M() {
char x; while(true) { p(full1); p(mutex);
x=buffer[out1]; if(x==” “) {
x=”,”;
buffer[out1]=x; }
out1=(out1+1) % N; v(mutex); v(full2); } } P() {
char x; while(true) {
p(full2) p(mutex); x=buffer[out2]
out2=(out2+1) % N; v(mutex); v(empty); 输出字符x; } }
9.一个数据采集系统,有数据采样进程和数据处理进程及数据输出进程。采样进程把采到的数据送到buf1中,由数据处理进程取出处理并存入buf2中,然后由数据输出进程将其从buf2中输出,试给出实现三个进程同步的算法。
empty1=empty2=1; full1=full2=0;
8 / 13
A() {
while(true) {
采集一个数据; p(empty1);
将数据存入buf1; v(full1); } } B() {
while(true) {
p(full1);
从buf1中取出数据; v(empty1); 处理数据; p(empty2);
将处理结果存入buf2; v(full2); } } C() {
while(true) {
p(full2);
从buf2中取出结果; v(empty2); 打印输出; } }
10.超市可容纳50人同时购物,入口处有篮子,每个顾客可拿一只篮子入内购物,出口处结账,并归还篮子(出入口禁止多人同时通过)
分析:(1)购物者进超市需要互斥,超市是临界资源(设信号量S=50)
(2) 入口拿篮子以及结账互斥。设mutex=1
购物者i进程: P(S); P(mutex); 从入口拿篮子 V(mutex); 选购商品; P(mutex);
9 / 13
出口结账 V(mutex); 离开超市 V(S);
以上为出入口合一的情况。若出入口分开,如何实现? 设两个互斥信号量:mutex1=1; mutex2=1
若设置一个信号量会怎样?(如果一个结账的话其他顾客无法进入超市)
11.桌上有一个只能盛得下一个水果的空盘子,爸爸放水果,儿子专吃桔子,女儿专吃苹果。 分析:
(1)设互斥信号量empty=1 (2)设同步信号量orange=0 (3) 设同步信号量apple=0 爸爸:(生产者) P(empty);
将水果放入盘中;
若放入的是桔子,则V(orange) 否则V(apple);
儿子(消费者1) P(orange); 取桔子 V(empty); 吃桔子
女儿(消费者2)类似于进程 12.和尚吃水问题
寺庙里住着一群老和尚和一群小和尚,小和尚负责挑水喝。庙里有5个水桶和一个大缸,大缸可盛8桶水。大缸每次只允许一个人使用。请写出他们之间的同步问题。 资源信号量:s1=5;表示水桶的数量 s2=8;表示缸空的数量(水桶) s3=0;表示缸满的数量(水桶)
互斥信号量:mutex=1;用于互斥的使用大缸 小和尚: P(s1); 取水桶; 挑水; P(s2); P(mutex); 往水缸倒水; V(mutex); V(s3); V(s1); 老和尚: P(s3); P(mutex); 吃水;
10 / 13