OS-练习题(5~9)

目录

课时五 死锁(一)

1.死锁的概念

2.死锁的预防

课时六 死锁(二)

1.死锁的避免

2.死锁的检测与解除 

课时七 进程同步(一)

1.同步与互斥的基本概念

2.进程同步机制

课时八 进程同步(二)

扫描二维码关注公众号,回复: 15260536 查看本文章

2.信号量的基本应用

3.管程

课时九 进程同步(三)

1.生产者消费者问题

2.读者写者问题

3.哲学家进餐问题


课时五 死锁(一)

1.死锁的概念

产生死锁必须同时满足以下四个条件,只要其中任一条件不成立,死锁就不会发生。
①互斥条件。只有对必须互斥使用的资源的争抢才会导致死锁(如哲学家的筷子、 打印机设备)。
②请求和保持条件。进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。
③循环等待条件。存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。
注意:发生死锁时一定有循环等待,但是发生循环等待时未必死锁。
④不剥夺条件。进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。

2.死锁的预防

题 1.系统产生死锁的可能原因是( )
A. 独占资源分配不当          B.系统资源不足
C.进程运行太快                 D.CPU内核太多
答案:A
解析:系统死锁的可能原因主要是时间上和空间上的。时间上由于进程运行中推进顺序不当,即调度时机不合适,不该切换进程时进行了切换,可能会造成死锁;空间上的原因是对独占资源分配不当,互斥资源部分分配又不可剥夺,极易造成死锁。那么,为什么系统资源不足不是造成死锁的原因?系统资源不足只会对进程造成“饥饿”。例如,某系统只有三台打印机,若进程运行中要申请四台,显然不能满足,该进程会永远等待下去。若该进程在创建时便声明需要四台打印机,则操作系统立即就会拒绝。这实际上是资源分配不当的一种表现。不能以系统资源不足来描述剩余资源不足的情形。
题 2.系统中有 4个进程都要使用某类资源。若每个进程最多需要 3个该类资源,则为了保证系统不发生死锁,系统至少应提供( )该类资源
A.3个         B.4个         C. 9个         D.12个
答案:C
解析:系统中有 4个进程,每个进程最多需要 3个资源,先给每个进程分配 2个资源,共需要 8个资源,此时需要系统中还有 1个空闲资源 (其可被分配给任一 进程),才不会发生死锁,故至少需要9个资源。

课时六 死锁(二)

1.死锁的避免

银行家算法

 

2.死锁的检测与解除 

题 1.死锁的避免是根据( )采取措施实现的
A.配置足够的系统资源
B.使进程的推进顺序合理
C.破坏死锁的四个必要条件之一
D. 防止系统进入不安全状态
答案:D
解析:死锁避免是指在资源动态分配过程中用某些算法加以限制,防止系统进入 不安全状态从而避免死锁的发生。选项 B是避免死锁后的结果,而不是措施的原理。
题 2.某系统中有三个并发进程都需要四个同类资源,则该系统必然不会发生死锁的最少资源是( )
A.9         B. 10          C.11         D.12
答案:B
解析:资源数为 9时,存在三个进程都占有三个资源,为死锁;资源数为10时,必然存在一个进程能拿到 个资源,然后可以顺利执行完其他进程。
题 3.某系统中共有11台磁带机,X个进程共享此磁带机设备,每个进程最多请求使用 3台,则系统必然不会死锁的最大X值是( )
A.4         B. 5          C.6         D.7
答案:B
解析:考虑一下极端情况:每个进程已经分配了两台磁带机,那么其中任何一个进程只要再分配一台磁带机即可满足它的最大需求,该进程总能运行下去直到结束,然后将磁带机归还给系统再次分配给其他进程使用。因此,系统中只要满足 2X+1=11 这个条件即可认为系统不会死锁,解得X=5 ,也就是说,系统中最多可以并发 5个这样的进程是不会死锁的。

课时七 进程同步(一)

1.同步与互斥的基本概念

