进程同步是对多个相关进程在执行次序上进行协调,使并发执行的多个进程之间按照一定的规则共享系统资源。
1、生产者消费者问题:
生产者、消费者问题生产者生产产品放入缓冲区中,消费者从缓冲区中取出产品去消费。不允许消费者从空缓冲区中取产品,也不允许生产者向已经满了的缓冲区添加产品。
2、过程描述:
生产者:
void producer(){ while(1) { while(counter==n);//缓冲池已满,不再执行后面的操作 buffer[in]=nextp;//将生产出来的产品放入缓冲池 in=(in+1)%n;//指针后移 counter++; } }
消费者:
void consumer(){ while(1) { while(counter==0);//缓冲池为空,不再执行后面的操作 nextc=buffer[out];//取出一件产品 out=(out+1)%n;//指针后移 counter--; } }
如果不对生产者和消费者进程加以控制会出现不同的结果 (有正确的有错误的),即进程的不可再现性,这是由于进程失去了封闭性引起的。
3、进程同步(信号量机制):
(1)使用wati()和signal()操作来实现对临界资源的访问。
semaphone mutex=1; Pa(){ while(1){ wait(mutex);//进入区 临界区;//访问临界资源的代码 signal(mutex);//退出区 剩余区; //其他部分 } }
(2)信号量机制解决进程同步问题:
生产者:
int n=0,out=0; item buffer[n]; semaphore mutex=1,empty=n,full=0;//缓冲池一个,空缓冲区n个,满缓冲区0个 void producer)(){ while(1){ wait(empty);//先对缓冲区执行p操作,如果empty执行之前为0,则阻塞,不必在执行后面的 wait(mutex);//减缓冲池 buffer[in]=nextp;//将生产出来的产品放入缓冲池 in=(in+1)%n;//指针后移 signal(mutex);//释放资源,v操作 signal(full); } }
消费者:
int n=0,out=0; item buffer[n]; semaphore mutex=1,empty=n,full=0;//缓冲池一个,空缓冲区n个,满缓冲区0个 void consumer(){ while(1){ wait(full);//先对缓冲区执行p操作,如果full执行之前为0,则阻塞,不必在执行后面的 wait(mutex);//减缓冲池 buffer[in]=nextp;//将消费的产品放入缓冲池 out=(out+1)%n;//指针后移 signal(mutex);//释放资源,v操作 signal(full); } }
其中,mutex信号量保证了消费者和生产者对缓冲池的互斥访问,即在消费者(或生产者)释放资源之前, 消费者(或者生产者)不能再利用缓冲池。
(3)信号量值的意义:
例如:设某一个信号量的初始值为1,进行一次p操作后变为0,此时,已经没有资源了,但是没有进程处于阻塞;
进行第二次操作后,变为-1,表示已经没有资源了,并且另外一个进程处于阻塞状态;
初始值1表示可用资源数量。