作業系統學習之程序管理

2021-08-31 21:41:53 字數 2960 閱讀 4901

系統執行過程中cpu的活動稱為程序。(作業/使用者程式/任務)

程序是執行中的程式。

關於程式和程序:程式是被動實體,是靜態的,固定的;

程序是活動實體,隨著程式計數器的變化指示下一條執行的指令,所以程序是動態的,是不斷變化的。

程序狀態可分為五種:

這裡有乙個程序狀態轉換圖

通過這個圖可以看到程序不可以由ready狀態直接變為waiting狀態,也不可以直接由waiting直接變為running,需要通過一些中間態來完成。

這部分的演算法會在第五章的複習部落格中提到,這裡只進行大概的介紹。

當我們使用多道程式設計的時候,會使得cpu利用率達到最大化,當使用分時系統的時候是為了快速切換程序方便,為了達到這些目的需要對程序進行排程。

這裡大概可以分為兩類,一種是就緒佇列(ready queue)和等待佇列(waiting queue)。

針對程序的五種狀態,new狀態肯定是不需要佇列儲存了,running狀態下每次只會存在乙個程序,也就是每次只有乙個程序正在執行,所以所有的等待被執行的ready狀態下的程序就需要進入乙個佇列儲存,這裡引入了就緒佇列。terminated狀態同樣不需要佇列,而根據狀態轉換圖可以知道,由running回到ready需要經過waiting,waiting狀態是在等待i/o 或者特定事件完成,這個地方是需要乙個佇列將waiting狀態下的程序儲存下來,事件完成則出隊的,這裡引入等待佇列,也叫阻塞佇列。

針對進入cpu開始執行的程序,有幾種情況:發生i/o事件導致程序進入i/o 等待佇列,i/o完成後進入就緒佇列;建立乙個新的子程序,父程序進入等待佇列,子程序結束返回父程序,父程序在就緒佇列中等待被選擇;產生中斷,導致當前程序換出cpu,在pcb中儲存當前程序的上下文資訊,進入就緒佇列,中斷處理程式執行完成後從就緒佇列中選擇程序繼續執行。

具體細節會在後面的第五章複習部落格詳細寫明。

根據前面提到的,cpu中進行程序排程時需要將正在執行中的程序資訊儲存到pcb,然後換入將要在cpu中執行的程序,恢復這個程序pcb中儲存的資訊,這兩個過程在書中稱為「狀態儲存」和「狀態恢復」。

上下文切換是一種額外開銷,因為在這段時間內系統不能做什麼有用的事情。

這種切換活動的速度依賴於記憶體讀取速度、暫存器的數量、特殊指令等,一般是毫秒級的時間。

新程序是通過原來存在的程序建立的,建立其他程序的程序稱為父程序,建立出的新程序稱為子程序。

根據前面提到的,每個程序都有乙個特定的唯一的識別符號pid來識別程序,當系統中存在多個程序在佇列中時,這種識別符號的存在就顯得特別必要。

當父程序建立子程序時,執行起來有兩種可能:

以unix系統為例,建立程序函式fork(),新程序通過複製原來程序的位址空間形成,父程序和子程序都執行fork之後的指令,但是對於父子程序,子程序的返回值是0,父程序則是非0的。

程序執行完最後的指令後會呼叫exit()函式,刪除自身終止程序,釋放所有資源。

程序通過適當的系統呼叫可以終止其他程序,一般來說是要父程序可以終止其子程序的。

父程序終止子程序的原因:

兩種程序間通訊機制:共享記憶體模型、訊息傳遞模型。

共享記憶體模型:建立起一塊供協作程序共享的記憶體區域,程序通過訪問或修改這塊記憶體區域中的內容完成通訊。

訊息傳遞模型:通過模型示意圖看到是在核心中有一塊區域供程序讀或寫資訊,完成通訊功能。

對比:傳遞較少數量的資料使用訊息傳遞模型更好一點;共享記憶體的通訊速度比訊息傳遞模型更快,因為訊息傳遞中是使用核心的,會涉及很多系統呼叫的操作,這些是額外開銷,時間會相對於進行記憶體訪問的共享記憶體模型更長一點。

