第一次做業:基於Linux操做系統的進程模型分析

1.什麼是進程

·進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操做系統結構的基礎。它不僅是程序的代碼,還包括當前的活動,經過程序計數器的值和處理寄存器的內容來示。node

·進程的概念主要有兩點:第一,進程是一個實體。每個進程都有它本身的地址空間,通常狀況下,包擴文本區域(text region)、數據區域(data region)和堆棧(stack region)。文本區域存儲處理器執行的代碼;數據區域存儲變量和進程執行期間使用的動態分配的內存;堆棧區域存儲着活動過程調用的指令和本地變量。第二,進程是一個「執行中的程序」。程序是一個沒有生命的實體,只有處理器賦予程序生命時(操做系統執行之),它才能成爲一個活動的實體,咱們稱其爲進程。算法

進程的特徵:併發

·動態性:進程的實質是程序在多道程序系統中的一次執行過程,進程是動態產生,動態消亡的。
·併發性:任何進程均可以同其餘進程一塊兒併發執行
·獨立性:進程是一個能獨立運行的基本單位,同時也是系統分配資源和調度的獨立單位;
·異步性:因爲進程間的相互制約,使進程具備執行的間斷性,即進程按各自獨立的、不可預知的速度向前推動

2.進程的建立與終止

如下幾類操做能夠建立和終止線程。異步

A 建立進程

(1) 系統初始化會建立新的進程函數

(2) 當一個正在運行的進程中,若執行了建立進程的系統調用,那麼也會建立新的進程性能

(3) 用戶發出請求,建立一個進程學習

(4) 初始化一個批處理做業時,也會建立新的線程spa

 

從本質上來講在技術上只有一種建立新進程的方法,即在一個已經存在的進程中,經過系統調用來建立一個新的進程。操作系統

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.本身對操做系統模型的見解

操做系統是用戶和計算機的接口,同時也是計算機硬件和其餘軟件的接口。是直接運行在機器上的最基本的系統軟件,其餘任何軟件都必須在操做系統的支持下才能運行。因此操做系統對於計算機和學習計算機的咱們是很是重要的。其中,進程又是操做系統最基本和核心的東西,咱們須要瞭解與掌握進程,這對於咱們之後更深刻的學習操做體統也有很重要的意義。

相關文章
相關標籤/搜索