操作系統原理之進程和線程學習

操作系統原理之進程和線程學習

 

  • 操作系統

操作系統是控制應用程序執行的程序,並充當應用程序和計算機硬件之間的接口。

操作系統爲程序員屏蔽了硬件細節,併爲程序員提供方便的接口.

1. 程序開發:提供各種各樣的工具和服務,編輯器和調試器

2. 程序運行:處理指令數據載入到內存、初始化IO設備和文件、準備相關資源等調度問題

3. IO設備訪問:每個IO設備都有特有的指令集或控制信號,操作系統屏蔽了硬件細節

4. 文件訪問控制:屏蔽了IO設備(磁盤)的特性以及存儲介質中文件數據的結構

5. 系統訪問:授權訪問

6. 錯誤檢測和響應:計算機系統運行時內部或外部硬件發生的錯誤,提供響應(終止、重操、報告錯誤)

7. 記賬:操作系統收集各種資源使用的統計信息

 


 


 

  • 進程
  1. 操作系統必須交替執行多個進程,在合理的響應時間範圍內使處理器的利用率達到最大。
  2. 操作系統按照程序分配的優先級給進程分配資源,避免死鎖。
  3. 操作系統支持進程間的通信和用戶創建進程

操作系統:也是由處理器執行的一個程序,與普通的計算機軟件以同樣的方式運行。經常釋放控制權,並且依賴於處理器恢復控制器。

 定義:正在計算機上執行的程序實例,能分配給處理器並由處理器執行的實體(程序代碼+代碼相關數據集)

進程控制塊:標識符(進程唯一標識符)、狀態、優先級、程序計數器(程序即將被執行的下一條指令地址)、內存指針(程序和相關數據的指針、和其他進程共享內存塊的指針)、上下文數據(寄存器中的數據)、I/O狀態信息(顯式的I/O請求、分配給進程的I/O設備)和記賬信息

  • 進程的創建
  1. 新的批處理作業-響應作業提交時
  2. 交互登錄-終端用戶登錄到系統
  3. 操作系統因爲提供一項服務而創建-如用戶請求打印文件
  4. 由現有的進程派生
  • 進程的終止
  1. 正常完成
  2. 超過時限-進程運行時間超過規定時限(總運行時間、執行時間、交互進程從上一次用戶輸入到當前時刻的時間總量)
  3. 無可用內存-系統無法滿足進程所需的內存空間
  4. 越界-進程視圖訪問不允許訪問的內存單元
  5. 保護錯誤-進程試圖使用不允許使用的或不正確使用資源或文件
  6. 算術錯誤-進程視圖進行被禁止的計算
  7. 時間超出-進程等待某一事件發生的時間超過了規定的最大值
  8. I/O失敗-在輸入或輸出期間發生錯誤,如找不到文件或無效操作
  9. 無效指令-進程試圖執行一個不存在的指令
  10. 特權指令-進程試圖使用爲操作系統保留的指令
  11. 數據誤用-錯誤類型或未初始化的一塊數據
  12. 操作員或操作系統干涉-操作員或操作系統終止進程
  13. 父進程終止-用於派生進程情況下
  14. 父進程請求-在進程派生情況下,父進程具有終止任何後代進程的權力

進程的五種狀態:運行態、就緒態、阻塞/等待態、新建態和退出態。  掛起狀態:當內存內的所有進程都處於阻塞態,操作系統可以把其中的一個進程置於掛起態,並轉移到磁盤,內存中釋放的空間可被調入另一個進程使用。

 

操作系統在管理和控制進程時,必須知道進程的位置,再知道管理時必需的進程屬性(進程ID、進程狀態)。

進程位置--進程映像:用戶數據、用戶程序、系統棧和進程控制塊。(進程的物理意義:進程是由一個或一組可執行的程序,同時包含相關聯的變量或常量的數據單元)

