欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種基于原子操作的信號(hào)量鏈表式堆棧方法與流程

文檔序號(hào):11432081閱讀:269來(lái)源:國(guó)知局
一種基于原子操作的信號(hào)量鏈表式堆棧方法與流程

本發(fā)明涉及計(jì)算機(jī)系統(tǒng)軟件編程領(lǐng)域,特別是一種基于原子操作的信號(hào)量鏈表式堆棧方法。



背景技術(shù):

在計(jì)算機(jī)領(lǐng)域里信號(hào)量是用來(lái)實(shí)現(xiàn)進(jìn)程間同步的機(jī)制。信號(hào)量本身是一個(gè)整數(shù),信號(hào)量大于等于零表示可供并發(fā)進(jìn)程使用的資源實(shí)體數(shù),信號(hào)量小于零則表示正在等待使用臨界區(qū)的進(jìn)程數(shù)。例如在pv原語(yǔ)中,p原語(yǔ)信號(hào)量的操作是:若信號(hào)量減1后仍大于或等于零,則進(jìn)程繼續(xù)執(zhí)行,若信號(hào)量減1后小于零,則該進(jìn)程被阻塞;v原語(yǔ)信號(hào)量的操作是:若信號(hào)量加1后大于零,則進(jìn)程繼續(xù)執(zhí)行,若信號(hào)量加1后仍小于或等于零,則喚醒一個(gè)在該信號(hào)量上阻塞的進(jìn)程。



技術(shù)實(shí)現(xiàn)要素:

本發(fā)明提出一種基于原子比較并交換(cas)操作的帶信號(hào)計(jì)數(shù)的鏈表式堆棧方法,該方法的堆棧由棧頂指針、信號(hào)計(jì)數(shù)、出棧計(jì)數(shù)和結(jié)點(diǎn)構(gòu)成。信號(hào)計(jì)數(shù)和出棧計(jì)數(shù)都是整型值,這里的結(jié)點(diǎn)指的是計(jì)算機(jī)內(nèi)存中的一塊數(shù)據(jù),指針是指向這塊數(shù)據(jù)的地址,指針本身也是存放在內(nèi)存空間里的數(shù)據(jù)。每個(gè)結(jié)點(diǎn)包含一個(gè)鏈接指針,結(jié)點(diǎn)與結(jié)點(diǎn)之間通過鏈接指針連接起來(lái),棧頂指針指向第一個(gè)結(jié)點(diǎn)即為棧頂結(jié)點(diǎn),第一個(gè)結(jié)點(diǎn)的鏈接指針指向第二個(gè)結(jié)點(diǎn),最后一個(gè)結(jié)點(diǎn)的鏈接指針為空。和常規(guī)的鏈表式堆棧一樣具有入棧(push)和出棧(pop)的操作,不同的是進(jìn)行入棧操作時(shí)對(duì)信號(hào)計(jì)數(shù)值減1,若減1后該信號(hào)計(jì)數(shù)大于或等于零,則不能將新結(jié)點(diǎn)放入該堆棧中,若減1后該信號(hào)計(jì)數(shù)小于零,則能將新結(jié)點(diǎn)放入該堆棧,使用(cas)原子操作更新棧頂指針和相關(guān)計(jì)數(shù)值。進(jìn)行出棧操作時(shí)對(duì)信號(hào)計(jì)數(shù)值加1,若加1后該信號(hào)計(jì)數(shù)大于零,則出棧操作失敗返回空指針,若加1后該信號(hào)計(jì)數(shù)小于或等于零,則取出當(dāng)前棧頂結(jié)點(diǎn),并使用(cas)原子操作更新棧頂指針指向當(dāng)前棧頂結(jié)點(diǎn)鏈接的下一個(gè)結(jié)點(diǎn),更新過程中同時(shí)將出棧計(jì)數(shù)加1以防止(cas)操作過程中和原值比較時(shí)出現(xiàn)的aba問題。

