作業系統 – Process

最後更新於 2021 年 4 月 15 日

在不同系統環境下的行程名詞:

  • 整批(Batch)系統環境,行程稱為工作(jobs)
  • 分時系統(Time Sharing System)環境,行程稱為使用者程式(user progams)任務(tasks)
  • 在多數情況,工作與行程是同義詞,但行程(process)已較為人接受

Program vs Process

  • Program被動存在硬碟中(等待執行),儲存在disk裡的binary file。
  • Process主動儲存在硬碟裡,Process即為正在執行中的Program。也是OS分配資源對象單位。

當可執行檔案載入記憶體時,程式(Program)變成行程(Process)。

一個程式可能有數個行程:

  • 考慮幾個使用者執行相同的程式
  • 一個使用者可能執行許多份網頁瀏覽程式

以下為Process的重要觀念:

  1. Process是電腦中已執行Program的實體。
  2. 每一個Process是互相獨立的。
  3. Process 本身不是基本執行單位,而是 Thread (執行緒)的容器。
  4. Process 需要一些資源才能完成工作,如 CPU、記憶體、檔案以及I/O裝置。
  5. 多工系統中,可以同時執行數個Process ,然而一個 CPU 一次只能執行一個 Process (因此才有現在的多核處理器,∵不同的thread可以交給不同的核心來執行),而 Process 的運行量總量不會少於 CPU 的總量,又Process 會佔用記憶體,因此如何排程、如何有效管理記憶體則是 OS 所關注的事。

執行緒(Thread)

也稱 lightweight process。上面有提到,Process 是 Thread 的容器,在同一個 Process 中會有很多個 Thread ,每一個 Thread 負責某一項功能。

每個Proecss有多個程式計數器(PC):

  • 多個位置可以同時執行
    • 多執行續的控制 -> threads

在電腦的資源監視器中可以找到每個程式使用的執行緒數量:

image 11 作業系統 – Process

Thread的觀念:

  1. CPU 的最小單位。
  2. 同一個 Process 會同時存在多個 Thread。
  3. Thread 間可以共用某塊 Memory,同一個 Process 底下的 Thread 共享 Code Section、Date Section (用 global 去溝通)、OS Source (open files, signals),不同的Process 則否。
  4. 每個 Thread 的Thread ID、Program Counter、Register set( ∵執行 instruction 時位置可能不同 )、Stack( function 和 local 等等 temporary data) 獨立
  5. 在多執行緒中(Multithreading),兩個執行緒若同時存取或改變全域變數(Global Variable),則可能發生同步(Synchronization)問題。若執行緒之間互搶資源,則可能產生死結(Deadlock),同樣的,如何避免或預防上述兩種情況的發生,依然是 OS 所關注並改善的。
kWmdE4K 作業系統 – Process

Process的記憶體結構

一個Process包含:

  • Text section (程式區間):程式碼、PC、暫存器…。
  • Data section (資料區間):包含全局變數。
  • Stack (堆疊):包含暫用資料 eg.函數的參數、返回位址,以及區域變數。會稱作 stack 是由於其配置遵守 LIFO。
  • Heap (堆積):包含了執行期間動態配置的記憶體。一般由程式設計師分配釋放,執行時才會知道配置大小,如 malloc/new 和 free/delete。(其資料結構不是 DS 中的 heap 而是 link-list)
Process Concept - HackMD

以一個C語言程序為例:

image 9 作業系統 – Process

行程狀態

當行程執行時,它會改變狀態,分為以下五種:

  • New 新增:新增行程
  • Running 執行:指令正在執行
  • Waiting 等待:等待某件事件的發生
  • Ready 就緒:準備好被分配至CPU執行
  • Terminated 結束:該行程完成執行

行程狀態圖 (Process STD) 描述 Process 由開始到結束的生命週期。

Process STD 是針對 CPU 這項資源,且Data 都在 Memory 中。

image 10 作業系統 – Process

New → Ready:Job scheduler 允許工作進入系統,建立 process,配置記憶體空間載入程式碼。

Ready → Running:Process 競爭 CPU,在 ready queue 裡面等待被 OS 排程、選中。CPU scheduler (選中) dispatch ( load 到 CPU ) 接著進入 Running ( 這裡會進行 context switch )。

