第三天 程序(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種不同的狀態:
那這麼多的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):
在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)。