1. 临界资源是指一段时间内只允许一个进程访问的资源。许多物理设备(如打印机和磁带机)、变量及表格都属于临界资源,它们要求互斥地被共享。而每个进程中访问临界资源的那段代码称为临界区。
2. 保证诸进程互斥地进入自己的临界区是实现它们对临界资源的互斥访问的充要条件。为此,每个进程在进入临界区之前应先对预访问的临界资源进行检查,看其是否正在被访问。如果此刻临界资源未被访问,则该进程可以进入临界区和访问对应临界资源,同时应设置临界资源正被访问的标志为真值;如果此刻临界资源正被某进程访问,则本进程不能进入临界区。因此,必须在临界区前面增加一段用于进行上述检查的代码即进入区。相应地,在临界区之后也要加上一段称为退出区的代码,用于将临界资源正被访问的标志置为假值。换句话说,进程在进入临界区之前,应先执行“进入区”代码,在退出临界区之后则需执行“退出区”代码。
3. 同步机构应遵循下述四条基本准则:1空闲让进。当无进程处于临界区时,相应的临界资源处于空闲状态,因而可允许一个请求进入临界区的进程立即进入自己的临界区,以有效的利用临界资源。2忙则等待。当已有进程进入自己的临界区时,意味着相应的临界资源正被访问,因而所有其它企图进入临界区的进程必须等待,以保证诸进程互斥地访问临界资源。
3有限等待。对要求访问临界资源的进程,应保证该进程能在有限时间内进入自己的临界区,以避免陷入“死等”状态。4让权等待。当进程不能进入自己的临界区时,应立即释放处理机,以避免进程陷入“忙等”和浪费处理机资源。
4. 记录型信号量拥有两个分量:(1整型变量value。其初始值表示系统中对应某类资源的数目。系统运行过程中,若value不小于0,则其表示当前运行状态下系统中可用的对应某类资源的数量;若value小于0,则其绝对值表示对应信号量及资源的阻塞进程队列长度即受阻进程数量。(2)进程链表L用于链接等待对应信号量及资源的所有阻塞进程。因此,记录型信号量的wait操作不仅要实现资源申请功能,当系统中无对应资源可用时,并阻塞当前进程、插入到对应阻塞进程链表中和释放处理机;而记录型信号量的signal操作除实现资源释放功能外,在对应阻塞进程链表不为空的情况下,并将该阻塞进程队列对首进程唤醒。
5. 整型信号量机制并未遵循同步机构的让权等待的准则,记录型信号量机制则较好地遵循了同步机构的让权等待的准则。同时,对于需要首先获得两个以上共享资源方能执行任务的进程,如进入区代码关于信号量的wait操作次序不当,二者均有可能违背忙则等待、空闲让进和有限等待的准则。
6. 在生产者消费者问题中,如果缺少了signal(full)signal(empty),则会造成死锁。具体而言:(1)如果缺少了signal(full),则一方面由于empty信号量初始值大于0使得生产者进程可以不断地向环形缓冲中填入消息,另一方面由于full信号量初始值为0而使得消费者进程在一开始执行wait(full)操作时便被阻塞且始终未被唤醒,所以其始终无法从缓冲区中取得消息,也无法执行到signal(empty)操作。一旦环形缓冲被生产者进程的消息填满,则empty信号量值也不再大于0,于是生产者进程执行wait(empty)操作时将被阻塞,从而两个进程都将无法继续执行下去,进而陷入死锁。(2)如果缺少了signal(empty),则一开始由于empty初始值大于0使得生产者进程可以不断地向环形缓冲中填入消息,而消费者进程由于full信号量初始值为0所以在执行wait(full)操作时便被阻塞。伴随生产者进程signal(full)操作的执行,消费者进程将会被唤醒,并从缓冲区中取得消息;但必须指出,由于其缺少了signal(empty),所以empty信号量值将是一个单向递减的过程。一旦empty信号量值变得不再大于0,则生产者进程执行wait(empty)操作时将被阻塞、停止向环形缓冲中填入消息和无法执行到signal(full)操作,于是当消费者进程把n个缓冲区的消息取完之后,full信号量也将无法再次变得大于0,消费者进程在执行wait(full)操作时也将被阻塞。从而两个进程都将无法继续执行下去,进而陷入死锁。
在生产者消费者问题中,如果将两个wait操作即wait(full)wait(mutex)互换位置,将可能造成死锁。具体而言,由于生产者进程和消费者进程是并发执行的,所以一开始可能消费者进程首先执行wait(mutex)操作之后生产者进程再执行wait(mutex)操作,而后者执行wait(mutex)操作时必然受阻,于是消费者进程由于full信号量初始值为0所以在执行wait(full)操作时也将被阻塞,从而两个进程都将无法继续执行下去,进而陷入死锁。但如果是将signal(mutex)signal(full)互换位置,则由于二者的执行不存在相互依赖关系,所以不会造成任何负面影响。
7. 关锁原语Lock(W)
while W=1 do no_op;
W:=1;
开锁原语Unlock(W)
W:=0;
互斥实现:
repeat
……
  Lock(W);
  临界区
  Unlock(W);
……
until false
9Var mutex: semphore:=1;
empty, full: semphore:=n, 0;
buffer: -1] of item;
in, out: integer:=0, 0;
  begin
