天天看点

进程的同步与互斥_legend



进程同步与互斥:

(一)临界资源:

(1)定义:

一次只允许一个进程访问的资源为临界资源。

临界区:访问临界资源的那段区域为临界区。

(2)临界资源的访问:

将临界资源的访问分为四个部分:

进入区-》临界区-》退出区-》剩余区。

(二)进程同步:

两个进程之间相互协作,事件之间有先后顺序关系。

(三)进程互斥:

两个或多个进程对临界资源的使用,只能是一个使用,一个等待。

(四)信号量(Semaphore):

(1)信号量的定义:

方法一:整形信号量

int s;表示资源个数。

方法二:结构体信号量:

typedef struct Semaphore {

 int value;//系统中某类可用资源的个数

 Queue waitQueue;//等待队列

}

当value>0,表示系统中可用资源的个数;

当value<0,表示请求该类资源而处于阻塞状态的进程个数为|value|,即waitQueue的实际大小。

(2)P操作:申请资源/接受信号

1. s.value--;

2. 若s.value>=0,则继续执行,否则(s.value<0)阻塞该进程,并将该进程插入到该信号量的等待队列中。

(3)V操作:释放资源/发送信号

1. s.value++;

2. 若s.value>0,则进程继续执行,否则(s.value<=0),从该信号量的等待队列中移除第一个进程,使之变成就绪进程并插入到就绪队列中,然后返回到原来的进程继续执行。

(3)同步,互斥事件的P,V操作:

1.同步事件:即先执行事件1,然后执行事件2;

则:事件1-》V-》P-》事件2

2.P,V保护临界资源;

即:P->临界资源->V

(五)经典进程同步互斥问题:

(1)生产者消费者问题:

http://blog.csdn.net/legend050709/article/details/39031833

(2)读者写者问题:

http://blog.csdn.net/legend050709/article/details/39032873

(3)理发师睡眠问题:

http://blog.csdn.net/legend050709/article/details/39033517

(4)哲学家进餐问题:

http://blog.csdn.net/legend050709/article/details/39034021

继续阅读