溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

完成臨界區(qū)互斥的根本辦法

發(fā)布時(shí)間:2020-07-06 10:36:50 來源:網(wǎng)絡(luò) 閱讀:499 作者:yuw2016 欄目:網(wǎng)絡(luò)安全

軟件完成辦法

在進(jìn)入?yún)^(qū)設(shè)置和反省一些標(biāo)記來標(biāo)明能否有過程在臨界區(qū)中,假如已有過程在臨界區(qū),則在進(jìn)入?yún)^(qū)經(jīng)過輪回反省停止等候,過程分開臨界區(qū)后則在加入?yún)^(qū)修正標(biāo)記。

1) 算法一:?jiǎn)螛?biāo)記法。

該算法設(shè)置一個(gè)公用整型變量turn,用于指導(dǎo)被許可進(jìn)入臨界區(qū)的過程編號(hào),即若turn=0,則許可P0過程進(jìn)入臨界區(qū)。該算法可確保每次只許可一個(gè)過程進(jìn)入臨界區(qū)。但兩個(gè)過程必需瓜代進(jìn)入臨界區(qū),假如某個(gè)過程不再進(jìn)入臨界區(qū)了,那么另一個(gè)過程也將進(jìn)入臨界區(qū)(違犯“閑暇讓進(jìn)”)如許很輕易形成資本應(yīng)用的不充沛。

					// P0過程 while(turn!=0); critical section; turn=1; remainder section;
					// P1過程 while(turn!=1); // 進(jìn)入?yún)^(qū) critical section; // 臨界區(qū) turn = 0; // 加入?yún)^(qū) remainder section; // 殘剩區(qū)
2) 算法二:雙標(biāo)記法先反省。

該算法的根本思惟是在每個(gè)過程拜訪臨界區(qū)資本之前,先檢查一下臨界資本能否正被拜訪,若正被拜訪,該過程需等候;不然,過程才進(jìn)入本人的臨界區(qū)。為此,設(shè)置了一個(gè)數(shù)據(jù)flag[i],如第i個(gè)元素值為FALSE,表現(xiàn)Pi過程未進(jìn)入臨界區(qū),值為TRUE,表現(xiàn)Pi過程進(jìn)入臨界區(qū)。

					// Pi 過程 while(flag[j]); // ①  flag[i]=TRUE; // ③  critical section; flag[i] = FALSE; remainder section;
					// Pj 過程 while(flag[i]); // ② 進(jìn)入?yún)^(qū) flag[j] =TRUE; // ④ 進(jìn)入?yún)^(qū) critical section; // 臨界區(qū) flag[j] = FALSE; // 加入?yún)^(qū) remainder section; // 殘剩區(qū)


長(zhǎng)處:不必瓜代進(jìn)入,可延續(xù)運(yùn)用;缺陷:Pi和Pj能夠同時(shí)進(jìn)入臨界區(qū)。順次列①②③④ 履行時(shí),會(huì)同時(shí)進(jìn)入臨界區(qū)(違犯“忙則等候”)。即在反省對(duì)方flag之后和切換本人flag 之前有一段工夫,后果都反省經(jīng)過。這里的成績(jī)出在反省和修正操作不克不及一次停止。

3) 算法三:雙標(biāo)記法后反省。

算法二是先檢測(cè)對(duì)方過程形態(tài)標(biāo)記后,再置本人標(biāo)記,因?yàn)樵跈z測(cè)和放置中可拔出另一個(gè)過程抵達(dá)時(shí)的檢測(cè)操作,會(huì)形成兩個(gè)過程在辨別檢測(cè)后,同時(shí)進(jìn)入臨界區(qū)。為此,算法三釆用先設(shè)置本人標(biāo)記為TRUE后,再檢測(cè)對(duì)方形態(tài)標(biāo)記,若對(duì)方標(biāo)記為TURE,則過程等候;不然進(jìn)入臨界區(qū)。

					// Pi過程 flag[i] =TRUE; while(flag[j]); critical section; flag[i] =FLASE; remainder section;
					// Pj過程 flag[j] =TRUE; // 進(jìn)入?yún)^(qū) while(flag[i]); // 進(jìn)入?yún)^(qū) critical section; // 臨界區(qū) flag [j] =FLASE; // 加入?yún)^(qū) remainder section; // 殘剩區(qū)


當(dāng)兩個(gè)過程簡(jiǎn)直同時(shí)都想進(jìn)入臨界區(qū)時(shí),它們辨別將本人的標(biāo)記值flag設(shè)置為TRUE,而且同時(shí)檢測(cè)對(duì)方的形態(tài)(履行while語(yǔ)句),發(fā)現(xiàn)對(duì)方也要進(jìn)入臨界區(qū),于是單方相互辭讓,后果誰(shuí)也進(jìn)不了臨界區(qū),從而招致“饑餓”景象。

4)算法四:Peterson’s Algorithm。

