時序競態(競態條件)

產生原因:仍然以前文實現的sleep函數為例,如果進程在執行完alarm函數后,突然失去CPU,被阻塞等待(這是有可能的,進程在執行過程中,若非原子操作,都有可能隨時失去CPU),如果失去CPU的時間大于了sleep函數需要睡眠的時間,則此時在執行pause函數前,信號已經到了,因此會先處理信號(軟中斷,而不是先執行pause函數),在信號處理完后,再去執行pause函數,此時進程會被永遠掛起,不會被喚醒,因為SIGALRM信號已經被處理了。時序競態:即由于進程之間執行的順序不同,導致同一個進程多次運行后產生了不同結果的現象。如上述sleep函數,有時執行結果是正確的,有時卻會導致進程永遠被掛起,因此這就是一個時序競態問題。因此需要重新對該函數進行改進。

1. 注冊SIGALRM信號處理函數(sigaction...)

?2. 調用alarm(1) 函數設定鬧鐘1秒。

3. 函數調用剛結束,開始倒計時1秒。當前進程失去cpu,內核調度優先級高的進程(有多個)取代當前進程。當前進程無法獲得cpu,進入就緒態等待cpu。

4. 1秒后,鬧鐘超時,內核向當前進程發送SIGALRM信號(自然定時法,與進程狀態無關),高優先級進程尚未執行完,當前進程仍處于就緒態,信號無法處理(未決)

?5. 優先級高的進程執行完,當前進程獲得cpu資源,內核調度回當前進程執行。SIGALRM信號遞達,信號設置捕捉,執行處理函數sig_alarm。

6. 信號處理函數執行結束,返回當前進程主控流程,pause()被調用掛起等待。(欲等待alarm函數發送的SIGALRM信號將自己喚醒)

7. SIGALRM信號已經處理完畢,pause不會等到。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385326.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385326.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385326.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

1106 Lowest Price in Supply Chain (25)

A supply chain is a network of retailers(零售商), distributors(經銷商), and suppliers(供應商)-- everyone involved in moving a product from supplier to customer. Starting from one root suppli…

【Leetcode | 順序刷題 】二分查找目錄

二分查找序號題號129. 兩數相除 50. Pow(x, n) 69. x 的平方根

sigsuspend函數(mysleep函數的改進)

可以通過設置屏蔽SIGALRM的方法來控制程序執行邏輯,但無論如何設置,程序都有可能在“解除信號屏蔽”與“掛起等待信號”這個兩個操作間隙失去cpu資源。除非將這兩步驟合并成一個“原子操作”。sigsuspend函數具備這個功能。在對時序要求嚴格的場合下都應…

【Leetcode | 順序刷題】數學目錄

序號題號1 7. 整數反轉 28. 字符串轉換整數 (atoi)39. 回文數443. 字符串相乘

全局變量的異步I/O問題

全局變量的異步I/O問題同樣屬于時序競態問題,其本質就是多個進程或者同一個進程中的多個時序(如主控程序和信號捕捉時的用戶處理函數)對同一個變量進行修改時,它們的執行順序不一樣就會導致該變量最終的值不一樣,從而產…

【Leetcode | 03】String

字符串目錄序號題號33. 無重復字符的最長子串 151. 翻轉字符串里的單詞

可/不可重入函數

一個函數在被調用執行期間(尚未調用結束),由于某種時序(遞歸或者處理信號捕捉時等情況)又被重復調用,稱之為“重入”。根據函數實現的方法可分為“可重入函數”和“不可重入函數”兩種。看如下程序。 可以看…

【Leetcode | 順序刷題】雜項目錄

序號題號類別1136. 只出現一次的數字位運算2137. 只出現一次的數字 II位運算3 260. 只出現一次的數字 III 位運算4191. 位1的個數位運算5231. 2的冪位運算6342. 4的冪位運算7 338. 比特位計數 位運算8405. 數字轉換為十六進制數位運算9371. 兩整數之和位運算10401. 二進制手表位…

SIGCHLD信號

(1)SIGCHLD信號產生的條件 1.子進程終止時會向父進程發送SIGCHLD信號,告知父進程回收自己,但該信號的默認處理動作為忽略,因此父進程仍然不會去回收子進程,需要捕捉處理實現子進程的回收; 2.子…

信號傳參

(1)發送信號傳參 前面已經知道從一個進程向另一個進程發送信號可以使用kill函數,但是kill函數在向進程發送信號的時候不能攜帶除了信號以外的其他信息,這時可以使用與kill相對應的sigqueue函數,該函數也是向一個進程發…

【Leetcode | 52】257. 二叉樹的所有路徑

給定一個二叉樹,返回所有從根節點到葉子節點的路徑。 說明: 葉子節點是指沒有子節點的節點。 示例: 輸入: 1 / \ 2 3 \ 5 輸出: ["1->2->5", "1->3"] 解釋: 所有根節點到葉子節點的路徑為: 1->2->5, 1->3 解法一&a…

623. 在二叉樹中增加一行

給定一個二叉樹,根節點為第1層,深度為 1。在其第 d 層追加一行值為 v 的節點。 添加規則:給定一個深度值 d (正整數),針對深度為 d-1 層的每一非空節點 N,為 N 創建兩個值為 v 的左子樹和右子樹…

終端的概念

操作系統接口:用戶接口和程序接口。用戶接口分為聯機用戶接口和脫機用戶接口。脫機用戶接口出現在早期的批處理系統中(將作業提前交給操作系統,作業完成的過程中用戶無法交互);聯機用戶接口即為終端(所有輸…

終端的啟動流程

在Linux操作系統啟動時,首先加載的進程就是init進程(ID為1),其余進程都是init進程產生的(fork,然后exec金蟬脫殼),因此系統中所有進程都可以看成是init進程的子孫進程。可以通過ps a…

進程組(作業)

(1)概念和特性 進程組,也稱之為作業。BSD于1980年前后向Unix中增加的一個新特性。代表一個或多個進程的集合。每個進程都屬于一個進程組。在waitpid函數和kill函數的參數中都曾使用到。操作系統設計的進程組的概念,是為了簡化對多…

437. 路徑總和 III

給定一個二叉樹,它的每個結點都存放著一個整數值。 找出路徑和等于給定數值的路徑總數。 路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的(只能從父節點到子節點)。 二叉樹不超過1000個節…

會話(session)

一組進程形成一個進程組,一組進程組形成一個會話,即一個會話中可以包括多個進程組。 (1)創建會話 創建一個會話需要注意以下6點注意事項:1.調用進程不能是進程組組長(不能是父進程)&#xff0…

508. 出現次數最多的子樹元素和

給出二叉樹的根,找出出現次數最多的子樹元素和。一個結點的子樹元素和定義為以該結點為根的二叉樹上所有結點的元素之和(包括結點本身)。然后求出出現次數最多的子樹元素和。如果有多個元素出現的次數相同,返回所有出現次數最多的…

1003 我要通過!(20)(20 分)

“答案正確”是自動判題系統給出的最令人歡喜的回復。本題屬于PAT的“答案正確”大派送 —— 只要讀入的字符串滿足下列條件,系統就輸出“答案正確”,否則輸出“答案錯誤”。 得到“答案正確”的條件是: 1. 字符串中必須僅有P, A, T這三種字符…

網絡終端

虛擬終端或串口終端的數目是有限的,虛擬終端(字符控制終端)一般就是/dev/tty1~/dev/tty6六個,串口終端的數目也不超過串口的數目。然而網絡終端或圖形終端窗口的數目卻是不受限制的,這是通過偽終端(Pseudo…