1. 程式人生 > >十天學會CS之作業系統——程序管理01

十天學會CS之作業系統——程序管理01

程序管理01

程序的概念

程序是計算機中一個非常重要的概念,在整個計算機發展歷史中,作業系統中程式執行機制的演變按順序大致可以分為:

  1. 單道程式:通常是指每一次將一個或者一批程式(一個作業)從磁碟載入進記憶體,CPU必須等待I/O完成後才可以進行執行,CPU利用率低。
  2. 多道程式:講多個作業調入記憶體後自動處理,但是單道程式和多道程式均無互動性,可控性差
  3. 程序:程式+PCB(狀態週期描述)+資料集
  4. 執行緒

單道 --> 多道系統

從單道程式演化為多道程式就是CPU的高速與I/O的低速有著顯著矛盾,因此引入了多道程式作為解決。舉一個例子,在單道程式中,倘若I/O沒有完成,那麼CPU就會一直處於空閒狀態。但是在多道程式中,當某程式在佔用CPU的時候,其餘程式可以開始進行I/O請求,互不干擾,這樣就減少了在I/O中CPU的空閒。當某個程式釋放CPU後,下一程式繼續佔用CPU。

在多道程式中,經常會有這種情況,例如某程式需要監測輸入值,那麼,該程式就會委託I/O系統去取值,那麼在取值完成前,該程式並不需要佔用CPU,那麼程式會由於I/O阻塞主動放棄CPU,並且進入執行佇列尾部,此時CPU會按出佇列的順序依次分配。

多道程式的狀態:

多道程式的排程

多道程式 --> 程序

程序就是在程式中加入一些描述程式狀態的塊(PCB)

從多道程式演化為程序的過程中是通過提高併發性,從而進一步的提高CPU的利用率。事實上也就是在多道程式死板的排程機制中靈活的進行控制程式執行的順序等。實現的功能便是PCB的監控。

程序的狀態:

程序的排程:

程序 --> 執行緒

在程序之下,我們引入了執行緒。在說執行緒之前,我們引入那麼一個問題,假定你製作了一個即時通訊的程式,如果你只是用一個程序去控制程式執行,會發生什麼?事實上這裡發生的事情你有時候可以在一些小廠商做出的低劣遊戲中發現這一問題。我們在有些製作不好、歷史久遠或者程式碼質量差的遊戲中,經常能發現,一旦網絡卡了,整個遊戲甚至都會卡頓甚至無響應,遊戲的渲染也受到了很大的影響。有時候是因為網路一直在嘗試發包導致,但是更多時候是因為程序排程問題。可是為什麼網路是基於外部的,卻可以影響內部的引擎渲染之類的功能呢?原因就是我們之前講過,請求網路是一個明顯的I/O過程,假設網路不好,那麼我們的程式一直處於I/O阻塞的狀態下,從而放棄CPU,那麼我們渲染的程式碼也會遲遲得不到執行。會到我們之前的問題,假設你只是用一個程序去製作了即時通訊軟體,一旦網路丟包之類的網路故障發生時,你的程式很容易卡頓。

說了那麼多,我們應該如何去解決這個問題?很自然的我們會想到使用多程序去製作一個軟體,那麼其中一個程序發生阻塞的時候,我們其餘的程序會繼續佔用CPU,則整體執行並不會受太大影響。但是這種方法需要佔用大量的時空,因為程序的排程是依賴PCB以及PCB的監控程式,程序切換過程中,上下文切換也會導致PCB狀態切換,需要花費大量的時間進行查詢、修改等操作,並且記憶體棧的使用也會過於頻繁導致空間消耗,並且在作業系統中,PCB的數量是有限的,因此使用多程序並不是一個號的方法。

這裡我們就引出多執行緒的方法,程序就成為了執行緒的一個容器,且程序和執行緒可以同時存在,執行緒幾乎不佔用多少空間,整體也比程序小的多,那麼對執行緒的排程開銷就會遠比程序小得多。程序的數量也減少了,那麼整體系統的壓力也小了。

程序和程式的區別

  1. 程式是一段程式碼編譯後的產物,在執行過程中被拷貝至記憶體,通常是靜態不變的,程序在執行過程中是會發生狀態轉變,通常認為是動態的。程序是對程式一次執行的過程。
  2. 程式和程序是多對多關係,例如同時執行兩個一樣的程式和作業系統的GUI繪圖渲染與各個視覺化程式的關係。你可以在工作管理員中發現這些關係

程序的特徵

  1. 併發性:與OS的併發一致
  2. 非同步性:與OS非同步一致
  3. 動態性:程序在執行過程中是會發生狀態轉變,通常認為是動態的。
  4. 結構性:使用了PCB組成
  5. 獨立性:在資源分配過程中,各個程序是獨立分配。例如各個程序在記憶體中的位置都是獨立的。

程序的組成

通常我們只考慮為PCB+程式或PCB+指令段+資料段。這裡涉及到的指令段和資料段是什麼呢?

指令段就是具體的操作邏輯,而資料段就是儲存的具體資料值,他們通常都儲存在棧上。例如有一段程式碼:

public int Add()
{
    return 3+4;
}

這段程式碼在程序中會儲存函式指標,也就是程式的具體記憶體位置;3和4將會作為資料段儲存在獨立的堆疊中,而 ‘+’會儲存在指令段中。

PCB的組成

  1. PID:程序的唯一標識
  2. 狀態:程序五個狀態中的一種
  3. 優先順序:用於控制程序的執行順序

指令段的組成

  1. 執行地址:指程式程式碼在記憶體中的位置
  2. 外存地址:程式在儲存裝置上中的位置
  3. 程式碼段指標:程式指令段在記憶體中的具體位置
  4. 進入記憶體時間:進入時間

資料段組成

  1. 堆疊指標:用於儲存資料的地址
  2. 資料段指標:資料段程式碼的地址

程序的組成

程序執行分析

對於一個程序或程式需要執行,以下三個東西是必不可少的:

  • PCB
  • 記憶體
  • CPU

程序的狀態:

  • 對於新建-->就緒過程,程序會向作業系統申請記憶體和PCB,同時將程序排入佇列使得這個非常的簡單。
  • 就緒-->執行過程,作業系統需要向程序分配CPU資源使得程式運轉。反過來則是因為某些原因使得程序不再佔用CPU,通常是時間片用完。
  • 執行-->阻塞過程,通常是有了一個I/O請求導致了程序的阻塞中斷。
  • 阻塞-->就緒過程是I/O完成後重新喚起程序,使程序重新進入就緒佇列
  • 執行-->完成則是歸還記憶體並刪除PCB。

在狀態轉變的時候,通常就是要實施以下三步:

  • 分配(申請)記憶體或CPU
  • 回收
  • 修改PCB

如果我的文章幫助了你,請給我一個三連和star。

Github

BiliBili主頁

WarrenRyan'sBlog

部落格園