欢迎来到天天文库
浏览记录
ID:38706742
大小:579.00 KB
页数:25页
时间:2019-06-18
《互斥工具-软件方式》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Part1软件互斥Dekker算法1booleanflag[2];2intturn;3voidP0()4{5while(true)6{7flag[0]=true;8while(flag[1])9if(turn==1)10{11flag[0]=false;12while(turn==1)13/*什么也不做*/14flag[0]=true;15}16临界区17turn=1;18flag[0]=false;19其余部分20}21}Peterson算法1booleanflag[2]={false,false};2intturn;
2、3voidP0()4{5while(true)6{7flag[0]=true;8turn=1;9while(flag[1]&&turn==1)10/*什么也不做*/;11临界区12flag[0]=false;13/*其余部分*/;14}15}16voidP1()17{18while(true)19{20flag[1]=true;21turn=0;22while(flag[0]&&turn==0)23/*什么也不做*/;24临界区25flag[1]=false;26/*其余部分*/;27}28}Part2硬件互斥Tests
3、et指令1booleantestset(inti)/*实现何种功能*/2{3if(i==0)4{5i=16returntrue7}8else9returnfalse10}11constintn=/*进程*/12intboltbolt=0testset(bolt)=truebolt=1进入临界区此时标志位bolt=1当占用资源结束bolt=0允许其它进程占有临界资源13voidP(inti)14{15while(1)16{17while(!testset(bolt))18/*什么也不做*/;19临界区20bolt=021/
4、*其余部分*/;22}23}24Voidmain()25{26bolt=027parbegin(P(1),P(2),…,P(n));28}exchange指令1voidexchange(intregister,intmemory)/*实现何种功能*/2{3inttemp4temp=memory5memory=register6register=temp7}8constintn=/*进程*/9intbolt10voidP(inti)11{进程1:keyi=1bolt=0(资源未被占用)通过17行程序:exchange(ke
5、yi,bolt)keyi=0bolt=1(资源已被占用)进程2:keyi=1bolt=1通过17行程序:exchange(keyi,bolt)keyi=1bolt=1等待bolt=0才可以占用资源12intkeyi13while(1)14{15keyi=116while(keyi!=0)17exchange(keyi,bolt)18临界区19exchange(keyi,bolt)20/*其余部分*/;21}22}23voidmain()24{25bolt=026parbegin(P(1),P(2),…,P(n))27}P
6、(Wait)操作/*申请一个资源*/1P(S)2{3S--4ifS<05block()6}V(Signal)操作/*释放一个资源*/7V(S)8{9S++10ifS<=011wakeup()12}P(S)临界区V(S)输入进程P1P(S1)读信息到缓冲区BV(S2)输出进程P2P(S2)从缓冲区B读出信息V(S1)如何设置S1,S2的初值,才能保证进程P1,P2同步进行?生产者消费者问题1semaphoremutex=1,empty=n,full=02inti=j=03itembuffer[n]4voidproducer
7、()5{6while(1)7{8producenextproduct9P(empty)10P(mutex)11buffer[i]=product12i=i+1%n13V(mutex)14V(full)15}16}17voidconsumer()18{19while(1)20{21P(full)22P(mutex)23product=buffer[j]24j=(j+1)%n25V(mutex)26V(empty)27consumetheproduct28}29}30voidmain()31{32parbegin(produ
8、cer(),consumer())33}读者写者问题(见PPT)哲学家进餐问题Originalprocessing:#defineN51voidphilosopher(inti)2{3while(true)4{5thinking6takefork[i]7takefork[(i+1)%5]8eating9putdown
此文档下载收益归作者所有