操作系統複習筆記——第三章 進程

   進程可看做是正在執行的程序。進程需要一定的資源(如CPU時間、內存、文件和I/O設備)來完成其任務。這些資源在創建進程或執行進程時被分配。

      進程是大多數系統中的工作單元。這樣的系統由一組進程組成:操作系統進程執行系統代碼,用戶進程執行用戶代碼。所有這些進程可以併發執行。

       雖然從傳統意義上講,進程運行時只包含一個控制線程,但目前大多數現代操作系統支持多線程進程。

       操作系統負責進程和線程管理,包括用戶進程與系統進程的創建與刪除,進程調度,提供進程同步機制、進程通信機制與進程死鎖處理機制。

 

  • 3.1進程概念
    • 程序的執行過程
    • 3.1.1 進程
      • 進程不只是程序代碼,程序代碼有時稱爲文本段(代碼段)。進程還包括當前活動,通過程序計數器的值和處理器寄存器的內容來表示。另外,進程通常還包括堆棧段(包括臨時數據,如函數參數、返回地址和局部變量)和數據段(包括全局變量)。進程還可能包括堆(heap),是在進程運行期間動態分配的內存。
      • 這裏強調:程序本身不是進程;程序只是被動實體,如存儲在磁盤上包含一系列指令的文件內容(常被稱爲可執行文件),而進程是活動實體,它有一個程序計數器用來表示下一個要執行的命令和相關資源集合。當一個可執行文件被裝入內存時,一個程序才能成爲進程。
    • 3.1.2 進程狀態
      • 新的(new)進程正在創建
      • 運行(running)指令正在被執行
      • 等待(waiting)進程等待某個事件的發生(如I/O完成或收到信號)
      • 就緒(ready)進程等待分配處理器
      • 終止(terminated)進程完成執行。
    • 3.1.3 進程控制塊
      • 每個進程在操作系統中用進程控制塊PCB process control block 也稱爲任務控制塊。
    • ·進程狀態:狀態可包括新的、就緒、運行、等待、停止等。

      ·程序計數器:計數器表示進程要執行的下個指令的地址。

      ·CPU寄存器:根據計算機體系結構的不同,寄存器的數量和類型也不同。它們包括累加器、索引寄存器、堆棧指針、通用寄存器和其他條件碼信息寄存器。與程序計數器一起,這些狀態信息在出現中斷時也需要保存,以便進程以後能正確地繼續執行。

      ·CPU調度信息:這類信息包括進程優先級、調度隊刻的指針和其他調度參數

    • ·內存管理信息:根據操作系統所使用的內存系統,這類信息包括基址和界限寄存器的值、頁表或段表(見第8章)。

      ·記賬信息:這類信息包括CPU時間、實際使用時間、時間界限、記賬數據、作業或進程數量等。

      ·I/O狀態信息:這類信息包括分配給進程的I/O設備列表、打開的文件列表等。簡而言之,PCB簡單地作爲這些信息的倉庫,這些信息在進程與進程之間是不同的。

    • 線程:   一個進程中至少包含一個線程,同時,多個線程共享該進程的所有資源。進程,完成對資源分配。
  • 3.2 進程調度
    • 多道程序設計的目的是無論何時都有進程在運行,從而使CPU利用率達到最大化。分時系統的目的是在進程之間快速切換CPU以便用戶在程序運行時能與其進行交互。
    • 爲了達到此目的,進程調度選擇一個可用的進程(可能從多個可用進程集合中選擇)到CPU上執行。單處理器系統從不會有超過一個進程在運行。如果有多個進程,那麼餘下的則需要等待CPU空閒並重新調度。
    • 3.2.1 調度隊列
      • 進程進入系統時,會被加到作業隊列中,該隊列包括系統中的所有進程。駐留在內存中就緒的、等待運行的進程保存在就緒隊列中。該隊列通常用鏈表來實現,其頭節點指向鏈表的第一個和最後一個PCB塊的指針。每個PCB包括一個指向就緒隊列的下一個PCB的指針域。
      • 等待特定I/O設備的進程列表稱爲設備隊列,每個設備都有自己的設備隊列。
      • 討論進程調度的常用方法是隊列圖
      • 新進程開始處於就緒隊列。它在就緒隊列中等待直到被選中執行或被派遣。當進程分配到CPU並執行時,可能發生下面幾種事件中的一種:
        • 進程可能發出一個IVO請求,並被放到I/O隊列中。

