第一次作業:基於Linux操作系統的進程模型分析
1.什麽是進程
·進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。它不只是程序的代碼,還包括當前的活動,通過程序計數器的值和處理寄存器的內容來示。
·進程的概念主要有兩點:第一,進程是一個實體。每一個進程都有它自己的地址空間,一般情況下,包擴文本區域(text region)、數據區域(data region)和堆棧(stack region)。文本區域存儲處理器執行的代碼;數據區域存儲變量和進程執行期間使用的動態分配的內存;堆棧區域存儲著活動過程調用的指令和本地變量。第二,進程是一個“執行中的程序”。程序是一個沒有生命的實體,只有處理器賦予程序生命時(操作系統執行之),它才能成為一個活動的實體,我們稱其為進程。
進程的特征:
·動態性:進程的實質是程序在多道程序系統中的一次執行過程,進程是動態產生,動態消亡的。 ·並發性:任何進程都可以同其他進程一起並發執行 ·獨立性:進程是一個能獨立運行的基本單位,同時也是系統分配資源和調度的獨立單位; ·異步性:由於進程間的相互制約,使進程具有執行的間斷性,即進程按各自獨立的、不可預知的速度向前推進2.進程的創建與終止
以下幾類操作可以創建和終止線程。
A 創建進程
(1) 系統初始化會創建新的進程
(2) 當一個正在運行的進程中,若執行了創建進程的系統調用,那麽也會創建新的進程
(3) 用戶發出請求,創建一個進程
(4) 初始化一個批處理作業時,也會創建新的線程
從本質上來說在技術上只有一種創建新進程的方法,即在一個已經存在的進程中,通過系統調用來創建一個新的進程。
Linux中可以使用fork函數來創建新進程。如下列代碼所示:
#include<stdio.h> #include<sys/types.h> #include<unistd.h> int main(){ pid_t ret = fork(); printf("hello proc:%d,ret = %d\n",getpid(),ret); return 0; }
B 進程終止
(1) 正常退出
(2)錯誤退出
(3) 致命錯誤
(4) 被其他進程殺死
3.進程的狀態的轉換
運行中的進程可能具有以下三種基本狀態。 (1)就緒狀態(Ready):進程已獲得除處理器外的所需資源,等待分配處理器資源;只要分配了處理器進程就可執行。就緒進程可以按多個優先級來劃分隊列。例如,當一個進程由於時間片用完而進入就緒狀態時,排入低優先級隊列;當進程由I/O操作完成而進入就緒狀態時,排入高優先級隊列。 (2)運行狀態(Running):進程占用處理器資源;處於此狀態的進程的數目小於等於處理器的數目。在沒有其他進程可以執行時(如所有進程都在阻塞狀態),通常會自動執行系統的空閑進程。 (3)阻塞狀態(Blocked):由於進程等待某種條件(如I/O操作或進程同步),在條件滿足之前無法繼續執行。該事件發生前即使把處理器資源分配給該進程,也無法運行。
4.進程的調度算法
時間片輪轉調度算法:
每個進程被分配一個時間段,稱作它的時間片,即該進程允許運行的時間。如果在時間片結束時進程還在運行,則CPU將被剝奪並分配給另一個進程。如果進程在時間片結束前阻塞或結束,則CPU當即進行切換。調度程序所要做的就是維護一張就緒進程列表,當進程用完它的時間片後,它被移到隊列的末尾。
·該算法采取了非常公平的方式,即讓就緒隊列上的每個進程每次僅運行一個時間片。如果就緒隊列上有N個進程,則每個進程每次大約都可獲得1/N的處理機時間。
·時間片的大小對於系統性能有很大的影響。若選擇很小的時間片,將有利於短作業,但意味著會頻繁地執行進程調度和進程上下文的切換,這無疑會增加系統的開銷。反之,若時間片選擇得太長,且為使每個進程都能在一個時間片內完成,時間輪轉調度算法便退化為先來先服務算法,無法滿足短作業和交互式用戶的需求。
算法運行流程圖:
程序控制塊的定義:
typedef struct node { char name[20]; /*進程的名字*/ int round; /*分配CPU的時間片*/ int cputime; /*CPU執行時間*/ int needtime; /*進程執行所需要的時間*/ char state; /*進程的狀態,W--就緒態,R--執行態,F--完成態*/ int count; /*記錄執行的次數*/ struct node *next; /*鏈表指針*/ }PCB;
void RoundRun() /*時間片輪轉調度算法*/ { int flag = 1; GetFirst(); while(run != NULL) { while(flag) { run->count++; run->cputime++; run->needtime--; if(run->needtime == 0) { run ->state = ‘F‘; InsertFinish(run); flag = 0; } else if(run->count == run->round) { run->state = ‘W‘; run->count = 0; InsertTime(run); flag = 0; } } flag = 1; GetFirst(); } }
對於源碼的分析:
首先設置一個標誌位為1,從就緒隊列獲取第一個節點,當獲取的節點不為空和標誌位為1時,這個進程所執行的次數加一,CPU執行的時間也進行自加,進程所需的時間自減,然後進行判斷,當進程所需的時間為0也就是進程執行完畢時,把進程的狀態設置為完成態,然後將進程插入到完成隊列尾部,否則當時間片用完時,進程的狀態設置為就緒態,計數器清零,將進程插入到就緒隊列尾部,將標誌位置為0,重新開始從就緒隊列獲取第一個節點。直到所有進程執行結束。
5.自己對操作系統模型的看法
操作系統是用戶和計算機的接口,同時也是計算機硬件和其他軟件的接口。是直接運行在機器上的最基本的系統軟件,其他任何軟件都必須在操作系統的支持下才能運行。所以操作系統對於計算機和學習計算機的我們是非常重要的。其中,進程又是操作系統最基本和核心的東西,我們需要了解與掌握進程,這對於我們以後更深入的學習操作體統也有很重要的意義。
第一次作業:基於Linux操作系統的進程模型分析