作業系統學習(二)—— 程式

weixin_33912246發表於2017-07-11

第二部分 程式概念

引入程式的概念

一個作業系統必然是CPU和I/O裝置協同工作的一個過程,如下圖:

6274961-67a0f3fb5e26a3e3.png
CPU和I/O工作示意圖.png

圖上表明,當I/O閒置時,CPU高速工作,而當I/O變為高電平啟動時,CPU先等待然後等I/O裝置啟動後,CPU繼續完成其他的工作。這一定程度上造成CPU的使用效率達不到100%。

最理想的多工模型

6274961-019ddc015d00d371.png
示意圖.png

一個理想情況:

現在記憶體裡有兩個程式A和B。由電平上看,A,B程式也是一會執行CPU指令,一會執行I/O指令。但如果搭配得當,使得A程式執行CPU指令時,B程式執行I/O指令,協同搭配,就可以提高CPU的使用效率,使得其不再等待。

程式

程式概念

An operating system executes(執行) a variety of programs:

  • Batch system - jobs
  • Time-shared systems - user programs or tasks

為什麼不能把程式稱之為程式

  • different data with same program
  • different program with same data
    上面兩種實際上都是兩個程式。

程式定義

Process - a program in execution;process execution must progress in sequential fashion

程式有三個維度的要素:

1.是正在執行的程式
2.程式執行的程式正在處理資料
3.程式的狀態。靜止的程式是不執行的程式,但它不是一個程式。

程式狀態遷移例項:

6274961-c9d16d5c6e393ad7.png
程式狀態遷移例項.png
  • 有五個基本狀態:new,ready(一切準備就緒,只要CPU給指令就可以執行),waiting(程式還未準備好),running,terminated(程式結束執行).

PCB(程式控制塊)

每一個程式都有一個PCB,是在記憶體裡面駐留的一對一的,反映相應程式資訊。

程式通常與下列資訊關聯:

  • Process state
  • Process number,程式號,必須嚴格控制每個程式號不同,是一個正整數。
  • Program counter(計算機中提供要從儲存器中取出的下一個指令地址的暫存器)
  • CPU registers
  • CPU scheduling information
  • Memory-management information
  • Accounting information
  • I/O status information
  • THAT SPECIFIC TO THE PROCESS(不會放到程式中去)

程式管理:

總的來講,一個程式由一個PCB塊來控制。而程式主要有三個狀態:就緒狀態,等待狀態和執行狀態。三種狀態分別拉成連結串列中佇列的形式,裡面分別有head指標和tail指標。
我們可以把他們看成就緒佇列,等待佇列和執行佇列。

6274961-f3d747f23f114c85.png
Paste_Image.png
  • 就緒的程式全部放入一個佇列中。這樣的好處是當我要執行就緒程式時我只需要關注這個佇列裡的程式就可以了,其他的程式可以一概不管。
  • 執行佇列。假設只有單核CPU的狀態下,則只有一個程式或沒有(CPU空閒)在執行。
  • 等待佇列。比較直觀的設計是,在等待同一個資源程式的時候,這些程式組成一個佇列。如圖tape,disk,terminal三種不同資源組成三個佇列。

思考:作業系統的管理實際就是把PCB從一個佇列放入另外一個佇列(遷移)。相當於是管理不同的程式佇列。

程式排程佇列,動態反應作業系統全貌
  • Job queue — 等待進入計算機系統的待處理任務
  • Ready queue — 駐留記憶體,準備就緒,等待CPU
  • Device queues — 等待I/O裝置的程式佇列
程式是如何在佇列中遷移的
6274961-eac38414aa03004c.png
Paste_Image.png
  • 這個圖強調Ready queue,當程式拿到CPU後,程式離開Ready queue,進入執行佇列。執行程式不可能一直佔用CPU,因為程式本身除了要執行,還需要執行I/O操作。當執行I/O操作時,它需要被轉移到其他的I/O請求的佇列裡去,從而與外部裝置進行連線(如第二行),當做完I/O操作以後,繼續進入ready queue。
  • time slice expired為時間片,它可以強制剝奪程式的CPU使用權(時間片用完)。但之後由於它擁有資源,所以還會立馬轉入ready queue等待下一次獲取CPU。
  • 第四行則為一個程式建立了一個子程式。等子程式做完以後,才可以喚醒程式。它有一個等待狀態。它等待的資源不是I/O資源,而是等待子程式結束。
  • 第五行為程式需要等待一箇中斷訊號產生。中斷訊號發生,則可以進入ready queue。

程式上下文切換(Context Switch)

  • CPU任何時候只能為一個程式服務
  • 當CPU轉向為另一個程式服務時,由於CPU內部資源(內部暫存器)有限,它必須儲存原有(轉換前)程式的狀態,裝入待服務(轉換後)程式的狀態,也即“程式上下文切換”
  • “狀態”指暫存器、標誌位、堆疊等當前值。
  • 上下文切換時間是一種額外開銷(overhead),因為期間CPU不做對使用者程式直接有益的事。
  • 上下文切換時間決定於CPU硬體支援力度。