進程屬性:標識符(進程ID、用戶ID、父進程標識符)、處理器狀態信息(用戶可見可訪問的寄存器、控制狀態寄存器、後進先出的系統棧的棧指針)、進程控制信息(調度狀態信息、數據結構、進程間通信、進程特權、存儲管理和資源使用情況所有權)

 

進程的創建:分配新進程唯一進程標識符,給進程映像內所有元素分配空間,初始化進程控制塊,正確連接到鏈表中去(就緒或就緒掛起鏈表),創建或擴充其他數據結構(記賬文件進行編制賬單或性能評估)

進程切換(問題1:進程切換和模式切換的區別

  • 進程切換髮生情況
    • 時鐘中斷,操作系統確定當前正在運行的進程的執行時間已經超過了最大允許時間,即要切換至就緒態
    • IO中斷,等待IO活動事件的進程在IO活動發生時,操作系統需要把相應的阻塞態或阻塞掛起態切換至就緒或就緒掛起態
    • 內存失效,當某一個進程中處理器需要將外存的內存塊調入內存中,發出IO請求時該內存將切換至阻塞態,;當調入內存中後,該進程切換至就緒態
    • 陷阱,如果操作系統發生錯誤或異常條件導致致命問題,則該進程切換至退出態;不致命根據特殊情況特殊處理
  • 進程切換步驟
    • 保存處理器上細紋,PSW和寄存器
    • 更新當前處於運行態進程的進程控制塊,狀態切換以及更新記賬信息和離開願意
    • 將進程控制塊移入相應隊列
    • 選擇另一個進程執行
    • 更新選擇後的進程控制塊,運行狀態更改及更新相關信息
    • 更新內存管理的數據結構
    • 恢復處理器被選擇的進程前一次切換出運行狀態時保存下來的上下文環境

進程間的資源競爭

  1. 互斥:兩個或多個進程需要訪問一個不可共享的資源,其中一個進程在運行時分配到資源並擁有完全的控制權 
  2. 死鎖:兩個進程P1和P2以及兩個資源R1和R2,,兩個進程都需要訪問這兩個資源,但P1佔用了R1,P2佔用了R2,由於兩進程一直等待另一個資源釋放從而發生死鎖
  3. 飢餓:P1、P2、P3三個進程同時共享一個資源R,P1訪問完資源後P3訪問資源,P3訪問後P1繼續訪問,使得P2進程一直處於無限期拒絕訪問資源狀態下

加鎖

 


  • 線程-進程中分派單元(程序片段)

多線程是指操作系統在單個進程內支持多個併發執行路徑的能力

線程包含:

  1. 線程執行狀態
  2. 未運行時保存的線程上下文
  3. 執行棧
  4. 線程內局部變量的靜態存儲空間
  5. 與進程內其他線程共享的對進程內存和資源的訪問

線程相對於進程突出的性能:

  1. 創建快
  2. 終止速度快
  3. 切換速度快
  4. 提高了執行程序間的通信效率,進程間通信介入內核,而線程之間可以直接共享內存和文件

所有線程管理數據結構都在一個進程的用戶地址空間,線程的切換無需內核態特權,節省了用戶態與內核態的模式來回切換開銷,但是存在一個問題,某一線程的阻塞將導致整個進程的阻塞

 

用戶級線程:在一個純粹的用戶級線程軟件中,有關線程管理的所有工作都由應用程序完成,內核意識不到線程的存在。

通過線程庫管理用戶級線程,包含創建和銷燬線程代碼、在線程間傳遞消息和數據的代碼、調度線程執行的代碼以及保存和恢復線程上下文的代碼。

優點:1、由於所有線程管理數據結構都在一個進程的用戶地址空間,線程的切換不需要內核參與,節省了兩次模式轉換的開銷;2、調度由應用程序完成;3、用戶級線程可以在任何操作系統上執行而不涉及修改底層內核

缺點:1、當用戶線程執行一個系統調用時,這個線程的堵塞將造成整個進程的堵塞;2、一個多線程應用程序不能利用多處理技術

內核級線程:有關線程管理的工作都在內核完成。

優點:1、內核可以同時將進程中的多個線程調度到多個處理器;2、進程中的一個線程被堵塞,內核可以調度同一個進程的另一個線程

缺點:1、一個線程傳送至同一個進程中的線程需要內核的狀態切換

結合以上兩者的組合方法:在組合的系統中線程的創建完全在用戶空間完成,線程的調度和同步也是在應用程序中進行。一個應用程序中的多個用戶級線程被映射到一些內核級線程上。


 

  • Windows線程和SMP(對稱多處理)管理

 

併發性:

進程間的資源競爭:當併發進程競爭使用同一資源時,它們之間會發生衝突。

競爭進程的三個控制問題:

  1. 互斥:多個進程訪問同一個資源,一次只允許一個進程在臨界區(正在代碼區執行的程序),其他進程不得穿插。
  2. 死鎖:兩個進程都可以2個資源進行佔用,但實際上兩個進程分別使用一個資源後,等待另一個資源被釋放,從而造成兩個進程的無限等待循環。
  3. 飢餓:三個進程將使用1個資源,實際上卻只有其中2個進程在輪番使用,另一個進程無限期地被拒絕訪問資源。

二元信號量、計數信號量

管程:程序設計語言結構,提供了與信號量同樣的功能,易於控制。

管程是由一個或多個過程、一個初始化序列和局部數據組成的軟件模塊

1、局部數據只能被管程的過程訪問,任何外部過程不能夠訪問

2、一個進程通過調用管程的一個過程進入管程

3、在任何時候,只能有一個進程在管程中進行,調用管程的任何其他進程都被阻塞,以等待管程可用

管程提供了互斥機制--管程中的數據變量每次只能被一個進程訪問到,可用把一個共享數據結構,從而對它的保護。

 

死鎖

  1. 互斥
  2. 資源佔有且等待
  3. 不可搶佔已被佔有的資源
  4. 循環等待

死鎖的解決方案

  1. 預防:設計一種系統排出發生死鎖的可能性
    1. 間接的死鎖預防方法:防止前面列出的三個必要條件--1、要求進程一次性請求所有的資源;2、佔用某些資源的一個進程若想請求其他資源需釋放最初佔有的資源
    2. 直接的死鎖預防方法:防止循環等待---定義資源的線性順序
  2. 避免:判斷資源請求會不會導致死鎖來決定的
    1. 對進程和資源的需求和總量進行矩陣化,如果一個進程的請求會導致死鎖,則不啓動此進程
    2. 如果一個進程增加的資源請求會導致死鎖,則不允許此分配
  3. 檢測:檢測當前是否存在死鎖,一旦檢測到便恢復
    1. 取消所有死鎖進程
    2. 把每個死鎖進程回滾到前面定義的檢查點,重啓進程
    3. 連續取消死鎖進程直到不出現死鎖
    4. 連續搶佔資源直到不存在死鎖

一種綜合的死鎖策略:把資源分爲幾組不同的資源類,使用資源線性排序策略,使用最合適的資源分配算法。


 


 

內存管理

內存被劃分成兩個部分:一部分供OS使用,一部分供當前正在執行的程序使用。

在多道程序設計系統中,必須在內存中進一步細分出“用戶”部分,以滿足多個進程的要求,其中細分的任務由OS完成,被稱之爲內存管理。

內存管理的需求:重定位、保護、共享、邏輯組織、物理組織

  邏輯地址:與當前數據在內存中的物理分配地址無關的訪問地址

  相對地址:邏輯地址的一個特例,相對於某些已知點(程序的開始處)的存儲單元

  物理地址(絕對地址):數據在內存中的實際位置

固定分區->分頁 內部碎片

動態分區->分段 外部碎片

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章