1)为什么要引入进程同步的概念?
在多道程序共同执行的条件下,进程与进程是并发执行的,不同进程之间存在不同的相互制约关系。为了协调进程之间的相互制约关系,引入了进程同步的概念。
2)不同的进程之间会存在什么关系?
进程之间存在同步与互斥的制约关系。
同步是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而等待、传递信息所产生的制约关系。
互斥是指当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另一进程才允许去访问此临界资源。
3)解决这些问题时会遇到什么新的问题吗?
当两个或两个以上的进程在执行过程中,因占有一些资源而又需要对方的资源时,会因为争夺资源而造成一种互相等待的现象,若无外力作用,它们都将无法推进下去。这种现象称为死锁
看完概念的东西,举个实际例子感受一下
假定一个阅览室最多可容纳100人,读者进入和离开阅览室时都必须在阅览室门口的一个登记表上进行登记(进入时登记,离开时去掉登记项),而且每次只允许一人登记或去掉登记,请分析这里的同步问题,并用P,V操作写出同步进程的描述。
实现很简单,设置同步信号量记录阅览室容量和互斥信号量记录登记区域即可
semaphore empty = 100;
semaphore mutex = 1;
reader(){
while(1){
P(empty);
P(mutex);
进入登记;
V(mutex);
阅读
P(mutex);
离开登记;
V(mutex);
V(empty);
}
}
那么如果想实现让权等待呢?即图书馆人满时读者不会一直在门口傻等
这时候我们需要设置一个整型变量n记录图书馆的人数,额外设置一个n?不是有信号量记录人数吗?没错,信号量可以记录图书馆人数,但是访问信号量只能通过原子操作,而不能直接取。
具体实现如下:
semaphore empty = 100;
semaphore mutex = 1;//登记区域互斥量
semaphore nmutex = 1;
int n = 0;
reader(){
while(1){
P(nmutex);
if(n<100){
n++;
V(nmutex);
P(mutex);
登记进入;
V(mutex);
阅读;
P(mutex);
登记离开;
V(mutex);
P(nmutex);
n--;
V(nmutex);
}else{
V(nmutex);
离开;
}
}
}