進程可能創建一個新的子進程,並等待其結束。

進程可能會由於中斷而強制釋放CPU,並被放回到就緒隊列中。

  • 作業:用戶提交給操作系統做的    長期調度
  • 內存調度:中期調度    短期調度=CPU調度=進程調度(ms級)系統調度
  • 3.2.2 調度程序
    • 進程會在各種調度隊列之間遷移,爲了調度,操作系統必須按某種方式從這些隊列中選擇進程。進程的選擇是由相應的調度程序(scheduler)來執行的。
    • 通常批處理系統中,進程更多的是被提交,而不是馬上執行。這些進程通常放到磁盤的緩衝池裏,以便以後執行。長期調度程序作業調度程序從該池中選擇進程,並裝入內存以準備執行。短期調度程序cpu調度程序從準備執行的進程中選擇進程,併爲之分配cpu。
    • 這兩個調度程序的主要差別是調度的頻率。
    • 短期調度程序通常100ms至少執行一次,由於每次執行之間的時間較短,短期調度程序必須要快。
    • 長期調度程序執行的並不頻繁,所以長期調度程序能使用更多的時間來選擇執行進程。長期調度程序控制多道程序設計的程度(內存中進程的數量)。長期調度程序必須仔細選擇執行進程。
    • 通常,絕大多數進程可分爲:I/O爲主或CPU爲主。       I/O爲主的進程通常執行I/O方面比執行計算花費更多時間,另一方面,CPU爲主的進程很少產生I/O請求。爲使系統達到平衡和更好的性能,長期調度程序應當選擇一個合理的包含IO爲主的和cpu爲主的組合進程,以充分使用設備和短期調度程序。
    • 有的操作系統如分時系統,可能引入另外的中期調度程序。核心思想:將進程從內存(或從CPU競爭)中移出,從而降低躲到程序設計的程度,之後,進程能被重新調入內存,並從中斷處繼續執行,這種方案稱爲交換。
  • 3.2.3 上下文交換
    • 通過執行一個狀態保存來保存CPU當前狀態(不管他是內核模式還是用戶模式),之後執行一個狀態恢復重新開始運行。
    • 將CPU切換到另一進程需要保存當前狀態並恢復另一進程狀態,這一任務叫做上下文切換(context switch)。當發生上下文切換時,內核會將舊進程的狀態保存在PCB中,然後裝入經調度要執行的並已保存的新進程的上下文。
    • 將CPU切換到另一進程需要保存當前狀態並恢復另一進程狀態,這叫做上下文切換(context switch)。當發生上下文切換時,內核會將舊進程的狀態保存在PCB中,然後裝入經調度要執行的並已保存的新進程的上下文。
    • 上下文切換時間是額外開銷,因爲切換時系統並不能做什麼有用的工作。其切換時間與硬件支持密切相關。
  • 3.3 進程操作
    • 3.3.1 進程創建
      • 進程在執行時,能通過創建進程系統調用創建多個新進程。創建進程爲父進程,而新進程叫做子進程。新進程都可再創建其他進程,從而形成了進程樹。
      • 大多數操作系統根據一個唯一的進程標識符(process indentifier, pid) 來識別進程,pid通常是一個整數值。
      • 通常,進程需要一定的資源(如CPU時間、內存、文件、I/O設備)來完成其任務。在一個進程創建子進程時,子進程可能從操作系統那裏直接獲得資源,也可能只從其父進程那裏獲得資源。父進程可能必須在其子進程之間分配資源或共享資源(如內存或文件)。

限制子進程只能使用父進程的資源能防止創建過多的進程帶來的系統超載。

當進程創建新進程時,有兩種執行可能

①父進程與子進程併發執行。

②父進程等待,直到某個或全部子進程執行完。

新進程的地址空間也有兩種可能:

①子進程是父進程的複製品(具有與父進程相同的程序和數據)。

②子進程裝入另一個新程序。

UNIX操作系統中,每個進程用唯一整數標識符來標識,通過fork()系統調用,可創建新進程,新進程通過複製原來進程的地址空間而成。這種機制允許父子進程之間方便的通信。

 