parbegin
  producer;
  consumer;
parend;
  end
producer:
begin
  repeat
    ……
    produce an item in nextp;
    wait(empty);
    wait(mutex);
    buffer[in]=nextp;
    in:=(in+1) mod n;
    signal(mutex);
    signal(full);
  until false;
end
consumer:
begin
  repeat
    wait(full);
    wait(mutex);
    nextc:=buffer[out];
    out:=(out+1) mod n;
    signal(mutex);
    signal(empty);
    consume the item in nextc;
  until false;
end

10.哲学家进餐问题解决方案3
Var chopstick0: semphore:=1;
  chopstick1: semphore:=1;
  chopstick2: semphore:=1;
  chopstick3: semphore:=1;
  chopstick4: semphore:=1;
begin
  parbegin
    philosophy0;
    philosophy1;
    philosophy2;
    philosophy3;
    philosophy4;
  parend
end
philosophy0:
begin
  repeat
    Think;
    wait(chopstick1, chopstick0);
    Eat;
    signal(chopstick0, chopstick1);
  until false;
end
philosophy1:
begin
  repeat
    Think;
    wait(chopstick1, chopstick2);
    Eat;
    signal(chopstick2, chopstick1);
  until false;
end
philosophy2:
begin
  repeat
    Think;
    wait(chopstick3, chopstick2);
    Eat;
    signal(chopstick2, chopstick3);
  until false;
end
philosophy3:
begin
  repeat
    Think;
    wait(chopstick3, chopstick4);
    Eat;
    signal(chopstick4, chopstick3);
  until false;
end
philosophy4:
begin
  repeat
    Think;
    wait(chopstick0, chopstick4);
    Eat;
    signal(chopstick4, chopstick0);
  until false;
end

11.基于信号量机制的数据采集任务和计算任务共享单缓冲的同步算法:

Var empty, full: semphore := 1, 0;
  buffer, nextp, nextc: item;
begin
  parbegin
data_collection:
begin
  repeat
    collect an item in nextp;
    wait(empty);
    buffer := nextp;
    signal(full);
  until false;
end;
computation:
begin
  repeat
    wait(full);
    nextc := buffer;
    compute by the item in nextc;
    signal(empty);
  until false;
end;
  parend

12.管程由局部于管程的共享变量说明、对该数据结构进行操作的一组过程以及对局部于管程的数据设置初始值的语句等三部分组成(参课本80页图3-2所示)。此外,还需为管程赋
予一个管程名。之所以要引入条件变量,是为了区别进程等待的原因。
13.基于管程的生产者消费者问题解决方案:
进程通信方式
TYPE producer-consumer = monitor;
  Var in, out, count : integer;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。