进程同步与互斥:
(一)临界资源:
(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