iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 3
0
自我挑戰組

OS作業系統學習系列 第 3

第三天 程序(process)概念--上

第三天 程序(process)概念--上

在作業系統中,會需要執行很多的程式(program),在不同的作業系統中,對程式的名稱也會不同,像是在batch system 是稱為jobs,但是在time_shared system中稱為task或是user program。

那process是什麼呢?其實process就是一個正在執行的program。而組成一個process要有5個條件:

1.program code(程式碼)
2.process counter(擺放下一個要執行程式的地址)、processor register
3.stack(儲存暫時性資料)
4.data section(儲存跟程式、process相關的資料)
5.heap(執行時產生的動態的記憶體空間)

說到現在,來區分一下program跟process:
Program是被動的,被存在硬碟中等待執行; process是主動的,一個已經在執行的program。
要產生process能透過很多方法,像是點擊滑鼠。而一個程式能夠產生多個process,例如:有很多的使用者都在執行同一段程式。

Process存在著很5種不同的狀態:

  1. New:產生一個process時
  2. Running:正在執行時
  3. Waiting:等待事情的發生
  4. Ready:準備繼續進行
  5. Terminated:執行結束時
    以下的圖說明5種狀況的關係
    https://ithelp.ithome.com.tw/upload/images/20181018/20112132KBjrIfyEp6.png

那這麼多的process要由誰來管理呢?其實每個process自己都有一個PCB(process control box)來存process的資料(process state、program counter、CPU registers、CPU scheduling information、accounting information跟I/O status information),而作業系統會運用PCB來運用process。

CPU在執行時,只能運用一個process,那如果我們需要不同的process支援時,就必須進行環境交換。
以下是兩個process進行環境交換的流程(以p0跟p1代表兩個process):

  1. p0執行到一半被interrupt或是system call
  2. p0把現在的狀態存到PCB0
  3. PCB0的內容轉換到PCB1
  4. 將PCB1載下來
  5. p1開始執行

在process中有一個東西,能讓作業系統來決定現在能進行什麼是,那個東西就是thread(執行緒),這部份我們會在之後做詳細說明。

那現在我們來說說process的排程(scheduling),為什麼要有process scheduling呢?因為我們為了要讓CPU能發揮最大的效益,這時就需要process scheduler來決定現在是哪個process能使用CPU。

而process scheduler分成兩種,short-term scheduler跟long-term scheduler。short-term scheduler又稱做CPU scheduler,負責決定記憶體內的哪個process能使用 CPU,但他需要在極短的時間內決定; long-term scheduler又稱為job scheduler,負責決定哪些process能進到記憶體內準備執行,控制記憶體內process的數量,相對來說他就有較長的時間可以進行決定。而作業系統中一定會存在著short-term scheduler。但其實還有第三種scheduler,叫做medium-term scheduler。他屬於動態的處理,把執行到一半的process先搬下記憶體,後來有時間實在把他搬回來繼續處理。

上面講完程序的排程,接下來說說process怎麼運作吧!
在系統的機制下,process一定會有開始跟結束,當然還有一些較細節的部份,像是溝通、合作之類的,現在我們先來說說process的創建(creation)。

要產生一個新的process,是由parent process去產生一個children process組成一個樹狀圖。在產生時,children的記憶體空間會複製的跟parent一樣,但不管是parent還是children各自都有一個屬於自己的id。

而父子之間的資源分享有三種選擇:全部共享、部分共享、互不分享(記憶體獨立,此種模式較少)。父子在執行時,也有兩種選擇:同時執行(邏輯上)或是等小孩結束後再執行父母的。接下來來說明process的結束(termination)。

Process的結束分為兩種,結束小孩還是結束父母。結束小孩比較簡單,只需要用exit() system call小孩就能被結束掉,但結束前要先把狀態資料傳回給父母,而小孩的資源會被作業系統給回收。

如果要結束父母,就要用abort() system call來處理。為什麼會用abort()而不是exit()呢?因為有些系統並不允許只有小孩存在,但父母已經被結束掉了!或是有些小孩用的資源已經不需用了,這時父母就會幫忙結束掉。

作業系統在父母要結束時,會啟用一種結束模式叫做cascading termination(瀑布式結束),從小到大一個個結束。這時父母就會用到wait() system call等小孩全部結束才結束,如果忘記用的話,小孩可能會成為殭屍(zombie)或是孤兒(orphan)。


上一篇
第二天 作業系統結構
下一篇
第四天 程序(process)概念--中
系列文
OS作業系統學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言