如果原語中存在死迴圈,作業系統將如何跳出,釋放CPU?

時間 2021-05-09 04:31:15

1樓:碼農的荒島求生

你的程式是不會一直在執行的。

現代作業系統除了執行使用者程序之外還要接收網路資料,處理各種io等等,只有當作業系統「無事可做」時才會去執行程式設計師寫的程式。

而作業系統之所以可以一會兒執行使用者程序,一會兒接收網路資料靠的是一種被稱為中斷的機制。

中斷機制實際上非常簡單,就好比你在玩遊戲時突然門鈴響了,原來是快遞到了,這時你按下遊戲中的暫停鍵去收快遞,收完快遞後回來繼續遊戲。

實際上收快遞就是一次中斷處理,作業系統中也會存在各種「門鈴」,來自計算機系統中各種硬體,只要門鈴一響,作業系統就會暫停使用者程序的執行(如果此時作業系統在執行使用者程序的話)而去響應中斷。

現代計算機系統中都會有定時器這種硬體,定時器會每隔一段時間發出中斷訊號,這樣即時使用者程序中存在死迴圈也不能妨礙此時作業系統響應定時器的中斷資訊,此後作業系統就開始接管計算機系統了。

作業系統才是整個計算機系統的big brother。

2樓:布客飛龍

太長不看:請搜尋「搶占式排程」

搶占式排程(Preemptive Scheduling)是一種CPU排程技術,它通過將CPU的時隙劃分給給定的程序來工作。給定的時間間隔可能能夠完成整個過程,也可能無法完成。當程序的區間時間(burst time)大於CPU週期時,它將被放回到就緒佇列(ready queue)中,並在下乙個時機(chance)執行。

當程序切換到就緒狀態時,會使用這種排程方式。

什麼,你問它怎麼自願放棄控制流的?當然是有個計時器定時向匯流排發中斷訊號了。不靠外力怎麼可能保證公平嘛。

3樓:AntonyMei

原語(primitive)在執行的過程中不會響應中斷,常見的例如pv原語。因此,從理論上來說,如果原語裡有死迴圈是無法跳出或切換到其他程式的。但是原語是作業系統核心定義的,一般不會出現死迴圈這種問題。

如果想測試的話可以找個單核處理器然後關中斷跑死迴圈,效果應該和原語裡有死迴圈是一樣的。

4樓:原建業

這裡說的原語,是指「原子操作」

原子操作是作業系統根據特定體系結構指令實現的,成熟的作業系統不會在裡面做死迴圈。

在Linux中,在保護資料併發訪問的自旋鎖中執行了死迴圈,最終會導致系統宕機。

5樓:張強

這個問題其實就是停機問題,也是個NP問題,這是無解的。其實作業系統核心也是乙個死迴圈,你可以在任務管理器的系統空閒程序看到它。作業系統對於死迴圈的排程邏輯,可以參考windows的「該程式沒有響應,是否結束程序」,也就是如果乙個程式占用cpu時間過多,嚴重影響系統核心程序排程,那麼就會暫停這個程式的排程,並提示是否結束,也就是造成這個程式假死。

但這只是通過另一種方式來判斷是否死迴圈。表現為假死的原因除了死迴圈還有很多其他原因,比如等待外部io,執行緒鎖死等,所以不能一概而論。

6樓:腹黑小太陽

硬體計時器每隔一段時間(一般是6~12ms)會產生乙個計時器中斷,然後CPU的控制權會被強制轉移到作業系統的中斷處理程式,由作業系統決定CPU控制權轉移給哪乙個程式,周而復始。

所以現代作業系統中硬體計時器只有特權級才能訪問

7樓:

當陷入死迴圈時,在大多數作業系統中會有中斷機制幫助核心的排程器切換當前執行的任務,從而達到釋放CPU的目的;而協作式的核心則無法自行跳出

8樓:

這個就涉及到作業系統的排程了。

1、首先作業系統有個節拍tick,這個是通過定時中斷實現的,也就是經過固定的時間(比如1ms)CPU就會進去一次中斷,在這個中斷中會處理作業系統排程相關的操作;

2、作業系統中的排程策略如果是搶占的,那麼如果有高優先順序的任務就緒了就會在上面的tick中斷中進行任務切換,把當前任務狀態儲存,切換到這個高優先順序的任務;如果排程策略有開啟時間片,那麼同優先順序任務在執行完乙個時間片後系統會將本任務排程出然後執行其他任務。