程式操作

程式建立

  • 父程式建立若干子程式,後者再建立其子程式,以此類推,構成了反映“傳承”關係的一顆程式樹。程式的執行實際上就是程式樹的執行。
  • 子程式的資源分配型別
    1.子程式共享父程式的所有資源(UNIX)
    2.子程式共享父程式的部分資源
    3.子程式不從父程式共享資源,重新獨立申請
  • 執行程式碼的執行順序
    1.父程式和子程式併發執行
    2.父程式在子程式執行期間等待,待子程式執行完畢後才恢復執行餘下程式碼

建立程式分三步:
1.申請PCB空間,分配一個指向PCB的指標。
2.申請一個唯一的PID號即程式號。
3.對PCB空間每一個單元賦值。

以UNIX為例進行程式建立

地址空間中的image
  • 子程式Duplicate父程式的image。
    解釋一下Duplicate:建立一個與原來程式幾乎完全相同的程式,也就是兩個程式可以做完全相同的事,但如果初始引數或者傳入的變數不同,兩個程式也可以做不同的事。
    也即Linux中的fork()函式。
  • UNIX的程式建立中,fork系統首先先建立一個新的(子)程式,fork之後,exec系統呼叫裝入一個新程式。
6274961-dc59d80f83870a15.png
UNIX環境裡建立子程式.png
  • 父程式fork()一個子程式,子程式繼承了父程式所有的資源。
  • 但往往子程式不想要父程式的資源,所以呼叫system call函式exec()裝進自己新的程式。
  • 當子程式傳送了exit(),即中止訊號返回給父程式,父程式結束wait狀態,進入就緒佇列。

一個具體程式碼:

6274961-01d9b1cd8a6735d5.png
作業系統程式碼.png
  • 程式碼首先定義Pid型別,此時只有一個程式,定義了一個Pid的區域性變數。
  • 呼叫fork()建立子程式。按照Linux的做法,子程式完全繼承父程式的一切。子程式和父程式唯一不同的是PID號,同時兩個程式相互獨立,子程式獨立執行execlp()。
  • fork()在返回過程中,父程式返回值是一個非0正整數,而這個正整數為子程式的PID號。而子程式的返回值為0,如果出現錯誤,fork返回一個負值。
  • Pid_t pid在子程式不執行。因為父程式已經定義過PID號,子程式無需重新定義。
  • 最後一個else父程式呼叫wait之後會一直阻塞,等待子程式結束,父程式wait一旦返回則表示子程式所有資源已經被回收。

程式終止

程式終止語義之一:

子程式執行完最後一條指令後,要求作業系統將自己彈出(exit)。語義動作含:

  • 子程式傳遞資料給父程式(通過父程式的wait操作)。
  • 子程式的資源被作業系統收回。

程式終止語義之二:

父程式終止子程式的執行。有很多原因,一般情況下是子程式沒有執行完畢就被終止了。
問題:如果父程式終止了,它的子程式怎麼辦?
結論:有些作業系統把這些子程式也全部終止(All children terminated - cascading)。

程式間合作

  • 獨立程式不會影響其它程式的執行,也不被影響。
  • 合作程式影響其它程式,或者受其影響。
  • 程式間合作是必須的。如共享資訊,加速執行任務,模組化,方便呼叫等。

經典案例:生產者-消費者問題

  • 生產者程式“生產”出資訊,儲存在緩衝區,供消費者程式“消費”。即生產者消費者共享緩衝區。
6274961-354095293aef6336.png
Paste_Image.png

我們討論bounded buffer情況,即緩衝區數量有限的情況。此時考慮:

  • 如果緩衝區為空,那麼消費者無法消費,無法從緩衝區取東西。必須等待。
  • 如果緩衝區滿了,那麼生產者無法生產。生產的東西放不進緩衝區。

故兩者需要相互關聯。

Interprocess Communication(IPC)

程式間通訊IPC,提供一套程式通訊、程式同步的機制。
訊息系統 — 程式間相互通訊的途徑,不需要有共享變數的介入。

IPC機制有2個最基本的程式操作:

  • send(message)
  • receive(message)

變種:

  • send(P,message)— 直接發給程式P
  • receive(Q,message)— 直接接受來自程式Q的訊息。

變種:Indirect Communication

  • send(A,message),A是郵件伺服器。
  • receive (A,message)。

★★同步通訊VS非同步通訊

同步通訊:

  • 傳送操作send:傳送程式等待,直至接受程式確認收到訊息。
  • 接受操作receive:接受程式等待,直至有個訊息到達。

非同步通訊:

  • 傳送操作send:傳送程式發出訊息後立即返回,該幹什麼幹什麼,不理會訊息是否送達。
  • 接受操作receive:接受程式執行一次接受動作,要麼收到一條有效資訊,要麼收到空訊息。

舉例:TCP/IP

  • TCP一個資料包傳送以後必須等待接受程式確認收到訊息,因此它較為可靠。
  • IP包發出去後,立即返回。因此其通訊效能好,速度快。

程式之間相互通訊表明這些程式為協同程式

相關文章