一種基于原子操作的信號(hào)量鏈表式堆棧方法,包括入棧操作和出棧操作,該方法的堆棧由棧頂指針、信號(hào)計(jì)數(shù)、出棧計(jì)數(shù)和結(jié)點(diǎn)構(gòu)成;每個(gè)結(jié)點(diǎn)包含一個(gè)鏈接指針,結(jié)點(diǎn)與結(jié)點(diǎn)之間通過鏈接指針連接起來(lái),棧頂指針指向第一個(gè)結(jié)點(diǎn)即為棧頂結(jié)點(diǎn),第一個(gè)結(jié)點(diǎn)的鏈接指針指向第二個(gè)結(jié)點(diǎn),最后一個(gè)結(jié)點(diǎn)的鏈接指針為空;進(jìn)行入棧操作時(shí)包括以下步驟:第一步:取原棧頂結(jié)點(diǎn)指針、原信號(hào)計(jì)數(shù)值、原出棧計(jì)數(shù)值,第二步:使臨時(shí)信號(hào)計(jì)數(shù)值等于原信號(hào)計(jì)數(shù)值,使臨時(shí)出棧計(jì)數(shù)值等于原出棧計(jì)數(shù)值,使臨時(shí)棧頂結(jié)點(diǎn)指針等于原棧頂結(jié)點(diǎn)指針;第三步:臨時(shí)信號(hào)計(jì)數(shù)值減1并進(jìn)行判斷,若減1后小于零,則進(jìn)入第四步,若減1后大于或等于零,則直接進(jìn)入第五步;第四步:將入棧的新結(jié)點(diǎn)的鏈接指針指向原棧頂結(jié)點(diǎn),并將臨時(shí)棧頂結(jié)點(diǎn)指針指向新結(jié)點(diǎn);第五步:使用原子比較并交換操作嘗試同時(shí)將棧頂指針、信號(hào)計(jì)數(shù)、出棧計(jì)數(shù)跟原值進(jìn)行比較并原子化的替換為臨時(shí)棧頂結(jié)點(diǎn)指針、臨時(shí)信號(hào)計(jì)數(shù)、臨時(shí)出棧計(jì)數(shù)的值,第六步:如果替換操作成功,則入棧操作結(jié)束,如果替換操作失敗則返回第一步,重復(fù)上述步驟直至成功。

本發(fā)明進(jìn)一步的技術(shù)方案是:一種基于原子操作的信號(hào)量鏈表式堆棧方法,出棧操作時(shí)包括以下步驟:第一步:對(duì)信號(hào)計(jì)數(shù)進(jìn)行原子加1操作,第二步:進(jìn)行判斷,若加1后信號(hào)計(jì)數(shù)大于零,則表示出棧失敗返回空指針,出棧操作結(jié)束,若加1后信號(hào)計(jì)數(shù)小于或等于零,則進(jìn)入下一步;第三步:取原棧頂結(jié)點(diǎn)指針、原信號(hào)計(jì)數(shù)值、原出棧計(jì)數(shù)值;第四步:使臨時(shí)信號(hào)計(jì)數(shù)值等于原信號(hào)計(jì)數(shù)值,使臨時(shí)出棧計(jì)數(shù)值等于原出棧計(jì)數(shù)值加1,使臨時(shí)棧頂結(jié)點(diǎn)指針的值等于原棧頂結(jié)點(diǎn)的鏈接指針的值;第五步:使用原子比較并交換操作嘗試同時(shí)將棧頂指針、信號(hào)計(jì)數(shù)、出棧計(jì)數(shù)跟原值進(jìn)行比較并原子化的替換為臨時(shí)棧頂結(jié)點(diǎn)指針、臨時(shí)信號(hào)計(jì)數(shù)、臨時(shí)出棧計(jì)數(shù)的值,第六步:進(jìn)行判斷,如果替換操作失敗則返回第三步,并重復(fù)第三步、第四步、第五步和第六步,如果替換操作成功,將原棧頂結(jié)點(diǎn)指針返回,出棧操作結(jié)束。

