时序竞态(竞态条件)
產(chǎn)生原因:仍然以前文實(shí)現(xiàn)的sleep函數(shù)為例,如果進(jìn)程在執(zhí)行完alarm函數(shù)后,突然失去CPU,被阻塞等待(這是有可能的,進(jìn)程在執(zhí)行過程中,若非原子操作,都有可能隨時(shí)失去CPU),如果失去CPU的時(shí)間大于了sleep函數(shù)需要睡眠的時(shí)間,則此時(shí)在執(zhí)行pause函數(shù)前,信號已經(jīng)到了,因此會(huì)先處理信號(軟中斷,而不是先執(zhí)行pause函數(shù)),在信號處理完后,再去執(zhí)行pause函數(shù),此時(shí)進(jìn)程會(huì)被永遠(yuǎn)掛起,不會(huì)被喚醒,因?yàn)镾IGALRM信號已經(jīng)被處理了。時(shí)序競態(tài):即由于進(jìn)程之間執(zhí)行的順序不同,導(dǎo)致同一個(gè)進(jìn)程多次運(yùn)行后產(chǎn)生了不同結(jié)果的現(xiàn)象。如上述sleep函數(shù),有時(shí)執(zhí)行結(jié)果是正確的,有時(shí)卻會(huì)導(dǎo)致進(jìn)程永遠(yuǎn)被掛起,因此這就是一個(gè)時(shí)序競態(tài)問題。因此需要重新對該函數(shù)進(jìn)行改進(jìn)。
1. 注冊SIGALRM信號處理函數(shù)(sigaction...)
?2. 調(diào)用alarm(1) 函數(shù)設(shè)定鬧鐘1秒。
3. 函數(shù)調(diào)用剛結(jié)束,開始倒計(jì)時(shí)1秒。當(dāng)前進(jìn)程失去cpu,內(nèi)核調(diào)度優(yōu)先級高的進(jìn)程(有多個(gè))取代當(dāng)前進(jìn)程。當(dāng)前進(jìn)程無法獲得cpu,進(jìn)入就緒態(tài)等待cpu。
4. 1秒后,鬧鐘超時(shí),內(nèi)核向當(dāng)前進(jìn)程發(fā)送SIGALRM信號(自然定時(shí)法,與進(jìn)程狀態(tài)無關(guān)),高優(yōu)先級進(jìn)程尚未執(zhí)行完,當(dāng)前進(jìn)程仍處于就緒態(tài),信號無法處理(未決)
?5. 優(yōu)先級高的進(jìn)程執(zhí)行完,當(dāng)前進(jìn)程獲得cpu資源,內(nèi)核調(diào)度回當(dāng)前進(jìn)程執(zhí)行。SIGALRM信號遞達(dá),信號設(shè)置捕捉,執(zhí)行處理函數(shù)sig_alarm。
6. 信號處理函數(shù)執(zhí)行結(jié)束,返回當(dāng)前進(jìn)程主控流程,pause()被調(diào)用掛起等待。(欲等待alarm函數(shù)發(fā)送的SIGALRM信號將自己喚醒)
7. SIGALRM信號已經(jīng)處理完畢,pause不會(huì)等到。
總結(jié)
以上是生活随笔為你收集整理的时序竞态(竞态条件)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 地下城堡3光辉树枝怎么获得
- 下一篇: sigsuspend函数(mysleep