题 1.下列对临界区的论述中,正确的是( )
A.临界区是指进程中用于实现进程互斥的那段代码
B.临界区是指进程中用于实现进程同步的那段代码
C.临界区是指进程中用于实现进程通信的那段代码
D. 临界区是指进程中用于访问临界资源的那段代码
答案:D
题 2.进程之间存在着哪几种制约关系?它们各由什么原因引起?下列活动分别
属于哪种制约关系?
1)若干位同学去图书馆借书;
2)两队举行篮球比赛;
3)流水线生产的各道工序;
4)商品生产和社会消费。
解析:进程之间存在着直接相互制约和间接相互制约这两种制约关系,其中直接相互制约(同步)是由进程间的相互合作弓起的;而间接相互制约(互斥)则是由进程间共享临界资源引起的。
1)若干位同学去图书馆借书是 间接相互制约 ,其中 书是临界资源
2)两队举行篮球比赛是 间接相互制约 其中 篮球是临界资源
3)流水线生产的各道工序是 直接相互制约 ,各道工序间须相互合作,每道工序
的开始都依赖于前一道工序的完成。
4)商品生产和社会消费是 直接相互制约 的,两者须相互合作。商品生产出来后
才可以被消费,商品被消费后才须再生产。

2.进程同步机制

题 2.进程P0和P1的共享变量定义及其初值为:boolean flag[2];int turn=0; flag[0]=FALSE; flag[1]=FALSE; 若进程P0和P1访问临界资源的类C代码实现 如下:
void P0()
{
    while(TRUE){
    flag[0]= TRUE;
    turn=1;
    while(flag[1]&&(turn==1));
    临界区;
    flag[0]= FALSE;
    }
}
void P1()
{
    while(TRUE){
    flag[1]= TRUE;
    turn=0;
    while(flag[0]&&(turn==0));
    临界区;
    flag[1]= FALSE;
    }
}
则并发执行进程P0和P1时发生的情况是( )
A.不能保证进程互斥地进入临界区,会出现“饥饿”现象
B.不能保证进程互斥地进入临界区,不会出现“饥饿”现象
C.能保证进程互斥地进入临界区,会出现“饥饿”现象
D. 能保证进程互斥地进入临界区,不会出现“饥饿”现象
答案:D
解析:算法实现互斥的主要思想在于设置一个turn变量,用于进程间的互相谦让。如果进程P0试图访问临界资源,flag[0]= TRUE,则表示希望访问。此时如果进程P1还未试图访问临界资源,则 flag[1]在进程上一次访问完临界资源并退出临界区后已设置为 FALSE。因此进程P0在执行循环判断条件时,第一个条件不满足,进程P0可以正常进入临界区,且满足互斥条件。请注意两个进程同时试图 访问临界资源的情况。
turn变量的含义:进程在试图访问临界资源时,首先设置turn自己的 flag 变量为 TRUE,表示希望访问;但又会设置turn变量为对方的进程编号,表示谦让,若在turn变量不是进程编号时就循环等待,则两个进程就会互相谦让,由于turn变量会有一个最终值,因此先做出谦让的进程先进入临界区,后做出谦让的进程则需要循环等待,不会造成“饥饿”现象。

课时八 进程同步(二)

2.信号量的基本应用