本發(fā)明與現(xiàn)有的鏈表式堆棧相比具有如下特點(diǎn):進(jìn)行入棧操作時(shí)對(duì)信號(hào)計(jì)數(shù)值減1,若減1后該信號(hào)計(jì)數(shù)大于或等于零,則不能將新結(jié)點(diǎn)放入該堆棧中,若減1后該信號(hào)計(jì)數(shù)小于零,則能將新結(jié)點(diǎn)放入該堆棧,使用(cas)原子操作更新棧頂指針和相關(guān)計(jì)數(shù)值。進(jìn)行出棧操作時(shí)對(duì)信號(hào)計(jì)數(shù)值加1,若加1后該信號(hào)計(jì)數(shù)大于零,則出棧操作失敗返回空指針,若加1后該信號(hào)計(jì)數(shù)小于或等于零,則取出當(dāng)前棧頂結(jié)點(diǎn),并使用(cas)原子操作更新棧頂指針指向當(dāng)前棧頂結(jié)點(diǎn)鏈接的下一個(gè)結(jié)點(diǎn),更新過程中同時(shí)將出棧計(jì)數(shù)加1以防止(cas)操作過程中和原值比較時(shí)出現(xiàn)的aba問題。

該方法完全使用(cas)原子操作實(shí)現(xiàn),允許在多處理器環(huán)境下對(duì)其進(jìn)行多線程安全的共享訪問,由于規(guī)避了傳統(tǒng)的鎖機(jī)制來(lái)維護(hù)多線程安全的方式,因此在處理器較多的平臺(tái)上具有性能上的優(yōu)勢(shì),該方法易于擴(kuò)展,很容易實(shí)現(xiàn)類似信號(hào)量機(jī)制的功能,也可用于管理空閑的計(jì)算資源,例如:當(dāng)空閑計(jì)算資源結(jié)點(diǎn)不能入棧時(shí),表示之前有任務(wù)或請(qǐng)求在申請(qǐng)計(jì)算資源時(shí)進(jìn)行過出棧操作但未能獲得空閑的計(jì)算資源結(jié)點(diǎn),此時(shí)可從任務(wù)隊(duì)列中將等待處理的任務(wù)分配給該計(jì)算資源結(jié)點(diǎn)。如果計(jì)算資源結(jié)點(diǎn)可以入棧,則說明當(dāng)前任務(wù)隊(duì)列中沒有等待處理的任務(wù),直到有新任務(wù)提交過來(lái)申請(qǐng)計(jì)算資源結(jié)點(diǎn)時(shí)進(jìn)行出棧操作將該結(jié)點(diǎn)彈出,并將任務(wù)送達(dá)該計(jì)算資源結(jié)點(diǎn)進(jìn)行處理,從而實(shí)現(xiàn)計(jì)算資源的調(diào)度,這是常規(guī)的鏈表式堆棧無(wú)法實(shí)現(xiàn)的。

以下結(jié)合附圖和具體實(shí)施方式對(duì)本發(fā)明的詳細(xì)結(jié)構(gòu)作進(jìn)一步描述。

附圖說明

附圖1:為本發(fā)明的入棧操作流程示意圖;

附圖2:為本發(fā)明的出棧操作流程示意圖。

具體實(shí)施方式

