- 解释并发与并行,并说明两者关系。
并发就是同时支持两个或多个动作同时存在,而并行就是同时支持两个或者多个动作同时执行。在并发程序中可以同时拥有两个或者多个线程。这意味着,如果程序在单核处理器上运行,那么这两个线程将交替地换入或者换出内存。这些线程是同时“存在”的——每个线程都处于执行过程中的某个状态。如果程序能够并行执行,那么就一定是运行在多核处理器上。此时,程序中的每个线程都将分配到一个独立的处理器核上,因此可以同时运行。总之并行的概念是并发的子集。
2. 进程间有哪几种关系?分别要采取什么策略?
进程间的关系有两种,一是竞争关系,二是协作关系。
竞争关系会产生饥饿问题和死锁问题,解决死锁问题采用打印机分配策略,这个策略虽然没有出现死锁问题,但却出现了饥饿问题。解决饥饿问题的策略是FCFS资源分配策略,进程的协作关系,当其实一个进程到达关键点后,再尚未得到其伙伴进程发来的消息或信号之前应阻塞自己,等待协作者发来信号或消息后方别唤醒并继续执行。
3. 为什么说进程的互斥也是一种同步?
进程互斥是指若干进程因相互争夺独占型资源而产生的竞争制约关系,而进程同步是指为完成共同任务的并发进程基于某个条件来协调其活动,因为需要在某些位置上排定执行的先后次序而等待,传递信号或消息所产生的协作制约关系。所以,进程互斥关系也是一种特殊的进程同步关系,即逐次使用互斥共享资源,也是对进程使用资源的次序的一种协调。
4. 解释死锁与“饥饿”,并说明两者关系。
死锁指的是两个或两个以上的进程相互竞争系统资源,导致进程永久阻塞。
饥饿指的是等待时间已经影响到进程的运行,此时成为饥饿现象,如果等待时间太长,导致进程使命已经没有意义时,称为饿死。死锁是两个进程同时请求资源但是都分配不到资源,导致永久阻塞状态,饥饿是指一个进程因优先级不够高,等待其他进程时间太长。
5. 什么叫做临界区?如何解决进程对临界资源的访问冲突?
并发进程中与共享变量有关的程序段称为临界区,要解决临界区的访问资源冲突,共享的资源并发进程应遵守临界调度的三个原则,一是一次至多只有一个进程进入临界区内执行,二是如果已有进程在临界区中,试图进入此临界区的其他进程应等待,三是进入临界区没的进程应在有限的时间内退出以便让等待队列中的一个进程进入。
6. 信号量的物理意义是什么?
信号量是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。信号量分为单值和多值两种,前者只能被一个线程获得,后者可以被若干个线程获得。利用信号量和PV操作即可解决并发进程竞争问题,又可解决并发进程协作问题。
7. 理解五个哲学家吃面的问题,并能盲写其代码。
semaphore fork[5];
for(int i=0; i<5;i++)
fork[i]=1;
cobegin
process philosopher_i( ){
while(ture){
think( );
P(fork[i]);
P(fork[(i+10%5]);
eat();
V(fork[i]);
V(fork[(i+10%5]);
8. 一个超市有n个顾客购物,只有一个收银员,试用信号量P、V操作描述顾客进程和收银员之间的关系。写伪代码。