扫码关注公众号
简述进程同步的四种方法
1、临界区(CriticalSection):通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。2、互斥量(Mutex):为协调共同对一个共享资源的单独访问而设计的。互斥量跟临界区很相似,比临界区复杂,互斥对象只有一个,只有拥有互斥对象的线程才具有访问资源的权限。3、信号量(Semaphore):为控制一个具有有限数量用户资源而设计。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。互斥量是信号量的一种特殊情况,当信号量的最大资源数=1就是互斥量了。4、事件(Event):用来通知线程有一些事件已发生,从而启动后继任务的开始。
进程同步是进程与进程间的间接制约问题,进程互斥是进程与进程间的直接制约问题
正确答案是B进程之间存在直接制约关系(即同步问题)和间接制约关系(即互斥问题);同步问题是存在逻辑关系的进程之间相互等待所产生的制约关系,互斥问题是相互逻辑关系的进程竞争使用资源所发生的制约关系。
设有一缓冲池 P , P 中含有 20 个可用缓冲区,一个输入进程将外部数据读入 P ,另有一个输出进程将 P 中数据取出并输出。若进程每次
与生产者和消费者问题一样,只是empty的初始值设为20即可参考代码:Semaphoreempty=20;//空缓冲区的大小Semaphorefull=0;//有数据的缓冲区的大小Semaphoremutex=1;//互斥信号量intin=0,out=0;Input(){while(true){produceaniteminnextp;//产生一个商品暂存在nextp中wait(empty);wait(mutex);p[in]=nextp;in=(in+1)%20;signal(mutex);signal(full);}}Output(){while(true){wait(full);wait(mutex);nextc=p[out];out=(out+1)%20;signal(mutex);signal(empty);}}
系统中有多个生产者进程和消费者进程,共享用一个可以存 1000 个产品的缓冲区(初始为空),当缓冲区为未满时,生产者进程可以放入一件其生产的
本题是一个生产者-消费者的变型,本题是多个生产者-多个消费者类型,生产者和消费者之间并不互斥访问缓冲区,但生产者和生产者之间,消费者和消费者之间要互斥访问缓冲区,并且本题的消费者一次需要取走10件产品,如果没有它会等待,而不是等到有了10件产品后,才进行取走操作。本题的缓冲区B可描述为bufferaray[1000];(1)生产者之间设互斥信号量mutex1,消费者之间设互斥信号量metex2。(2)上述进程的同步问题,需设置3个信号量,其中empty对应空闲的缓冲单元,初值为1000;full对应缓冲区中待取走的产品数,初值为0;另外,还需定义2个整型变量in、out,分别用来指示下一个可存放产品的缓冲单元、下一个取走的缓冲单元,它们的初值均为0。过程如下:bufferarray[1000];//存放产品的缓冲区buffernextp;//用于临时存放生产者生产的产品buffernextc[10];//用于临时存放消费者取出的产品semaphoreempty=1000;//空缓冲区的数目semaphorefull=0;//满缓冲区的数目semaphoremutex1=1;//用于生产者之间的互斥semaphoremutex2=1;//用于消费者之间的互斥intin=0;//指示生产者的存位置intout=0;//指示消费者的取位置Producer()//生产者进程{Produceanitemputinnextp;//生产一个产品,存在临时缓冲区P(empty);//申请一个空缓冲区P(mutex1);//生产者申请使用缓冲区array[in]=nextp;//将产品存入缓冲区in=(in+1)%1000;//指针后移V(mutex1);//生产者缓冲区使用完毕,释放互斥信号量V(full);}//增加一个满缓冲区}Consumer()//消费者进程{P(mutex2);//消费者申请使用缓冲区for(inti=0;i<10;i++)//一个消费者进程需从缓冲区连续取走10件产品{P(full);//申请一个满缓冲区nextc[i]=array[out];//将产品取出,存于临时缓冲区out=(out+1)%1000;//指针后移V(empty);//增加一个空缓冲区}V(mutex2);//消费者缓冲区使用完毕,释放互斥信号量Consumetheitemsinnextc;//消费掉这10个产品}