作業系統中任務是怎麼切換的

2021-07-06 10:31:14 字數 2292 閱讀 3830

想記下點專業方面的知識,但又感覺難以組織好語言,因為不想出現很多名詞錯誤,也想講得清楚一點,要做到這點的話,還要回去翻之前看過的書,或者要去做好搜尋確認。然而並不是很有時間做這些。還是泛泛地說一下吧,以後發現有錯誤了再回來改。

作業系統任務排程的方式有很多種,比如說基於時間片輪洵排程,基於優先順序搶占式排程等等,任務排程就涉及到任務的切換。那麼任務切換在計算機的底層是怎麼實現的呢?你可能學過c語言,或其它程式語言,知道程式就是順序執行,或者迴圈執行。你可能也知道一般的cpu處理器同一時間只能執行乙個程式。那麼,我們看到的電腦,為什麼可以同時執行那麼多的程式呢?只要快速地在不同的程式中切換,被切換而暫停執行的程式,會儲存它的狀態,cpu很快就會回來執行這個程式,這時候這個程式會恢復它的狀態,並接著執行下去。當然這個你可能也看過或聽過很多了,還是不明白到底是怎麼實現的。那麼作業系統中任務是怎麼切換的呢?

這個要說到計算機的中斷機制,單純學軟體的人可能比較少接觸到中斷這個概念。但可以說中斷是一直存在於cpu中的一種機制(cpu中有乙個中斷控制器),並不是乙個新的東西。中斷是由中斷源觸發的,中斷源可以是cpu裡整合的某個部件狀態的改變(當然這個是可以配置的,很多部件,可以做為不同的中斷源,簡單的解釋就差不多是這樣,可能不全,不過大概意思就是這樣,具體的可以搜尋一下中斷)。程式執行時,把部件狀態的改變看成中斷事件,中斷事件的發生會中止當前程式的執行,轉而去執行另外的一段**,這段**就是中斷服務程式(這不是新的東西,中斷服務程式被作業系統所使用,一般的純上層應用軟體的開發基本沒有用到這個功能,甚至不知道它的存在,但中斷服務程式一直存在),可以說你自己寫的**在順序執行的過程中,可能已經被中斷過非常多次了,先不考慮作業系統任務切換的情況,計算機執行了你程式的幾行**,就會中斷你的程式而去執行中斷服務程式,然後執行完中斷服務程式後又回來接著執行你的程式,如此交替進行。那麼,計算機是如果保證你的程式在執行中可以被中斷而不會影響到你程式的執行結果呢?換句話說,為什麼你的程式不會受到干擾,而像是一直只有這個程式自己占有處理器的呢?這個就要講到計算機暫存器的概念,計算機一般除了一些通用的暫存器外,都有幾個比較關鍵的暫存器,乙個是pc(program counter)程式計數器(儲存的是當前程式所執行到的程式指令在記憶體中所在的位址,計算機就是依照pc程式計數器所儲存的位址來找到指令來執行的),另乙個是sp(stack pointer)指標(計算機cpu中有乙個硬體棧的機制,跟平時軟體所學的棧有所區別,軟體的是通過軟體實現的後入先出的棧資料結構,硬體棧也是後入先出,是硬體實現的,這個sp就是指向硬體棧頂的指標),還有乙個是儲存程式執行狀態的程式狀態暫存器(那麼程式有什麼狀態呢?程式在彙編級的**裡就會有狀態,比如乙個操作用了幾條彙編指令來完成,比如說做加法操作a+b,彙編的實現可能是先把記憶體中的a載入到乙個暫存器中,再把b載入到另乙個暫存器中,再把兩個暫存器的值相加,若數值比較大,就會把狀態暫存器裡相對應的標誌位置1,否則置0,下面的程式就可以判斷狀態寄存中的標誌位,然後再根據結果的不同跳轉到相對應的程式,當然這樣的標誌位還有很多。),中斷發生時,會把一些通用暫存器,pc,還有狀態暫存器等壓入硬體棧結構中(此過程中sp是變化的,因為有資料入棧了),中斷服務程式執行完後,最後會執行一條中斷返回指令ret這條指令會使之前被入棧的寄存數值覆蓋當前暫存器的數值,執行這條指令前,sp指標恢復到原來的數值,(當然你可能會問如果不是原來的數值怎麼辦,但從寫中斷服務程式的角度來說,這個是由寫程式的人來保證的,你對程式的執行有絕對的控制權,你也得靠自己來保證程式的安全執行,如果不能保證恢復到原來的數值,cpu從sp指標那裡恢復程式的狀態就會出錯,當然也有可能沒有出錯,這種情況就是,恭喜你!你就是在實現作業系統的任務切換了,這個下面說),再從這個硬體棧結構裡,把程式原來的狀態,出棧覆蓋當前的計算機狀態,計算機就恢復到原來執行程程式時的狀態了。只要保證程式的狀態被正確地恢復,程式就可以被任意地中斷,只要被中斷的時間短(cpu的處理速度很多,這個實際是已經符合的了),程式就感覺是自己獨佔cpu的。

而作業系統的實現任務切換的時候,是利用了中斷機制的,在記憶體中為不同的任務劃分不同的記憶體空間,這個記憶體空間裡有任務的棧區,可以在需要任務切換前模仿中斷機制把程式的狀態相關的暫存器壓入這個棧區,然後再把sp指標指向另乙個任務的棧區(這個棧區里存有該任務的狀態相關暫存器)執行中斷返回指令,該任務的「狀態」就會被恢復到計算機,就像該任務被中斷後恢復一樣。該任務執行到需要被切換的時候,又會把自己的「狀態」壓入棧,然後sp指標賦予目標任務的棧區位址,然後執行中斷返回指令,就又恢復到目標任務裡去執行了。當然這裡只講了重點的部分,任務切換還有很多變種,但核心的就是這個了,很多細節的,比如說從**找到目標任務的棧區位址等就不多討論了,太多了,作業系統還有很多知識的。嗯,任務切換也沒什麼,就是這樣。

講了這麼多,還是感覺很多東西都只講了一點,比如說中斷沒有講很多,硬體也比較少說到,彙編也只講了一點,但都是挑重點來講,應該都大概說明白了吧。

多工作業系統的任務切換

在學習os時,對於多工作業系統的任務切換,一直不能理解 控制權是怎麼麼回到排程程式上的?記得在描述任務切換時,一般都是這麼描述的 在每乙個時鐘滴答,都將檢查當前程序是否是乙個運 行超過100毫秒的使用者程序。如果是,則呼叫排程程式來檢視是否有另乙個使用者程序在等待cpu,我這裡舉個例子 我用 寫了乙...

作業系統是怎麼啟動的?

當我們按下電腦電源鍵,十幾秒後我們就看到了作業系統的登入介面。這裡我們通過各種問題來反向梳理一下作業系統啟動過程。這種情況可能是作業系統本身的檔案或驅動損壞導致,比如你刪除了作業系統目錄下的一些系統檔案。如果使用安全模式,說不定還能進入系統,然後排查到底是什麼原因,實在不行就重灌了。這種情況可能是作...

多工作業系統

單使用者單任務作業系統是指一台計算機同時只能有乙個使用者在使用,該使用者一次只能提交乙個作業,乙個使用者獨自享用系統的全部硬體和軟體資源。多使用者與多工作業系統是指一台計算機可以同時有多個使用者同時使用,並且同時可以執行由多個使用者提交的多個任務。windows多工處理採用的是虛擬機器技術,為每乙個...