代码改变世界

进程互斥与同步

2019-04-23 16:13  林扬程1  阅读(288)  评论(0编辑  收藏  举报

1、解释并发与并行,并说明两者关系。

并发是一种机制,即指“同时有多个请求被发起,或另一种意义上说支持同时有多个线程存在”;支持并发即是要能够包容同时来到的多个请求,或说包容同时存在的多个线程

并行是一种处理方式(或可以说是一种架构方式),即指“有多个计算核心,可以在同一时间同时处理多个任务 / 把一个任务分割成小块,在同一时间同时处理多个部分”

关系:并行是并发的特例,并发是并行的扩展。

2、进程间有哪几种关系?分别要采取什么策略?

进程之间存在直接制约关系(进程间的同步)和间接制约关系(进程间的互斥)。直接制约关系是指两个或多个进程为了合作完成同一个任务,间接制约关系是指两个或多个进程为了竞争临界资源。如分时系统中有两个用户进程分别编译他们的PASCAL源程序,在单CPU系统中这两个进程只能分时占用处理机编译各自的源程序,它们间存在着间接制约关系。直接制约关系是多个协作进程之间存在的逻辑上·制约关系,即一个进程的执行依赖于另一个进程的消息,当一个进程没有得到另一个进程的消息时应等待,直到消息到达被唤醒为止。如共享一缓冲器的读进程和打印进程,它们间存在着直接制约关系,因为两个进程必须同步才能完成共同的任务。

3、为什么说进程的互斥也是一种同步?

进程的互斥是指进程在推进时的相互制约关系,由于进程间存在制约关系,为了保证进程的正确运行以及相互合作进程间的信息交换,就需要进程之间进行通信,进程之间的互斥与同步也是一种通信。

4、解释死锁与“饥饿”,并说明两者关系

如果在一个进程集合中的每个进程都在等待只能由该集合中的其他进程才能引发的事件,而无限期僵持的局面称死锁。一个可运行进程由于其他进程总是优先于它,而被无限期拖延而不能被执行的现象称饥饿。死锁进程必然处于饥饿状态,但处于饥饿状态的进程未必陷入死锁。

5、什么叫做临界区?如何解决进程对临界资源的访问冲突?

把一次只允许一个进程使用的资源称为临界资源。把每个进程中访问临界资源的那段代码从概念上分离出来,将其称为临界区。

(1)如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入;   

(2)任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待;

 (3)进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区; 

 (4)如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象。 

 6、信号量的物理意义是什么?

信号量的物理含义是,当信号量值大于零时,它表示可用资源的数量;当信号量值小于零时,它的绝对值是请求资源阻止的进程数。

7、理解五个哲学家吃面问题,并能盲写出伪代码。

 

semaphore fork[5];
for (i=0;i<5;i++){
  fork[i]=1;         
}
cobegin
    process philosopher_i(){
      while(true){
         think();
         P(fork[i]);
         P(fork[(i+1)%5]);
             eat();
         V(fork[i]);
         V(fork[(i+1)%5]);
        } 
     
     
    }
coend

8、一个超市有n个顾客购物,只有一个收银员,试用信号量P、V操作描述顾客进程和收银员之间的关系。写伪代码。

int Cashier=1;
int waiting=0;
int customers=n;
cobegin
       process Cashier(void){
               while(true){
                   P(customers);
                   wait--;
                   V(Cashier);
                   collect();
               }
       } 
       process customers(){
                while(true){
                        if(waiting>0)
                             wait++;
                         else
                              V(Cashier);     
                }
       }
coend