如果程序要使用一塊共享記憶體的話,要將這塊共享記憶體加入到自己的位址空間中,同時共同訪問和修改的資料形式和位置是由程序本身來決定的而不是作業系統。

生產者-消費者問題:生產者程序產生資訊以供消費者程序使用,使用乙個緩衝來被生產者填充,被消費者使用,這個緩衝存在於兩個程序共同使用的共享記憶體區域內,兩者的記憶體必須是同步的,防止生產者向已經滿的緩衝中新增資訊或者消費者從空的緩衝中取資訊。

緩衝分類:無限緩衝,不會出現上述生產者新增資訊結果緩衝已滿的情況;有限緩衝,可能會導致前面提到的情況,緩衝為空時消費者要等待,等待生產者向這個區域加入資訊,緩衝滿的時候生產者要等待,等待消費者從緩衝中取出資訊。

**例項:

針對這兩個程式來看,允許緩衝的最大項數是buffer_size-1,當時考慮了在生產者程序中把填充進去的語句和判斷語句順序換一下,這樣確實是buffer中可以填滿,但是取的時候也是只能取buffer_size-1這麼多,從利用率上來說是一樣的。

「訊息傳遞提供一種機制以允許程序不必通過共享位址空間來實現通訊和同步」

訊息傳遞工具至少要可以傳送訊息和接收訊息,訊息可以是定長的或者是變長的,這是兩種實現方法。

直接通訊:程序僅需知道相互通訊的識別符號,乙個線路只與兩個程序有關,每對程序之間也只有一條線路。

send(p, message): 傳送訊息到程序 p 。

receive(id, message): 接收來自任何程序的訊息,變數 id 設定成與其通訊的程序名稱。

間接通訊:設定乙個郵箱來儲存訊息,乙個程序可能通過許多不同的郵箱與其他郵箱通訊,但兩個程序僅在其共享至少乙個郵箱時可以通訊。

send(a, message): 傳送乙個訊息到郵箱 a 。

receive(a, message): 接收來自郵箱 a 的訊息。

同步非同步和阻塞非阻塞:這個地方沒有理解得太好,查了一些資料比較喜歡這個作者的解釋:

緩衝:通訊程序交換的資訊都駐留在臨時佇列中。佇列的三種方法:①零容量,不能有任何處於等待的訊息,阻塞傳送,直到消費者接收到訊息。②有限容量:最多n個訊息等待,佇列滿時阻塞傳送。③無限容量:不存在阻塞傳送的情況。

這部分課上沒怎麼講,但是聽學姐說有的公司面試會問,就大概寫一下吧。

socket定義為通訊的端點,由ip位址和埠號組成。

作業系統學習筆記 程序通訊

程序通訊是指程序之間的資訊交換。交換的資訊量包括乙個狀態或數值 訊號量,低階通訊 或上千個位元組 高階通訊 低階通訊 程序的互斥和同步 交換的資訊量 即訊號量 較少 高階通訊 指使用者可直接利用os提供的一組通訊命令 不需要自己編寫命令 高效地傳送大量資料的一種通訊方式。對使用者透明。使用者不需要考...

作業系統學習筆記(三) 程序

一 程序環境 c程式儲存空間布局 正文段 唯讀 存放cpu執行的機器指令,可共享 資料段 也叫初始化資料段。包含程式中需要明確賦值的變數,如 int max 99 bss段 也叫未初始化的資料段,在程式開始執行前,核心將此段中資料初始化為0或空指標,如long sum 100 棧 存放自動變數 即區...

作業系統學習

看了幾天的資料,今天終於有時間把測試環境搭建起來。模擬機bochs nasm ultraiso 模擬機bochs的設定不難,在網上搜了些資料和參考了bochs的說明檔案,基本上就可以組建並執行起來。在網上下了個dos的映象,執行bochs從a盤啟動,之後把硬碟分割槽格式化,乙個最基礎的測試環境就完成...