操作系统pv操作题

同步:协作的过程,比如,多人开发合作。

相互排斥:争抢资源的过程。比如苦逼的大学选课;

临界区:进程中对临界资源实施操作的那段程序;

临界资源:一次仅仅能一个进程使用的资源,比如打印机;

信号量:表示资源数量;相对于各个进程来说的;

P操作wait()(-1):申请资源;

V操作signal()(+1):释放资源;

P(S):①将信号量S的值减1,即S=S-1;
②如果S<=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
V(S):①将信号量S的值加1,即S=S+1;
②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。

一组生产者,一组消费者,公用n个环形缓冲区
empty——表示缓冲区是否为空,初值为n。
full——表示缓冲区中是否为满,初值为0。
mutex1——生产者之间的互斥信号量,初值为1。
mutex2——消费者之间的互斥信号量,初值为1。
 

例题1生产者和消费者问题

该问题描述了一组生产者和一组消费者,他们共享一个有界缓冲池,生产者向池中投入产品,消费者从池中取得产品

假定缓冲池中有n个缓冲区,每个缓冲区只能放一个类型为item的产品,而所有的生产者和消费者是互相等效的,测该问题需要设置三个信号量:

  1. 互斥信号量mutex,用于实现对缓冲池的互斥访问,初值为1;
  2. 资源信号量empty,用于表示空闲缓冲区的数量,初值为n;
  3. 资源信号量full,用于表示满缓冲区的数量,即缓冲池中可供消费的产品数量,初值为0;

empty和full用来同步生产者和消费者进程,即当缓冲池全空时,消费者进程必须等待;缓冲池全满时,生产者进程必须等待,具体算法描述如下。

int in=0,out=0;
item buffer[n];
semaphore mutex=1,empty=n,full-=0;

void proceducer(){
    do{
        proceduce an item nextp;
        ·······
        wait(empty);
        wait(mutex);
        buffer[in]=nextp;
        in=(in+1)%n;
        signal(mutex);
        signal(full);
    }while(TRUE);
}
void consume(){
    do{
        wait(full);
        wait(mutex);
        nextc=buffer[out];
        out =(out+1)%n;
        signal(mutex);
        signal(empty);
        consume the item in nextc;
        ······
    }while(TRUE);
}
void main(){
    cobegin
        proceducer();//若干个生产者和消费者
    coend
}

例题2 哲学家进餐问题

例题3 家庭水果问题

例题4 读者-写者问题

例题5顾客和理发师问题

你可能感兴趣的:(操作系统,同步)