如附圖1所示:一種基于原子操作的信號(hào)量鏈表式堆棧方法,該方法的堆棧由棧頂指針、信號(hào)計(jì)數(shù)、出棧計(jì)數(shù)和結(jié)點(diǎn)構(gòu)成;每個(gè)結(jié)點(diǎn)包含一個(gè)鏈接指針,結(jié)點(diǎn)與結(jié)點(diǎn)之間通過鏈接指針連接起來(lái),棧頂指針指向第一個(gè)結(jié)點(diǎn)即為棧頂結(jié)點(diǎn),第一個(gè)結(jié)點(diǎn)的鏈接指針指向第二個(gè)結(jié)點(diǎn),最后一個(gè)結(jié)點(diǎn)的鏈接指針為空;進(jìn)行入棧操作時(shí)包括以下步驟:第一步:取原棧頂結(jié)點(diǎn)指針、原信號(hào)計(jì)數(shù)值、原出棧計(jì)數(shù)值,第二步:使臨時(shí)信號(hào)計(jì)數(shù)值等于原信號(hào)計(jì)數(shù)值,使臨時(shí)出棧計(jì)數(shù)值等于原出棧計(jì)數(shù)值,使臨時(shí)棧頂結(jié)點(diǎn)指針等于原棧頂結(jié)點(diǎn)指針;第三步:臨時(shí)信號(hào)計(jì)數(shù)值減1并進(jìn)行判斷,若減1后小于零,則進(jìn)入第四步,若減1后大于或等于零,則直接進(jìn)入第五步;第四步:將入棧的新結(jié)點(diǎn)的鏈接指針指向原棧頂結(jié)點(diǎn),并將臨時(shí)棧頂結(jié)點(diǎn)指針指向新結(jié)點(diǎn);第五步:使用原子比較并交換操作嘗試同時(shí)將棧頂指針、信號(hào)計(jì)數(shù)、出棧計(jì)數(shù)跟原值進(jìn)行比較并原子化的替換為臨時(shí)棧頂結(jié)點(diǎn)指針、臨時(shí)信號(hào)計(jì)數(shù)、臨時(shí)出棧計(jì)數(shù)的值,第六步:如果替換操作成功,則入棧操作結(jié)束,如果替換操作失敗則返回第一步,重復(fù)上述步驟直至成功。

如附圖2所示:一種基于原子操作的信號(hào)量鏈表式堆棧方法的出棧操作步驟,第一步:對(duì)信號(hào)計(jì)數(shù)進(jìn)行原子加1操作,第二步:進(jìn)行判斷,若加1后信號(hào)計(jì)數(shù)大于零,則表示出棧失敗返回空指針,出棧操作結(jié)束,若加1后信號(hào)計(jì)數(shù)小于或等于零,則進(jìn)入下一步;第三步:取原棧頂結(jié)點(diǎn)指針、原信號(hào)計(jì)數(shù)值、原出棧計(jì)數(shù)值;第四步:使臨時(shí)信號(hào)計(jì)數(shù)值等于原信號(hào)計(jì)數(shù)值,使臨時(shí)出棧計(jì)數(shù)值等于原出棧計(jì)數(shù)值加1,使臨時(shí)棧頂結(jié)點(diǎn)指針的值等于原棧頂結(jié)點(diǎn)的鏈接指針的值;第五步:使用原子比較并交換操作嘗試同時(shí)將棧頂指針、信號(hào)計(jì)數(shù)、出棧計(jì)數(shù)跟原值進(jìn)行比較并原子化的替換為臨時(shí)棧頂結(jié)點(diǎn)指針、臨時(shí)信號(hào)計(jì)數(shù)、臨時(shí)出棧計(jì)數(shù)的值,第六步:進(jìn)行判斷,如果替換操作失敗則返回第三步,并重復(fù)第三步、第四步、第五步和第六步,如果替換操作成功,將原棧頂結(jié)點(diǎn)指針返回,出棧操作結(jié)束。

