首頁 > 軟體

關於Linux進程管理

2020-06-16 17:08:36

進程的引入

當計算機在引入多道程式時,出現了臨界資源競爭的情況,為了刻畫和解決程式間的這種制約關係,提出了進程的概念,用以改善資源的利用率,提高程式的吞吐量。

過程控制塊PCB

  • linux系統的所有過程控制塊都是通過結構體指標陣列形式的資料結構來表示的(每個PCB塊大約有1kb):
/*全域性變數nr_task動態記錄進程數*/
struct task_sturct *task[NR_TASK]={&init_task};

執行狀態進程的PCB同樣用結構體指標陣列表示:

current_set[];
  • task_struct結構體定義:
struct task_struct{
    ...
    unsigned short uid;
    int pid;
    ...
    volatile long state;
    long prority;
    unsigned long rt_protity;
    long counter;
    unsigned long policy;
    ...
    struct task_struct *next_task, *prev_task;
    struct task_struct *next_run, *prev_run;
    struct task+struct *p_opptr, *pptr, *p_cptr, *pysptr, *p_ptr;
    ...
};

資料成員說明:
uid:使用者標識;
pid:進程標識;
state:進程狀態標識;
1)可執行狀態
2)可中斷阻塞狀態
3)不可中斷阻塞狀態
4)僵死狀態
5)暫停狀態
6)交換狀態
protity:進程優先順序;
counter:優先順序計數器,用於進程輪轉排程演算法;
policy:進程排程策略;
next_task,prev_task:PCB雙向連結串列指標;
p_opptr ...:指明進程家族間的關係,分別為祖父進程,父進程,子進程,以及新老進程指標;

進程屬性

  • 進程ID:PID,進程唯一標志符;
  • 父進程ID:PPID;
  • 啟動進程的使用者ID:UID;
  • 所歸屬的組ID:GID;
  • 進程執行的優先順序;
  • 進程連線終端

優先順序問題

謙讓度:標識進程之間資源競爭能力,高謙讓度的進程,資源競爭能力弱。負值或0表示最高優先順序,對其他進程不謙讓。謙讓度的值一般為:-20~19;當前硬體發展速度非常快,一般我們是不設定進程優先順序的,除非有進程失控而瘋狂的搶佔資源;

在建立進程時,nice可以為進程設定謙讓值,但進程優先順序的值為父進程shell優先順序的值與nice所指定的謙讓度相加的結果。即,利用nice指定的值是一個增量,而不是優先順序的絕對值。

執行 a.out 程式,並為它指定謙讓度增量為5:

    nice -n 5 a.out &

利用renice來更改謙讓度:

    renice 謙讓度 PID

進程排程演算法簡介

程式使用cpu的三種模式:I/O密集型、計算密集型和平衡型。對於I/O密集型程式,響應時間非常重要,響應時間不及時,和可能丟失資料;對於計算密集型程式,cpu的周轉時間非常重要;對於平衡型程式,協調響應和cpu週轉的工作最重要。

進程周轉時間:等待進入記憶體的時間,在就緒佇列中等待的時間,在 CPU中執行的時間和I/O操作的時間的總和。

FCFS演算法

FCFS(frist come first serve),也叫FIFO演算法,先來先執行。短任務執行可能會非常慢,因為前面的進程可能占用很長時間,造成平均響應時間過長。

時間片輪轉演算法

目的是改善短程式響應時間長的問題。方法是週期性的對進程進行切換。該演算法最關鍵的時間片的選擇,時間片過長和FIFO演算法區別不大,時間片過短,進程頻繁切換的開銷大於執行程式的開銷,系統效率降低。

STCF演算法

STCF演算法全稱:short time to complete frist。核心是每個進程都有優先順序,短進程的優先順序要高於長進程的優先順序。STCF演算法分為:非搶占式和搶占式兩類。非搶占式就是讓已經在cpu上執行的程式執行到結束或者阻塞,然後在就緒佇列中選擇執行時間最短的程式來執行。而搶佔式是,每當有新進程進入就緒佇列時,都會去判斷當前執行進程和新進程的執行時間長短,選擇執行時間短的進程執行,及永遠保證cpu執行的是所有進程中執行時間最短的進程。該演算法有個非常明顯的缺點:長任務進程無法執行。還有該演算法的關鍵點是如何預測進程所需的執行時間。

優先順序排程演算法

解決了STCF演算法中長任務進程飢餓的問題,而暴露出的短任務會飢餓的問題,可以通過動態調整優先順序來解決。實際上動態調整優先順序(稱為權值)+ 時間片輪轉的策略正是Linux系統進程排程的策略之一的分時排程策略,排程過程如下:

(1) 建立任務指定採用分時排程策略,指定優先順序nice的值(-20~19)
(2) 依據nice的值確定在cpu上的執行時間
(3) 如果沒有等待資源,則將該任務加入就緒佇列中
(4) 排程程式遍歷就緒佇列,通過對動態優先順序的計算,選擇計算結果最
大的去執行。當時間片用完時或進程主動放棄cpu時,該任務就重新放回就
緒佇列隊尾或等待佇列中。
(5) 排程程式重新按照(4)的方式排程進程。
(6) 當排程程式發現所有就緒佇列中的進程的權值都不大於0時,重複(2)
的過程

現代OS通常都會採用混合排程演算法。如:將不同的進程分為幾個大類,每個大類有不同的優先順序,不同大類的進程排程取決於大類的優先順序,同一個大類的進程排程採用時間片輪轉演算法來實現。

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-09/146738.htm


IT145.com E-mail:sddin#qq.com