3、如果作業系統設定的排程策略不是搶占的,也沒有時間片輪轉,這種屬於合作式排程,如果乙個任務不主動釋放CPU那其他的任務就沒法執行。也就是如果執行了死迴圈,而迴圈中又不會釋放CPU的話,其他任務永遠得不到執行。

9樓:tuhooo

以linux為例,使用者的程序是執行在使用者態的,有些許可權是沒有的。

如果一直執行死迴圈,把作業系統分配的時間片用完之後,會有外部硬體的時鐘中斷讓作業系統重新排程。

你這個程式可能會被切換下來,進去等待佇列中。

10樓:阿木卜

是的,樓上有回答,作業系統會排程每個程序和執行緒的,不可能讓你一直搶先cpu。最簡單一種方式就是時間片輪轉,到了時間就切下乙個

11樓:

其實,作業系統也是乙個死迴圈,跳出來就關機了。。

其實,網路程式中必然有一環是死迴圈,就是要檢查網上有沒有資料傳過來,跳出來就不能通訊了。。

其實,介面程式都包含死迴圈,來檢查你滑滑鼠、按鍵盤、被搶焦點一系列事件來調你的事件處理程式,跳出來介面就死了。。

天知道你還會發明啥高階程式,跳出來就完全失控了。。

12樓:R1CHIE

1.在微控制器的裸機程式中,如果存在死迴圈,一般來說,是使用看門狗機制來復位整個程式的。

2.在微控制器帶RTOS(實時系統)的應用程式中,如果存在死迴圈,如果在其它任務中進行餵狗了,那麼這個任務只會死迴圈。一般來說,RTOS是採用時間片+優先順序的機制來排程任務的,在相同優先順序下,採用同一時間片呼叫,執行的時間夠了,就會觸發異常,在異常裡把該死迴圈的任務進行入棧等操作來儲存現場,並獲取下乙個任務的現場並恢復,cpu就會執行下乙個任務,這樣就相當於把cpu從該死迴圈的任務中釋放出來。

3.作業系統的處理可能更為複雜,但最底層也應該和RTOS一樣通過觸發異常來切換任務,跳出死迴圈。

13樓:

不會跳出。

系統並不知道是不是死迴圈,而且就算知道是死迴圈,也不會擅自給你終止。因為就算是死迴圈也是人寫的,系統並不知道死迴圈是不是程式設計師所期待的結果,不能擅自去終止跳出。事實上許多正常程式本身就是乙個大大小小的死迴圈,在單執行緒單任務上的微控制器更是常見。

回到高階複雜的作業系統中,系統如果發現乙個執行緒長期霸佔CPU且對外無響應,會詢問使用者是否強制終止,決定權在使用者手上,系統不會自己擅自作出決定

14樓:chaostar

Halting problem/停機問題,這是乙個已經從數學上被證明的問題。

通俗地來講,目前的所有演算法,沒有辦法判定一段程式能否自行停止。所以基本無法判斷是否存在死迴圈。

所以一般從巨集觀上能夠終止程式的方法都是:

判定程式是否申請了太多的資源。

判定程式是否執行了過長時間。

15樓:

作業系統多工分協作式和搶占式。

協作式如Windows 3.x,如果你的程式寫了乙個死迴圈,不把CPU交給系統,作業系統就起不來了。

現代日常用的作業系統多工一般都是搶占式,系統不管你的程式在幹什麼,哪怕是死迴圈,它也會定期會把自己啟動起來。

Windows 9x是部分搶占式。32位程式是搶占的,但是16位不是。9x裡乙個16位程式死迴圈,所有16位程式就都拿不到CPU。不過32位程式不受影響。

16樓:零下

很簡單,os設定計時器,硬體每隔一段時間發出時鐘中斷,強制程式跳到os設定的時鐘中斷處理程式,os拿回控制權,在這裡可以選擇排程其他程式執行。所以即使程式空轉,os也能拿回控制權,正常響應。

如果程式正常執行,os一般不會主動殺掉它。不過你可以主動與os互動,傳送kill訊號,殺掉這個空轉的程序。

17樓:I老蔡

既然是"死迴圈", 那就說明是作業系統無法跳出的迴圈.

如果作業系統能夠自己跳出那個迴圈, 那也就不叫"死迴圈"了.

這個問題邏輯自斃!

18樓:良月十二

不知道我有沒有理解錯,因為我也在學習作業系統。你的問題就是,在乙個死迴圈的程式,如何暫停這個程式,啟用作業系統的排程程式。

在學習ucos的時候,我想通了,因為作業系統,有乙個時間中斷,比如1ms一次的中斷,這個中斷確定了系統和程式的執行時間。實行排程中斷服務函式我們知道的。