為了避免兩個(gè)過程為進(jìn)入臨界區(qū)而有限期等候,又設(shè)置變量turn,指導(dǎo)不許可進(jìn)入臨界區(qū)的過程編號(hào),每一個(gè)過程在先設(shè)置本人標(biāo)記后再設(shè)置turn 標(biāo)記,不許可另一個(gè)過程進(jìn)入。這時(shí),再同時(shí)檢測(cè)另一個(gè)過程形態(tài)標(biāo)記和不許可進(jìn)入標(biāo)記,如許可以包管當(dāng)兩個(gè)過程同時(shí)請(qǐng)求進(jìn)入臨界區(qū),只許可一個(gè)過程進(jìn)入臨界區(qū)。

					// Pi過程 flag[i]=TURE; turn=j; while(flag[j]&&turn==j); critical section; flag[i]=FLASE; remainder section;
					// Pj過程 flag[j] =TRUE;turn=i; // 進(jìn)入?yún)^(qū) while(flag[i]&&turn==i); // 進(jìn)入?yún)^(qū) critical section; // 臨界區(qū) flag[j]=FLASE; // 加入?yún)^(qū) remainder section; // 殘剩區(qū)


本算法的根本思惟是算法一和算法三的聯(lián)合。應(yīng)用flag處理臨界資本的互斥拜訪,而應(yīng)用turn處理“饑餓”景象。

硬件完成辦法

本節(jié)對(duì)硬件完成的詳細(xì)了解對(duì)前面的旌旗燈號(hào)量的進(jìn)修很有協(xié)助。盤算機(jī)供給了特別的硬件指令,許可對(duì)一個(gè)字中的內(nèi)容停止檢測(cè)和修改,或許是對(duì)兩個(gè)字的內(nèi)容停止交流等。經(jīng)過硬件支撐完成臨界段成績(jī)的初級(jí)辦法或稱為元辦法。

1) 中綴屏障辦法

當(dāng)一個(gè)過程正在運(yùn)用處置機(jī)履行它的臨界區(qū)代碼時(shí),要避免其他過程再進(jìn)入其臨界區(qū)拜訪的最復(fù)雜辦法是制止一切中綴發(fā)作,或稱之為屏障中綴、關(guān)中綴。由于CPU只在發(fā)作中綴時(shí)惹起過程切換,如許屏障中綴就能包管以后運(yùn)轉(zhuǎn)過程將臨界區(qū)代碼順?biāo)斓芈男型辏瑥亩芰嘶コ獾臏?zhǔn)確完成,然后再履行開中綴。其典型形式為:

關(guān)中綴;
臨界區(qū);
開中綴;

這種辦法限制了處置機(jī)瓜代履行程序的才能,因而履行的效力將會(huì)分明下降。對(duì)內(nèi)核來說,當(dāng)它履行更新變量或列表的幾條指令時(shí)期關(guān)中綴是很便利的,但將關(guān)中綴的權(quán)利交給用戶則很不明智,若一個(gè)過程關(guān)中綴之后不再開中綴,則零碎能夠會(huì)因而終止。

2) 硬件指令辦法

TestAndSet指令:這條指令是原子操作,即履行該代碼時(shí)不許可被中綴。其功用是讀出指定標(biāo)記后把該標(biāo)記設(shè)置為真。指令的功用描繪如下:

			boolean TestAndSet(boolean *lock){ boolean old; old = *lock; *lock=true; return old; }


可認(rèn)為每一個(gè)臨界資本設(shè)置一個(gè)共享布爾變量lock,表現(xiàn)資本的兩種形態(tài):true表現(xiàn)正被占用,初值為false。在過程拜訪臨界資本之前,應(yīng)用TestAndSet反省和修正標(biāo)記lock;如有過程在臨界區(qū),則反復(fù)反省,直到過程加入。應(yīng)用該指令完成過程互斥的算法描繪如下:

			while TestAndSet (& 1 ock); // 過程的臨界區(qū)代碼段; lock=false; // 過程的其他代碼


Swap指令:該指令的功用是交流兩個(gè)字節(jié)的內(nèi)容。其功用描繪如下。

			Swap(boolean *a, boolean *b){ boolean temp; Temp=*a; *a = *b; *b = temp; }


留意:以上對(duì)TestAndSet和Swap指令的描繪僅僅是功用完成,并非軟件完成界說,現(xiàn)實(shí)上它們是由硬件邏輯直接完成的,不會(huì)被中綴。
應(yīng)為每一個(gè)臨界資本設(shè)置了一個(gè)共享布爾變量lock,初值為false;在每一個(gè)過程中再設(shè)置一個(gè)部分布爾變量key,用于與lock交流信息。在進(jìn)入臨界區(qū)之前先應(yīng)用Swap指令交流lock 與key的內(nèi)容,然后反省key的形態(tài);有過程在臨界區(qū)時(shí),反復(fù)交流和反省進(jìn)程,直到過程加入。應(yīng)用Swap指令完成過程互斥的算法描繪如下:

			key=true; while(key!=false) Swap(&lock, &key); // 過程的臨界區(qū)代碼段; lock=false; // 過程的其他代碼;


硬件辦法的長(zhǎng)處:實(shí)用于恣意數(shù)量的過程,不論是單處置機(jī)照樣多處置機(jī);復(fù)雜、輕易驗(yàn)證其準(zhǔn)確性。可以支撐過程內(nèi)有多個(gè)臨界區(qū),只需為每一個(gè)臨界區(qū)設(shè)立一個(gè)布爾變量。
硬件辦法的缺陷:過程等候進(jìn)入臨界區(qū)時(shí)要消耗處置機(jī)工夫,不克不及完成讓權(quán)等候。從等候過程中隨機(jī)選擇一個(gè)進(jìn)入臨界區(qū),有的過程能夠不斷選不上,從而招致“饑餓”景象。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI