歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux操作系統 進程管理剖析

Linux操作系統 進程管理剖析

日期:2017/2/28 16:50:24   编辑:Linux教程

Linux®的用戶空間進程的創建和管理所涉及的原理與 UNIX®有很多共同點,但也有一些特定於 Linux 的獨特之處。在本文中,了解 Linux 進程的生命周期,探索用戶進程創建、內存管理、調度和銷毀的內核內幕。

Linux 是一種動態系統,能夠適應不斷變化的計算需求。Linux 計算需求的表現是以進程 的通用抽象為中心的。進程可以是短期的(從命令行執行的一個命令),也可以是長期的(一種網絡服務)。因此,對進程及其調度進行一般管理就顯得極為重要。

在用戶空間,進程是由進程標識符(PID)表示的。從用戶的角度來看,一個 PID 是一個數字值,可惟一標識一個進程。一個 PID 在進程的整個生命期間不會更改,www.britepic.org但 PID 可以在進程銷毀後被重新使用,所以對它們進行緩存並不見得總是理想的。

在用戶空間,創建進程可以采用幾種方式。可以執行一個程序(這會導致新進程的創建),也可以在程序內,調用一個 fork 或 exec 系統調用。fork 調用會導致創建一個子進程,而 exec 調用則會用新程序代替當前進程上下文。接下來,我將對這幾種方法進行討論以便您能很好地理解它們的工作原理。

在本文中,我將按照下面的順序展開對進程的介紹,首先展示進程的內核表示以及它們是如何在內核內被管理的,然後來看看進程創建和調度的各種方式(在一個或多個處理器上),最後介紹進程的銷毀。

進程表示

在 Linux 內核內,進程是由相當大的一個稱為 task_struct 的結構表示的。此結構包含所有表示此進程所必需的數據,此外,還包含了大量的其他數據用來統計(accounting)和維護與其他進程的關系(父和子)。對 task_struct 的完整介紹超出了本文的范圍,清單 1 給出了 task_struct 的一小部分。這些代碼包含了本文所要探索的這些特定元素。task_struct 位於 ./linux/include/linux/sched.h。

清單 1. task_struct 的一小部分

struct task_struct {
volatile long state;
void *stack;
unsigned int flags;
int prio, static_prio;
struct list_head tasks;
struct mm_struct *mm, *active_mm;
pid_t pid;
pid_t tgid;
struct task_struct *real_parent;
char comm[TASK_COMM_LEN];
struct thread_struct thread;
struct files_struct *files;
...
};

在清單 1 中,可以看到幾個預料之中的項,比如執行的狀態、堆棧、一組標志、父進程、執行的線程(可以有很多)以及開放文件。我稍後會對其進行詳細說明,這裡只簡單加以介紹。state 變量是一些表明任務狀態的比特位。最常見的狀態有:TASK_RUNNING 表示進程正在運行,或是排在運行隊列中正要運行;TASK_INTERRUPTIBLE 表示進程正在休眠、TASK_UNINTERRUPTIBLE 表示進程正在休眠但不能叫醒;TASK_STOPPED 表示進程停止等等。這些標志的完整列表可以在 ./linux/include/linux/sched.h 內找到。

flags 定義了很多指示符,表明進程是否正在被創建(PF_STARTING)或退出(PF_EXITING),或是進程當前是否在分配內存(PF_MEMALLOC)。可執行程序的名稱(不包含路徑)占用 comm(命令)字段。

每個進程都會被賦予優先級(稱為 static_prio),但進程的實際優先級是基於加載以及其他幾個因素動態決定的。優先級值越低,實際的優先級越高。

tasks 字段提供了鏈接列表的能力。它包含一個 prev 指針(指向前一個任務)和一個 next 指針(指向下一個任務)。

進程的地址空間由 mm 和 active_mm 字段表示。mm 代表的是進程的內存描述符,而 active_mm 則是前一個進程的內存描述符(為改進上下文切換時間的一種優化)。

thread_struct 則用來標識進程的存儲狀態。此元素依賴於 Linux 在其上運行的特定架構,在 ./linux/include/asm-i386/processor.h 內有這樣的一個例子。在此結構內,可以找到該進程自執行上下文切換後的存儲(硬件注冊表、程序計數器等)。

Copyright © Linux教程網 All Rights Reserved