兩個進程都繼續執行位於系統調用fork()之後的指令,但是對於子進程,系統調用fork的返回值爲0:而對於父進程,返回值爲子進程的進程標識符(非零)

 

通常系統調用fork後,一個進程會使用系統調用exec(),以用新程序來取代進程的內存空間。系統調用exec()將二進制文件裝入內存(消除了原來包含系統調用exec()的程序內存映射),並開始執行。採用這種方式,兩個進程都能相互通信,並按各自的方式執行。

 

父進程能創建更多的子進程,或者如果在子進程運行時沒有什麼可做,那麼它採用系統調用wait()把自己移出就緒隊列來等待子進程的終止。

  • 3.3.2 進程終止
    • 進程執行完最後的語句並使用系統調用exit()請求系統刪除自身時,進程終止。此時,進程可以返回狀態值(通常爲整數)到父進程(通過系統調用wait())。所有進程資源(物理和虛擬內存、打開文件和I/O緩衝)會被操作系統釋放。
    • 在其他情況下也會出現終止。
    • 進程通過適當的系統調用能終止另外一個進程。通常,只有被終止進程的父進程才能執行這一系統調用。否則,用戶可以任意的終止彼此的作業。

 

父進程終止其子進程的原因有很多,如:

 

子進程使用了超過它所分配的一些資源。(爲判定是否發生這種情況,要求父進程有一個檢查其子進程狀態的機制)

分配給子進程的任務已經不需要

父進程退出,如果父進程終止,那麼操作系統不允許子進程繼續(有些操作系統,對於這類操作系統這種現象稱爲級聯終止)。

 

UNIX:可以通過系統調用exit()來終止進程,父進程可以通過系統調用wait()以等待子進程的終止。系統調用wait()返回了中止子進程的進程標識符,以使父進程能夠知道哪個子進程終止了。如果父進程終止,那麼其所有子進程會以init進程作爲父進程,因此,子進程仍然有一個父進程來收集狀態和執行統計。

  • 3.4 進程間通信(C)
    • 操作系統內併發執行的進程可以是獨立進程或協作進程。如果一個進程不能影響其他進程或被其他進程所影響,那麼該進程是獨立的。顯然,不與任何其他進程共享數據的進程是獨立的。另一方面,如果系統中一個進程能影響其他進程或被其他進程所影響,那麼該進程是協作的。顯然,與其他進程共享數據的進程爲協作進程。
    • 協作進程需要一種進程間通信機制(interprocess communication,,IPC)來允許進程相互交換數據與信息。進程間通信有兩種基本模式:(1)共享內存,(2)消息傳遞。在共享內存模式中,建立起一塊供協作進程共享的內存區域,進程通過向此共享區域讀或寫入數據來交換信息。在消息傳遞模式中,通過在協作進程間交換消息來實現通信。
    • 消息傳遞對於交換較少數量的數據很有用,因爲不需要避免衝突。
    • 對於計算機間的通信,消息傳遞也比共享內存更易於實現。共享內存允許以最快的速度進行方便的通信,在計算機中它可以達到內存的速度。
    • 共享內存比消息傳遞快,消息傳遞系統通常用系統調用來實現,因此需要更多的內核介入的時間消耗。與此相反,在共享內存系統中,僅在建立共享內存區域時需要系統調用,一旦建立了共享內存,所有的訪問都被處理爲常規的內存訪問,不需要來自內核的幫助。
    • 3.4.1 共享內存系統
      • 無限緩衝和有限緩衝。
    • 3.4.2 消息傳遞系統
      • 進程間的通信可以通過調用原語send0和receive)來進行。這些原語的實現有不同的設計選項。消息傳遞可以是阻塞或非阻塞——也稱爲同步或異步。

阻塞send:發送進程阻塞,直到消息被接收進程或郵箱所接收。

非阻塞send:發送進程發送消息並再繼續操作。

阻塞 receive:接收者阻塞,直到有消息可用。

非阻塞 receive:接收者收到一個有效消息或空消息。

  • 阻塞:  有條件等待    兩個過程,快的等待慢的,(因爲在計算機中不能變快,只能變慢)

 

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