进程互斥与同步

进程互斥与同步
强烈推介IDEA2021.1.3破解激活,IntelliJ IDEA 注册码,2021.1.3IDEA 激活码  

大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说进程互斥与同步,希望能够帮助大家进步!!!

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

答:并发指的是一个处理器在同一时间段内执行多个进程,但注意不是同一时刻同时执行,只是以极快的速度进行进程的切换执行,从而形成并行的效果。

并行指的是多个处理器同时处理多个进程,即同一时刻同时执行多个进程。并发和并行在处理速度上基本相当,但在本质上有所区别。

例如吃饭的时候电话响了,并发指的是先停止吃饭,然后迅速去接听电话,两者是交替进行的;而并行则是在边吃饭的同时边接听电话,两者是同时进行的。

 

解释一:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。

解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件

解释三:并行在多台处理器上同时处理多个任务,并发的是在一台处理器上“同时”处理多个任务。

 

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

答:进程间存在竞争与和协作两种基本关系。

当出现竞争关系时会引发两个控制问题:死锁与饥饿。解决方法:向并发进程提供锁机制,在使用共享资源之前表达互斥要求,系统需要保证诸进程能互斥访问共享资源,既要解决死锁问题,又要解决饥饿问题。

当出现协作关系时,解决方法为:在未输入完一块数据之前不能加工处理,未加工处理完一块数据之前不能打印输出,每个进程都要接收到协作进程完成一次数据处理的消息之后,才能进行下一步工作。如双方不知道对方名字的间接协作,可以通过访问共享资源进行松散式协作;如知道对方名字,可以通过通信机制进行的紧密协作。

 

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

答:进程的互斥指的是在一个进程执行时,要求另一个进程需要进行等待,即需要两个进程相互协调合作,这在一定程度上也是一种同步。

 

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

答:死锁:即一组进程因为争夺资源而陷入永远等待的状态。

“饥饿”:即一个可运行的进程由于其他进程总是优先于它,而被调度程序无限期地拖延而导致不能被执行。

两者的关系:死锁和饥饿都最终都是导致进程因为进程之间的竞争而无法执行,但前者是由于竞争双方的资源争夺而导致双方都无法继续进行,后者则是个别进程因为优先级过低,而一直处于等待状态无法进行。

 

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

答:并发进程中与共享变量有关的程序段称为临界区;共享变量所代表的资源称为临界资源。

遵循临界区调度的三个原则:

(1)一次至多只有一个进程进入临界区内执行。

(2)如果已有进程在临界区中,试图进入临界区的其他进程应等待。

(3)进入临界区内的进程应在有限时间内退出,以便让等待队列中的一个进程进入。

即总结为:互斥使用,有空让进;忙则要等,有限等待;择一而入,算法可行。

 

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

 信号量表示物理资源的实体,是一个与队列有关的整型变量。主要用于封锁临界区、进程同步即维护资源计数。

 

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

semaphore fork[5];
for(int i=0;i<5;i++){
    fork[i]=1;      
}
begin{
    process philosophers_i(){ //i=1,2,3,4,5
        while(true){
            think();
            hungry();
            P(fork[i]);
            p(fork[(i+1)%5]);
            eat();
            V(fork[i]);
            V(fork[(i+1)%5]);
        }
    }
}end

 

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

semaphore cashier;
cashier  = 1;  //收银员作为信号量被占用,且只有一个
int length = n;
int []P = new int[length];  //完成购买用户队列,用户排队,且最大值为n
int []V = {};  //完成结账用户队列,初值为空
begin
do{
  for(int i =0; i<length; i++ ){  //用户排队
    P.remove(i);  //用户占用收银员
    payment();  //用户结账
    V.add(i);  //用户解除占用收银员
    length --;  //待结账用户减一
  }
}while(length == 0)  //用户结账完毕,交易结束
end

 

 

转载于:https://www.cnblogs.com/heshaojian/p/10757881.html

本文来源weixin_30595035,由架构君转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/29870

发表评论