它會保護現場,然後執行,然後再恢復現場。問題就在這裡,假如我們不想執行這個程式了。如何跳轉到排程程式。

我想這一段應該用彙編。使用彙編跳轉到排程程式,儲存被打斷任務的PCB,然後清空中斷標誌位。這樣我們就實現了任務排程。

至於如何實現,還有億點細節,我暫時還沒有理清楚。比如被中斷打斷的任務PCB是是硬體自動儲存的,儲存在那個棧區,我暫時沒有想出來,還要仔細看。還有因為所有任務,中斷異常都有乙個表項,我們如何將這個PCB儲存到對應的表項,還有如果不把原來棧區由於中斷產生的現場保護的占用清空,會不會有概率這個任務的棧區,爆了。

好多好多細節,等著學習,加油乾飯人。

這個是我想的。還沒有看到這裡。如果有錯誤請指出。

19樓:Jeason chan

作業系統原理要看啊……

由於硬體中斷的存在,CPU總是會定期給OS時間片讓OS挑選下乙個執行的程序,不存使用者態死迴圈讓OS「無響應」的情況。

另外,程序排程演算法會給持續執行的程序逐漸降級,使用者互動指令預設是最高優先順序,當然,這些都是可以調整的。

20樓:

不明白「原語」是什麼,只是回答下死迴圈。

並不是所有死迴圈都是有害的,很多程式本身就是個死迴圈,比如伺服器軟體就是在無限迴圈偵聽特定埠的請求,幾乎所有輸入響應程式都如此,連windows本身也是乙個訊息迴圈。

死迴圈和能正常退出的迴圈是沒法區分的,乙個100年後才結束的迴圈是死迴圈嗎?乙個萬億分之一概率退出條件的迴圈是死迴圈嗎?

所以作業系統並不負責分析和制止死迴圈。

21樓:

現在作業系統基本都是分時復用的了。乙個執行緒把自己的時間片跑滿後,會被作業系統打斷切換到其他待排程的執行緒。另外執行緒除了自己執行到生命週期結束,也可以被殺死。

22樓:Kroulis

首先要說明的一點是:作業系統不會自動跳出。作業系統不會自動跳出。作業系統不會自動跳出。

一般如果你發現死迴圈的程式崩潰了,極大可能是系統拒絕了向程式提供更多資源(用完了)或者程式memoery leak了。 乙個精心設計的死迴圈程式完全是有可能極長時間維持穩定狀態而不崩潰的。 其實現在有很多的後台程式就是在執行無限制死迴圈直到使用者或作業系統要求其退出。

那麼有沒有辦法讓這個程式的影響變小呢? 有! 這個就涉及到作業系統的Threading 和 Scheduler的具體實現了。

基本上現代的作業系統都有給程序劃分優先順序。 優先順序高的在swap的過程中會被分配更多的執行時間。

以及現在絕大部分後台程式都會在執行完一次邏輯迴圈後把自己put to sleep。直到超時或者他提供的monitor收集到需要執行的任務後把他喚醒。 但這,還是死迴圈哦

9 99迴圈這個數存不存在,如果存在,那麼它是整數還是無限迴圈小數?

朱老忠 這個問題涉及到極限的概念,很多人是難以理解的。比如0.99999 這個無限迴圈等於1,網上查一下,很多人認為比1要小,不能相等。初中講到這題,總是用1 3形成乙個迴圈小數,再乘以3得到0.99999 用來說明等於1。這樣講的結果總是不能服人,讓人覺得是乙個 特例 怎麼一定要1 3乘以3?就沒...

宇宙中存在負質量的物質嗎?如果存在,那是一種什麼樣的存在?

斥引量子 這個問題不能以表面的對立統一的宇宙屬性來看待,要從其所依附的主截事物來分析。質量是物質屬性的表現之一,是從屬於物質屬性中的一項基本項,也是反映物質具有重力加速度等特徵的依據。所以,如果存在所謂的負質量現象,也應該是一種以物質為基礎的,並發生在物質與物質之間的一種相對性的現象中由物質的結構性...

春物中的真物在現實中存在嗎,如果沒有,至少怎樣才能變得冷漠?

我不認識字 這個問題有好大的邏輯錯誤,真物如果存在,則人與人之間存在可靠的親密關係,而如果不存在,那麼人和人的關係本質就是冷漠。所以說如果不存在真物,那麼人和人就是冷漠的關係,並不需要方法。 Mr.Edward 不請自來,真物這種東西,存在嗎?我覺得是薛丁格一般的存在。真物 這種東西,就和很多很多的...