1. 程式人生 > 其它 >【作業系統學習】程序管理(六)

【作業系統學習】程序管理(六)

1. 程序基本概念

程序:一個具有一定獨立功能的程式在一個數據集合上的一次動態執行過程。

程序的組成:

  • 程式的程式碼
  • 程式處理的資料
  • 程式計數器的值,指示下一條將執行的指令
  • 一組通用暫存器的當前值,堆、棧
  • 一組系統資源(如開啟一個檔案)

程序包含了正在執行的一個程式的所有狀態資訊。

程序與程式的聯絡:

  • 程式是產生程序的基礎
  • 程式的每次執行構成不同的程序
  • 程序是程式功能的體現
  • 通過多次執行,一個程式可對應多個程序;通過呼叫關係,一個程序可包含多個程式。

程序與程式的區別:

  • 程序是動態的,程式是靜態的:程式是有序程式碼的集合;程序是程式的執行,程序有核心態/使用者態
  • 程序是暫時的,程式是永久的:程序是一個狀態變化的過程,程式可長久儲存
  • 程序與程式的組成不同:程序的組成包括程式、資料和程序控制塊(即程序狀態資訊)

程序的特點:

  • 動態性:可動態地建立、結束狀態。
  • 併發性:程序可以被獨立呼叫佔用處理執行。
  • 獨立性:不同程序的工作不相互影響。
  • 制約性:因訪問共享資料/資源或程序間同步而產生制約。

2. 程序控制塊(PCB)

程序控制塊:作業系統管理控制程序執行所用的資訊集合。

作業系統用PCB來描述程序的基本情況以及執行變化的過程,PCB是程序存在的唯一標誌。

PCB含有三大類資訊:

  • 程序標識資訊。如本程序的標識,本程序的產生者標識(父程序標識),使用者標識。
  • 處理及狀態資訊儲存區。儲存程序的執行現場資訊:
    • 使用者可見暫存器。使用者可以使用的資料,地址等暫存器
    • 控制和狀態暫存器。如程式計數器(PC),程式狀態字(PSW)
    • 棧指標。過程呼叫/系統呼叫/中斷處理和返回時需要用到它。
  • 程序控制資訊
    • 呼叫和狀態資訊
    • 程序間通訊資訊
    • 儲存管理資訊
    • 程序所用資源
    • 有關資料結構連線資訊

PCB的組織方式

  • 連結串列:同一狀態的程序其PCB成一連結串列,多個狀態對應多個不同的連結串列
  • 索引表:同一狀態的程序歸入一個index表(由index指向PCB),多個狀態對應多個不同的index表。

3. 程序的生命週期

程序的生命週期:

  • 程序建立
    • 系統初始化時
    • 使用者請求建立一個新程序
    • 正在執行的程序執行了建立程序的系統呼叫
  • 程序執行
    • 核心選擇了一個就緒的程序,讓它佔用處理機並執行
      • 為何選擇?
      • 如何選擇?
  • 程序等待
    • 在以下情況,程序等待
      • 請求並等待系統服務,無法馬上完成
      • 啟動某種操作,無法馬上完成
      • 需要的資料沒有到達
    • 程序只能自己阻塞自己,因為只有程序自身才知道何時需要等待某件事件的發生。
  • 程序喚醒
    • 喚醒程序的原因
      • 被阻塞的程序需要的資源可被滿足
      • 被阻塞程序等待的事件到達
      • 將該程序的PCB插入就緒佇列
    • 程序只能被別的程序或者作業系統喚醒。
  • 程序結束
    • 以下四種情況,程序結束
      • 正常退出(自願)
      • 錯誤退出(自願)
      • 致命錯誤(強制性的)
      • 被其他程序所殺(強制性的)

程序狀態變化圖:

4. 程序掛起

  • 概念
    • 程序在掛起狀態,意味著程序沒有佔用記憶體空間。處在掛起狀態的程序映像在磁碟上。
  • 掛起狀態
    • 阻塞掛起狀態(Blocked-suspend): 程序在外存並等待某事件的出現
    • 就緒掛起狀態(Ready-suspend):程序在外存,但只要進入記憶體,即可執行
  • 相關狀態轉換
    • 阻塞到阻塞掛起:
      • 沒有程序處於就緒狀態或就緒程序需要更多記憶體資源時,會進行這種轉換,以提交新程序或執行的就緒程序。
    • 就緒到就緒掛起:
      • 當有高優先順序阻塞(系統認為很快就緒的)程序和低優先就緒程序時,系統會掛起低優先順序就緒程序。
    • 執行到就緒掛起:
      • 對搶先分時系統,當有高優先順序阻塞掛起程序因事件出現而進入就緒掛起,系統可能會把執行程序轉到就緒掛起狀態。
    • 在外存的狀態轉換:阻塞掛起到就緒掛起
      • 當有阻塞掛起程序因相關事件出現時,系統會把阻塞掛起程序轉換為就緒掛起程序。