题 1.设与某资源关联的信号量初值为 3,当前值为 1。若M表示该资源的可用个数,N示等待该资源的进程数,则M,N分别是( )
A.0,1        B. 1,0        C.1,2        D.2,0
答案:B
解析:信号量表示相关资源的当前可用数量。当信号量K>0时,表示还有K个 相关资源可用,所以该资源的可用个数是 1。而当信号量K<0时,表示有 |K| 个进程在等待该资源。由于资源有剩余,可见没有其他进程等待使用该资源,因此进程数为 0。
题 2.对于两个并发进程,设互斥信号量为mutex(初值为 1),若mutex = -1,则 ( )
A.表示没有进程进入临界区
B.表示有一个进程进入临界区
C. 表示有一个进程进入临界区,另一个进程等待进入
D.表示有两个进程进入临界区
答案:C
解析:当有一个进程进入临界区且有另一个进程等待进入临界区时,mutex = -1。 mutex小于0 时,其绝对值等于等待进入临界区的进程数。
题 3.下面是两个并发执行的进程,它们能正确运行吗?若不能请举例说明并改正。
int x;
process P1{
    int y,z;
    x=1;
    y=0;
    if(x>=1)
    y=y+1;
    z=y;
}
process P2{
    int t,u;
    x=0;
    t=0;
    if(x<=1)
    t=t+2;
    u=t;
}
解析:P1和P2两个并发进程的执行结果是不确定的,它们都是对同一变量x 进程操作,x 是一个临界资源,而没有进行保护。例如:

 显然,两次执行结果不同,所以这两个并发进程不能正确运行。可将这个程序改为:

int x;
semaphore S=1;
process P1{
    int y,z;
    P(S);
    x=1;
    y=0;
    if(x>=1)
    y=y+1;
    V(S);
    z=y;
}
process P2{
    int t,u;
    P(S);
    x=0;
    t=0;
    if(x<=1)
    t=t+2;
    V(S);
    u=t;
}

3.管程

题 1.下述( )选项不是管程的组成部分。
A.局限于管程的共享数据结构
B.对管程内数据结构进行操作的一组过程
C. 管程外过程调用管程内数据结构的说明
D.对局限于管程的数据结构设置初始值的语句
答案:C
解析:管程由局限于管程的共享变量说明、对管程内的数据结构进行操作的一组过程及对局限于管程的数据设置初始值的语句组成。

课时九 进程同步(三)

1.生产者消费者问题

题 1.某工厂有两个生产车间和一个装配车间,两个生产车间分别生产A,B两种零件,装配车间任务是把A,B两种零件组装成产品,两个生产车间每生产一个零件后,都要分别把它们送到专配车间的货架F1,F2上。F1 存放零件 A,F2存放零件 B,F1和F2的容量均可存放 10个零件。装配工人每次从货架上取一个零件 A和一个零件 B后组装成产品。请用P,V操作进行正确管理。
解析:本题是生产者-消费者问题的变体,生产者“车间 A”和消费者“装配车间”共享缓冲区“货架F1”;生产者“车间 B”和消费者“装配车间”共享缓冲区“货架F2”。因此,可为它们设置 6个信号量:empty1 对应货架F1上的空闲空间,初值为10;full1  对应货架F1上面的 A产品,初值为 0;empty2 对应货架F2上的空闲空间,初值为10;full2 对应货架F2上面的 B产品,初值为 0;mutex1 用于互斥地访问货架F1,初值为 1;mutex2 用于互斥地访问货架F2,初值为 1。
A 车间的工作过程可描述为:
while(1){
    生产一个产品 A; 
    P(empty1); //判断货架 F1 是否有空
    P(mutex1); //互斥访问货架 F1
    将产品 A 存放到货架 F1 上;
    V(mutex1); //释放货架 
    F1 V(full1); //货架 F1 上的零件 A 的个数加 1 
}

B车间的工作过程可描述为:

while(1){
    生产一个产品 B;
    P(empty2); //判断货架 F2 是否有空
    P(mutex2); //互斥访问货架 F2
    将产品 B 存放到货架 F2 上;
    V(mutex2); //释放货架 F2 
    V(full2); //货架 F2 上的零件 B 的个数加 1 
}
装配车间的工作过程可描述为:
while(1){
    P(full1); //判断货架 F1 是否有产品 A
    P(mutex1); //互斥访问货架 F1
    从货架 F1 上取一个 A 产品;
    V(mutex1); //释放货架 F1 V(empty1); //货架 F1 上的空闲空间数加 1
    P(full2); //判断货架 F2 是否有产品 B
    P(mutex2); //互斥访问货架 F2
    从货架 F2 上取一个 B 产品;
    V(mutex2); //释放货架 F2 
    V(empty2); //货架 F2 上的空闲空间数加 1
    将取得的 A 产品和 B 产品组装成成品;
}