原子加1操作:在計(jì)算機(jī)系統(tǒng)中,尤其是對(duì)稱多處理器系統(tǒng)中,對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行運(yùn)算修改時(shí)包含從內(nèi)存取數(shù)據(jù)、運(yùn)算、將運(yùn)算結(jié)果寫回內(nèi)存這三個(gè)步驟。當(dāng)多個(gè)處理器同時(shí)對(duì)同一個(gè)內(nèi)存中的變量進(jìn)行運(yùn)算操作時(shí),如果沒有約束條件的話,他們可能取的數(shù)據(jù)是同一個(gè)值,最終運(yùn)算結(jié)果會(huì)變成最后一個(gè)寫回內(nèi)存的處理器運(yùn)算的結(jié)果,而不是這幾個(gè)處理器分別對(duì)該內(nèi)存中的變量進(jìn)行計(jì)算后的結(jié)果。例如3個(gè)處理器同時(shí)對(duì)一個(gè)值為0的內(nèi)存變量進(jìn)行加1操作,很可能最終計(jì)算后該內(nèi)存變量的結(jié)果為1或者2,而不是3。在x86處理器平臺(tái)上對(duì)目的操作數(shù)為內(nèi)存變量的運(yùn)算指令前加lock前綴,將保證該指令執(zhí)行期間其他處理器不能訪問該內(nèi)存變量,直到該指令將運(yùn)算結(jié)果寫回目的內(nèi)存后,其他處理器才能對(duì)該內(nèi)存變量進(jìn)行操作。帶lock前綴的加1指令就能保證多個(gè)處理器同時(shí)對(duì)同一內(nèi)存變量進(jìn)行加1操作的最終結(jié)果是這幾個(gè)處理器分別對(duì)該變量進(jìn)行加1的結(jié)果。這就是原子加1操作。

原子比較并交換操作(cas):該操作有3個(gè)操作數(shù),內(nèi)存值v,舊的預(yù)期值a,要修改的新值b。當(dāng)且僅當(dāng)預(yù)期值a和內(nèi)存值v相同時(shí),將內(nèi)存值v修改為b,否則什么都不做,并且在此操作期間其他處理器不能對(duì)內(nèi)存值v進(jìn)行操作。

原子比較并交換操作(cas)的aba問題:在cas的操作過程中當(dāng)舊的預(yù)期值a與要修改的新值b存在某種關(guān)聯(lián),且這種關(guān)聯(lián)的有效性直接影響cas操作結(jié)果的正確性。而當(dāng)預(yù)期值a和內(nèi)存值v相同時(shí),卻無(wú)法判斷和預(yù)期值a相同的內(nèi)存值v是否被改動(dòng)過,從而導(dǎo)致預(yù)期值a和新值b的關(guān)聯(lián)失效的問題。

本發(fā)明涉及到計(jì)算機(jī)專業(yè)領(lǐng)域里原子操作的概念,對(duì)于本專業(yè)領(lǐng)域的技術(shù)人員,能夠熟練的在不同處理器平臺(tái)上使用該平臺(tái)的相關(guān)機(jī)器指令實(shí)現(xiàn)這些原子操作。例如本發(fā)明中使用的原子比較并交換(cas)操作在intelx86處理器平臺(tái)上可以用lockcmpxchg指令實(shí)現(xiàn),也可以使用lockcmpxchg8b指令實(shí)現(xiàn),在64位模式下也可以使用lockcmpxchg16b指令實(shí)現(xiàn),且不同的處理器硬件平臺(tái)實(shí)現(xiàn)這些原子操作的機(jī)器指令是不同的,不能將這種差異解釋為超出本發(fā)明的范疇。

當(dāng)前第1頁(yè)1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
赤壁市| 且末县| 喜德县| 安泽县| 滕州市| 无棣县| 朝阳县| 孝义市| 民乐县| 日喀则市| 堆龙德庆县| 治县。| 阿坝| 绥芬河市| 静安区| 定襄县| 辛集市| 维西| 罗江县| 辽宁省| 奎屯市| 綦江县| 广元市| 渭源县| 通河县| 天长市| 兰坪| 堆龙德庆县| 界首市| 海伦市| 天祝| 云阳县| 湖口县| 松阳县| 保康县| 元谋县| 阳原县| 石首市| 澄迈县| 阿拉善盟| 灵丘县|