1. 程式人生 > >第一次作業:基於Linux操作系統的進程模型分析

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

一起 正常 std 文本 pid 存儲 time 計算機 關於

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操作系統的進程模型分析