Running → Terminated:程式完成工作而正常結束,或是溢位、除零等異常終止 (Abort)。

Running → Ready:發生短暫中止時,直接回到 Ready。eg.被高優先權的 process 插隊、CPU Time Quantum 超過、中斷發生 等。

Running → Waiting:發生較長時間中止時,會將Process Block住 eg. Wait for I/O complete、Wait for resource available。如果進了 wait state,會被安排在 waiting queue,並且不會佔用 CPU 資源。

Waiting → Ready:當造成 waiting 的事件已經完成,如 I/O complete 等,Process 會回到 ready 狀態。

行程控制段(Process Control Block)

每一個Process在OS中都對應著一個 PCB 或稱任務控制表(Task Control Block)用來記錄Process的資訊。PCB放在 Memory 裡面,而且是 Kernel Space 的,因為只有 OS 需要知道。

PCB記載所代表的process之相關資訊,包括:

  • 行程狀態:new、ready、running、waiting、halted..等。
  • 程式計數器(PC):指向該process下一個要接著執行的指令位址
  • CPU暫存器:所有以process為中心的暫存器內容。包括累加器、索引暫存器、堆疊指標以及一般用途暫存器等,還有一些狀況代碼。當中斷發生時,這些狀態資訊以及程式執行計數器必須儲存起來,以便稍後利用這些儲存的資訊,使程式能於中斷之後順利地繼續進行。
  • CPU排班法則相關資訊:包括process的優先順序(Priority)、排班佇列(Scheduling queue)的指標以及其他的排班參數。
  • 記憶體管理資訊:為了要做Protection,如:基底暫存器、限制暫存器。只有 process 在執行時才會把這兩個值從 memory load 進 CPU 的 register。
  • 會計資訊:用掉多少CPU的時間、使用CPU的最大時間量
  • I/O狀態資訊:尚未完成的I/O Request還有哪些、還在I/O Queue中排隊之Process的編號
image 12 作業系統 – Process
image 13 作業系統 – Process
CPU在process中來回運轉狀況

內容轉換(Context Switch)

當CPU的使用權由一個行程切換給另一個行程時,必須將舊Process的相關資訊(e.g., PCB內容) 儲存起來,並且把新Process之相關資訊載入到系統中,這個工作就稱做內容轉換(Context switch)。

  • Context Switching所花費的時間對系統而言是額外的浪費。
    • 因為在這個過程中,系統所做的事是不具有生産力的工作。
    • 所以,如果Context Switching 的次數過多,它將會成為系統效能的瓶頸。
  • 而Context Switching 的速度取決於硬體支援的程度。
    • 如:Memory 速度, Register數量, 特殊機器指令存在與否。
image 14 作業系統 – Process

如何降低Context Switching的負擔?

主要就是減少Memory Access動作,有幾種方法可以降低內容轉換的負擔:

提供多套 Register Sets

因為Context Switching的速度取決的硬體支援程度,所以增加Register數量,盡可能讓每個Process分到一個resgister。若Register數量夠多,則毎個Process皆可有自已的Register Set ,所以當需要做Context Switching時:

  • O.S.只要的指標到新Process即可。

舊Process的PCB不用Swap Out到Memory,也不用從Memory中Swap In新Process的PCB。所以不會用到 Memory 進行存取動作 。

  • 優點:速度快 ;
  • 缺點:不適用於Register 數量少的系統 。

實際上不成立,因為 CPU 內部 Register 個數是固定的。

改用 Thread 代替 Process

目前的主流方法,使用Thread (Light-weighted Process) 以降低Context Switching負擔。

毎個Process都有其私有的資訊 (PCB) ,這些私有資訊會佔用 Register。

然而Threads之間彼此可以共享 Memory Space (如:Code Section, Data Section, Open File…),私有的資訊不多。所以從事Context Switching時不須大量的 Memory Access,可降低Context Switch 負擔。

Register 有限時

當Register有限時,視哪一種類的Process切換較頻繁。

System Processes與User Processes都有自已的 Register Set。∴當User Process與System Process之間的Context Switching時,O.S.只要改變Register Set的指標即可。

image 15 作業系統 – Process