2.读者写者问题

题 2.有桥如下图所示,车流如箭头所示,桥上不允许两车交汇,但允许同方向多辆车依次通过(即桥上可以有多个同方向的车)。用P、V操作实现交通管理以防止桥上堵塞。
解析:这个题目要解决:南、北互斥(桥上不允许两车交汇,相当于“读、写互斥”),需要设置一个互斥信号量mutex,初值为 1;南、南共享(相当于“读、读共享”),套用实现“读、读共享”的模式,需要设置一个共享变量southcount,用于记录当前桥上向南行驶过桥的车辆数目,初值为 0,再设置一个互斥信号量smutex,实现对southcount的互斥访问;北、北共享(也相当于“读、读共享”),套用实现“读、读共享”的模式,同理可得。
semaphore mutex = 1;// 作为桥的互斥访问信号量
semaphore smutex = 1;// 作为 southcount 的互斥访问信号量
semaphore nmutex = 1;// 作为 northcount 的互斥访问信号量
int southcount = 0;// 记录南方向的车辆的数量
int northcount = 0;// 记录北方向的车辆的数量
void south(){
    while(true){
    wait(smutex);
    if(southcount == 0)
    wait(mutex);
    southcount++;
    signal(smutex);
// 南方车辆通过
    wait(smutex);
    southcount--;
    if(southcount == 0)
    signal(mutex);
    signal(smutex);
    }
}
void north()
{
    while(true){
    wait(nmutex);
    if(northcount == 0)
    wait(mutex);
    northcount++;
    signal(nmutex);
// 北方车辆通过
    wait(nmutex);
    northcount--;
    if(northcount == 0)
    signal(mutex);
    signal(nmutex);
    }
}

3.哲学家进餐问题

题 1.有n(n>=3)名哲学家围坐在一张圆桌边,每名哲学家交替地就餐和思考。在圆桌中心有m(m>=1)个碗,每两名哲学家之间有一根筷子。每名哲学家必须取到一个碗和两侧地筷子后,才能就餐,进餐完毕,将碗和筷子放回原位,并继续思考。为使尽可能多的哲学家同时就餐,且防止出现死锁现象,请使用信号量的P,V操作[wait(),signal() 操作]描述上述过程中的互斥与同步,并说明所用信号量及初值的含义。
解析:回顾传统的哲学家问题,假设餐桌上有 名哲学家、 根筷子,那么可以用这种方法避免死锁:限制至多允许 n-1 名哲学家同时“抢”筷子,那么至少会有 1 名哲学家可以获得两根筷子并顺利进餐,于是不可能发生死锁情况。
本题可以用碗这个限制资源来避免死锁;当 碗的数量 m小于哲学家的数量 n 时,可以直接让碗的资源量等于 m ,确保不会出现所有哲学家都拿一侧筷子而无限等待另一侧筷子进而造成死锁的情况;当 碗的数量 m大于等于哲学家的数量 n 时,为了让碗起到同样的限制效果,我们让碗的资源量等于 n-1 ,这样就能保证最多只有 n-1 名哲学家同时进餐,所以得到 碗的资源量为min{n-1,m} 。在进行PV操作时,碗的资源量起限制哲学家取筷子的作用,所以需要先对碗的资源量进行 P操作。具体过程如下:
semaphore bow1;
semaphore chopstick[n];
    for(int i=0;i<n;i++)
    chopstick[i]=1;
bow1=min(n-1,m);
cobegin
while(TRUE){
    思考; 
    P(bow1);
    P(chopstick[i]);
    P(chopstick[(1+i)%n]);
    就餐;
    V(chopstick[i]);
    V(chopstick[(1+i)%n]);
    V(bow1);
}coend

注:文章仅用于个人期末复习,资料来源蜂考,侵删。

猜你喜欢

转载自blog.csdn.net/K_savo/article/details/128132831
今日推荐