解卦/啟用(Activate)

  • 概念
    • 把一個程序從外存轉到記憶體
  • 狀態轉換
    • 就緒掛起到就緒
      • 沒有就緒程序或掛起就緒程序優先順序高於就緒程序時,會進行這種轉換。
    • 阻塞掛起到阻塞
      • 當一個程序釋放足夠記憶體時,系統會把一個高優先順序阻塞掛起,程序轉換為阻塞程序。

狀態佇列:

  • 由作業系統來維護一組佇列,用來表示系統當中所有程序的當前狀態
  • 不同的狀態分別用不同的佇列來表示(就緒佇列、各種型別的阻塞佇列)
  • 每個程序的PCB都根據它的狀態加入到對應的佇列種,當一個程序的狀態發生變化時,它的PCB從一個狀態佇列種脫離處理,加入到另外一個佇列。

5. 執行緒

執行緒是程序當中的一條執行流程。

從資源組合的角度來看,程序把一組相關的資源組合起來,構成了一個資源平臺,包括地址空間(程式碼段、資料段),開啟的檔案等各種資源。

從執行的角度來看,程序是程式碼在這個資源上的一條執行流程。

執行緒的優點:

  • 一個程序中可以同時存在多個執行緒
  • 各個執行緒之間可以併發地執行
  • 各個執行緒之間可以共享地址空間和檔案等資源

執行緒的缺點:

  • 一個執行緒崩潰,會導致其所屬程序的所有執行緒崩潰

執行緒與程序的比較

  • 程序是資源分配單位,執行緒是CPU排程單位
  • 程序擁有一個完整的資源平臺,而執行緒只獨享必不可少的資源,如暫存器和棧
  • 執行緒同樣具有就緒、阻塞和執行三種基本狀態,同樣具有狀態之間的轉換關係
  • 執行緒能減少併發執行的時間和空間開銷
    • 執行緒建立時間比程序短
    • 執行緒終止時間比程序短
    • 同一程序內的執行緒切換時間比程序短
    • 由於同一程序的各執行緒間共享記憶體和檔案資源,可直接進行不通過核心的通訊

執行緒的實現

  • 使用者執行緒:在使用者空間實現
  • 核心執行緒:在核心中實現
  • 輕量級程序:在核心中實現,支援使用者執行緒

使用者執行緒

  • 在使用者空間實現的執行緒機制,它不依賴於作業系統的核心,由一組使用者級的執行緒庫函式來完成執行緒的管理,包括程序的建立、終止、同步和排程等。
    • 由於使用者執行緒的維護由相應程序來完成(通過執行緒庫函式),不需要作業系統核心瞭解使用者執行緒的存在,可用於不支援執行緒技術的多程序作業系統。
    • 每個程序都需要它自己私有的執行緒控制塊(TCB)列表,用來追蹤記錄它的各個執行緒的狀態資訊(PC、棧指標、暫存器),TCB由執行緒庫函式來維護。
    • 使用者執行緒的切換也是由執行緒庫函式來完成,無需使用者態/核心態切換,所以速度特別快。
    • 執行每個程序擁有自定義的執行緒排程演算法。
  • 使用者執行緒的缺點
    • 阻塞性的系統呼叫如何實現?如果一個執行緒發起系統呼叫而阻塞,則整個程序在等待。
    • 當一個執行緒開始執行後,除非它主動地交出CPU的使用權,否則它所在的程序當中的其他執行緒將無法執行。
    • 由於時間片分配給程序,故與其它程序比,在多執行緒執行時,每個執行緒得到的時間片較少,執行會較慢。

核心執行緒

是指在作業系統核心當中實現的一種執行緒機制,由作業系統的核心來完成執行緒的建立、終止和管理。

  • 在支援核心執行緒的作業系統中,由核心來維護程序和執行緒的上下文資訊(PCB和TCB)。
  • 執行緒的建立、終止和切換都是通過系統呼叫/核心函式來進行,由核心來完成,因此係統開銷大。
  • 在一個程序當中,如果某個核心執行緒發起系統呼叫而被阻塞,並不會影響其他核心程序的執行。

輕量級程序

上下文切換

  • 停止當前執行程序(從執行狀態改變成其他狀態)並且排程其他程序(轉變成執行狀態)
    • 必須在切換之前儲存許多部分的程序上下文
    • 必須能夠在之後恢復它們,所以程序不能顯示它曾經被暫停過
    • 必須快速(上下文轉換是非常頻繁的)
  • 需要儲存什麼上下文
    • 暫存器(PC、SP、…),CPU狀態
    • 一些時候可能會費時,所以我們應該儘可能避免