Register不多,但也不會太少,在乎於調適其用途。

行程排班(Process Scheduling)

  • Multi-programming: 讓CPU的使用率最大化。
  • Time sharing: 為了使CPU在行程間快速地轉換。
  • 行程排班程式(Process scheduler) 從可用行程中選擇下一個在CPU執行的行程。

排班佇列(Scheduling Queues)

  • 工作佇列 ( Job Queue ) – 決定哪些program能夠到 New State並決定何時load到Memory成為Process [ Program → Process ]
  • 就緒佇列 ( Ready Queue ) – 位於主記憶體中且就緒等待使用CPU ( Ready State )
  • 裝置佇列 ( Device Queues ) – 正在等待某I/O裝置的行程集合 ( Waiting State )

Process在不同的佇列間遷移。

image 16 作業系統 – Process

Process Scheduling Diagram

image 17 作業系統 – Process

Process 可以描述成:

  • I/O-bound process – 花在I/O的時間比計算的時間還多
  • CPU-bound process – 花更多時間執行計算

Scheduler

  • Long-Term Scheduler (或稱 Job Scheduler) [New → Ready]

從 Job Queue中挑選合適的 jobs 並將之 load 到 Memory 內準備執行。

  1. 可調控 Degree of Multiprogramming (待執行的Process數,太高會產生 Trashing問題;太低則會造成 CPU idle)。
  2. 可調合 CPU-Bound 與 I/O Bound processes 之混合比例。
  3. 執行頻率最低, ∵ 若沒有新的 Process 被 create 則 Long-term Scheduler 就沒事情可做。
  4. 速度可能較慢,因為不常被呼喚。
  5. 通常適用於 Batch System (大型機房),但不適用於 Time-Sharing System。
  • Short-Term Scheduler (或稱 CPU Scheduler) [Ready Running]

從 Ready Queue 中挑選高優先權的Process 並分派CPU。

  1. 執行頻率最高。
  2. 必須快速,因為非常頻繁地被呼喚。
  3. 注重公平性,有優先權或RR的排程演算法,確保每個Process等待時間盡量能夠一樣
  4. 無法調控 Degree of Multiprogramming。
  5. 無法調控 CPU-Bound 與 I/O Bound processes 之混合比例。
  6. 所有 system 皆有此 scheduler,有時候,是系統唯一的排班程式。
  7. Batch System 和 Time-Sharing 均需要。
  • Medium-Term Scheduler [virtual memory]

當記憶體空間不足,且又有其它 Process 欲進入記憶體執行,此時該 Scheduler 必須挑選某些 Process 將其 Swap out到磁碟中以空出記憶體空間,待記憶體有足夠空間再將其 swap in 記憶體中繼續執行。

  1. 可以利用此方式控制 Degree of Multiprogramming,把 memory 讓給等著被CPU執行的 Process 使用。
  2. 可調合 I/O Bound 與 CPU Bound 的比例。
  3. 通常用在 Time Sharing System。
image 18 作業系統 – Process

行程間通訊(Inter-Process Communication)

指至少兩個行程執行緒間傳送資料或訊號的一些技術或方法。

常見的 IPC 分為以下兩種:

Shared Memory

各個Process利用對共享的記憶體 (共享變數;Shared Variables)的存取,藉由其值的變化來達到彼此溝通、交換資訊的目的。

  • 提供對共享記憶體之互斥存取控制的責任是由Programmer來負責;而O.S.只負責提供Share Memory Space,不提供任何額外的資源。
  • Programmer 負擔重;OS 負擔輕。

Message Passing

兩個Process要溝通,需遵守下列歩驟:

  1. 建立 Communication Link
  2. 互傳訊息 (Message)
  3. 傳輸完畢,release link
  • Link 是專屬於溝通雙方,不會被其他人共用。
  • OS 會提供如 Link Management 等額外支援。
  • Programmer 負擔輕,OS 負擔重。
  • 此法需要 OS 提供額外支援 (e.g., Link Management, Link Capacity 管控,Message Lost處理…etc)。
  • 有直接與間接兩種連繫方式。
Process Communication | Lisa Tech Blog
0 0 評分數
Article Rating
訂閱
通知
guest

0 Comments
在線反饋
查看所有評論