linux的進程管理論文
隨著計算機開發(fā)以及教學工作的深入,大家也不可避免的要接觸到基于Linux內(nèi)核的各種操作系統(tǒng)。這是學習啦小編為大家整理的linux的進程管理論文,僅供參考!
linux的進程管理論文篇一
基于Linux系統(tǒng)中進程調(diào)度分析
摘要]Linux是一個多用戶多任務的操作系統(tǒng),Linux中實現(xiàn)了對多個進程公平、高效的調(diào)度,并不是采用單一的調(diào)度策略,而是幾種調(diào)度策略有機地綜合應用。
[關鍵詞] 進程調(diào)度 優(yōu)先級 時間片輪轉 實時進程
在任何一種操作系統(tǒng)中,進程調(diào)度一直是一個核心問題,進程調(diào)度策略的選擇對整個系統(tǒng)性能有至關重要的影響,一個好的調(diào)度算法應該考慮很多方面:公平、有效、響應時間、周轉時間、系統(tǒng)吞吐量等等,但這些因素之間又是相互矛盾的,最終的取舍根據(jù)系統(tǒng)要達到的目標而定,本文以Linux操作系統(tǒng)為例,分析其進程調(diào)度策略,以期對進程調(diào)度過程有更深層次的認識。
一、 Linux的進程調(diào)度
Linux支持多進程,進程控制塊PCB(Process Control Block)是系統(tǒng)中最為重要的數(shù)據(jù)結構之一,用來存放進程所必需的各種信息,PCB用結構task-struct來表示,包括進程的類型、進程狀態(tài)、優(yōu)先級、時鐘信息等,Linux系統(tǒng)中,進程調(diào)度操作由schedule()函數(shù)執(zhí)行,這是一個只在內(nèi)核態(tài)運行的函數(shù),函數(shù)代碼為所有進程共享。
二、linux的進程調(diào)度時機
Linux的進程調(diào)度時機與現(xiàn)代操作系統(tǒng)中的調(diào)度時機基本一致,為了判斷是否可以執(zhí)行內(nèi)核的進程調(diào)度程序來調(diào)度進程,Linux中設置了進程調(diào)度標志need-resched,當標志為1時,可執(zhí)行調(diào)度程序.通常,Linux調(diào)度時機分以下兩種情況:(1)主動調(diào)度:指顯式調(diào)用schedule()函數(shù)明確釋放CPU,引起新一輪調(diào)度.一般發(fā)生在當前進程狀態(tài)改變,如:進程終止、進程睡眠、進程對某些信號處理過程中等,(2)被動調(diào)度:指不顯示調(diào)用schedule()函數(shù),只是PCB中的need-resched進程調(diào)度標志,該域置位為1將引起新的進程調(diào)度,而每當中斷處理和系統(tǒng)調(diào)用返回時,核心調(diào)度程序都會主動查詢need-resched的狀態(tài)(若置位,則主動調(diào)用schedule()函數(shù)),一般發(fā)生在新的進程產(chǎn)生時、某個進程優(yōu)先級改變時、某個進程等待的資源可用被喚醒時、當前進程時間片用完等。
三、linux的進程調(diào)度策略
一般來說,不同用途的操作系統(tǒng)的調(diào)度策略是不同的,linux的進程調(diào)度是將優(yōu)先級調(diào)度、時間片輪轉法調(diào)度、先進先出調(diào)度綜合起來應用,Linux系統(tǒng)中,不同類型的進程調(diào)度策略也不一樣。
1. 與進程調(diào)度相關的數(shù)據(jù)結構
每個進程都是一個動態(tài)的個體,其生命周期依次定義的數(shù)據(jù)結構為:TASK-RUNNING,TASK-INTERRUPTIBLE,TASK-UNINTERRUPTIBLE,TASK-ZOMBIE和TASK-STOPPED,一個進程在其生存期間,狀態(tài)會發(fā)生多次變化,與其數(shù)據(jù)結構相對應的即是linux的進程的狀態(tài),分別是:運行態(tài)、等待態(tài)、暫停態(tài)和僵死態(tài)。
2. 進程狀態(tài)及其轉換過程的描述
進程創(chuàng)建時的狀態(tài)為不可打斷睡眠,在do-fork()結束前被父進程喚醒后,變?yōu)閳?zhí)行狀態(tài),處于執(zhí)行狀態(tài)的進程被移到run-queue就緒任務隊列中等待調(diào)度,適當時候由schedule()按調(diào)度算法選中,獲得CPU,若采用輪轉法,即時,由時鐘中斷觸發(fā)timer-interrupt(),其內(nèi)部調(diào)用schedule(),引起新一輪調(diào)度,當前進程的狀態(tài)仍處于執(zhí)行狀態(tài),因而把當前進程掛到ruil-queue隊尾。
獲得CPU且正在運行的進程若申請不到某資源,則調(diào)用sleep-on()或interruptible-sleep-on()睡眠,其task-struct進程控制塊掛到相應資源的wait-queue等待隊列,如果調(diào)用sleep-on(),則其狀態(tài)變?yōu)椴豢纱驍嗨?如果調(diào)用interruptible-sleep-on(),則其狀態(tài)變?yōu)榭纱驍嗨?Sleep-on()或interruptible-sleep-on()將調(diào)用schedule()函數(shù)把睡眠進程釋放.
3.進程分類和相應的進程調(diào)度策略
Linux系統(tǒng)中,為了高效地調(diào)度進程,將進程分成兩類:實時進程和普通進程(又稱非實時進程或一般進程),實時進程的優(yōu)先級要高于其他進程,如果一個實時進程處于可執(zhí)行狀態(tài),它將先得到執(zhí)行,實時進程又有兩種策略:時間片輪轉和先進先出,在時間片輪轉策略中,每個可執(zhí)行實時進程輪流執(zhí)行一個時間片,而先進先出策略每個進程按各自在運行隊列中的順序執(zhí)行且順序不能變化。
在Linux中,進程調(diào)度策略共定義了3種:
Linux系統(tǒng)中的每個進程用task-struct結構來描述,進程調(diào)度的依據(jù)是task-struct結構中的policy、priority、counter和rt-priority,PCB中設置Policy數(shù)據(jù)項,其值用于反映針對不同類型的進程而采用的調(diào)度策略。SCHED- RR和SCHED-FIFO用于實時進程,分別表示輪轉調(diào)度策略和先進先出調(diào)度策略;SCHED-OTHER表示普通進程,也按照輪轉調(diào)度策略處理。這三類調(diào)度策略均基于優(yōu)先級.PCB中設置Priority數(shù)據(jù)項,其值為普通進程的調(diào)度優(yōu)先級.普通進程的可用時間片的初始值即為該值,該值通過系統(tǒng)調(diào)用是可以改變的。
PCB中設置rt-priority數(shù)據(jù)項,其值是實時進程專用的調(diào)度優(yōu)先級,實時進程的可用時間片的初始值即為該值,該優(yōu)先級也可以用系統(tǒng)調(diào)用來修改,PCB中設置counter數(shù)據(jù)項,用于進程可用時間片時值的計數(shù),初始值為rt-priority或Priority,進程啟動后該值隨時鐘周期遞減。
通過對linux的進程調(diào)度策略的簡單分析,可以看出多進程的管理是一種非常復雜的并發(fā)程序設計,每個進程的狀態(tài)不僅由其自身決定,而且還要受諸多外在因素的影響,而在此基礎上的進程調(diào)度,為了保證操作系統(tǒng)的穩(wěn)定性、提高效率和增加靈活性,還必須采用很多方法,這些都是值得我們?nèi)パ芯亢吞接懙摹?/p>
參考文獻:
[1]劉振鵬李亞平王煜:操作系統(tǒng)[M].北京:中國鐵道出版社,2003
[2]趙明富李太福陳鴻雁:Linux嵌入式系統(tǒng)的實時性分析[J].電腦知識與技術,2003,29(18):53―55
linux的進程管理論文篇二
Linux2.6內(nèi)核代碼分析――進程管理
摘要:隨著計算機開發(fā)以及教學工作的深入,大家也不可避免的要接觸到基于Linux內(nèi)核的各種操作系統(tǒng)。如何邁入Linux的大門,并充分利用Linux開源、靈活等特性呢?解讀內(nèi)核源碼無疑是理解并掌握linux的關鍵。本篇文章,主要是對Linux內(nèi)核進程管理部分進行籠統(tǒng)的解讀,幫助讀者快速掌握linux的進程管理的主線,對讀者的理解起到拋磚引玉的作用。
關鍵詞:Linux2.6;內(nèi)核代碼;進程管理
一
Linux是最受歡迎的自由電腦操作系統(tǒng)內(nèi)核。它是一個用C語言寫成,符合POSIX標準的類Unix操作系統(tǒng)。Linux最早是由芬蘭黑客 Linus Torvalds為嘗試在英特爾x86架構上提供自由免費的類Unix操作系統(tǒng)而開發(fā)的。技術上說Linux是一個內(nèi)核。“內(nèi)核”指的是一個提供硬件抽象層、磁盤及文件系統(tǒng)控制、多任務等功能的系統(tǒng)軟件。一個內(nèi)核不是一套完整的操作系統(tǒng)。一套基于Linux內(nèi)核的完整操作系統(tǒng)叫作Linux操作系統(tǒng),或是GNU/Linux。
Linux內(nèi)核的主要模塊(或組件)分以下幾個部分:存儲管理、CPU和進程管理、文件系統(tǒng)、設備管理和驅(qū)動、網(wǎng)絡通信,以及系統(tǒng)的初始化(引導)、系統(tǒng)調(diào)用等。一般地,可以從Linux內(nèi)核版本號來區(qū)分系統(tǒng)是否是Linux穩(wěn)定版還是測試版。以版本2.4.0為例,2代表主版本號,4代表次版本號,0代表改動較小的末版本號。在版本號中,序號的第二位為偶數(shù)的版本表明這是一個可以使用的穩(wěn)定版本,如2.2.5,而序號的第二位為奇數(shù)的版本一般有一些新的東西加入,是個不一定很穩(wěn)定的測試版本,如2.3.1。這樣穩(wěn)定版本來源于上一個測試版升級版本號,而一個穩(wěn)定版本發(fā)展到完全成熟后就不再發(fā)展。本文是針對2.4.0版本內(nèi)核進行分析。有于篇幅有限閱讀前需要讀者自行下載相應內(nèi)核源碼。
Linux內(nèi)核可分為三類,即硬件(異常)中斷處理文件,系統(tǒng)調(diào)用服務文件,及通用功能文件。其中通用類程序包括以下五種:sched.c、mktime.c、panic.c、printk.c、vsprintf.c。這其中的sched.c程序是內(nèi)核的核心調(diào)度程序,主要用作切換進程或改變進程執(zhí)行狀態(tài)。schedule.c下有l(wèi)inux內(nèi)核調(diào)用最頻繁的三個函數(shù),分別是:schedule()、sleep_on()、wakeup()
二
schedule()函數(shù)首先對所有進程進行檢測,喚醒任何一個已經(jīng)得到信號的任務。主要是任務數(shù)組中的每個進程,檢測其報警定時值alarm。若alarm 隨后的調(diào)度函數(shù)是代碼核心部分。這部分代碼根據(jù)進程時間片和優(yōu)先權調(diào)度機制,來選擇隨后要執(zhí)行的任務。他首先循環(huán)檢測任務數(shù)組中所有任務,根據(jù)每個就緒態(tài)任務剩余執(zhí)行時間(counter),選取最大counter值的任務,并利用switch_to()函數(shù)切換到任務。若所有任務counter值都為0,表示此刻所有任務的時間片都已經(jīng)用完,則格局任務優(yōu)先權值(priority),重置每個人物運行時間片值,再重新檢測搜有任務執(zhí)行時間片值。以下是代碼中主要函數(shù)及結構的功能:(參見/include/linux/sched.h、/kernel/sched.c)
(1) void sched_show_task(struct task_struct_)/_示任務nr的進程號、進程狀態(tài)和內(nèi)核
/_閑字節(jié)數(shù)
(2) void show_state_filter(unsigned long state_filter)/_示所有任務的任務號、進程號、進程狀態(tài)及內(nèi)核對咱空閑字節(jié)數(shù)_
(3) task_struct定義在/include/linux/sched.h中 Linux的進程控制塊task_struct包含有進程的描述信息、控制信息以及資源信息,是進程的靜態(tài)描述。進程控制塊包括:進程標識符、優(yōu)先級、堆棧空間、進程狀態(tài)四部分。其重要成員為state(volatile long state)
……
2.6中新增了兩種狀態(tài):TRACED、DEAD
TASK_DEAD是表示已經(jīng)退出且不需父進程回收的進程的狀態(tài)。而TASK_TRACED則供調(diào)試使用。TASK_ZOMBIE―一個已經(jīng)終止的但仍保留有任務結構的進程;TASK_RUNNING―就緒態(tài);TASK_INTERRUPTIBLE、TASK_UNITERRUPTIBLE―不同深度的睡眠態(tài);TASK_STOPPED―描述一個已經(jīng)停止的進程,當進程接收到一個特殊信號或被使用ptrace系統(tǒng)調(diào)用的進程監(jiān)控,并將控制權交給監(jiān)控進程
(4) 關于優(yōu)先級,prio是進程的動態(tài)優(yōu)先級,是調(diào)度器選擇候選進程next的主要依據(jù); static_prio則是進程的靜態(tài)優(yōu)先級, 應該是進程開始時從父程繼承來的。kernel/sched.c中定義了兩個宏來完成將nice轉換到prio的取值區(qū)間和將prioity轉換到nice取值區(qū)間。
則可以看出prioity和nice的關系是:priority = MAX_RT_PRIO+nice+20。
進程優(yōu)先級分實時和非實時兩部分,兩者不能混淆使用。
(5) run_list成員。
include/linux/list.h定義了一種抽象的雙向鏈表struct list_head,通過它可以將任意類型的結構體鏈接到一起。task_struct也是通過這種方式鏈接起來的。
(6)activated成員
int activated;
表示進程因什么原因進入就緒態(tài),這一原因會影響到調(diào)度優(yōu)先級的計算。activated 有四個值:
-1,進程從 TASK_UNINTERRUPTIBLE 狀態(tài)被喚醒;
0,缺省值,進程原本就處于就緒態(tài);
1,進程從 TASK_INTERRUPTIBLE 狀態(tài)被喚醒,且不在中斷上下文中;
2,進程從 TASK_INTERRUPTIBLE 狀態(tài)被喚醒,且在中斷上下文中。
TASK_INTERRUPTIBLE 狀態(tài)進程由中斷激活,則該進程最有可能是交互式的,因此,置 activated=2;否則置activated=1。
如果進程是從 TASK_UNINTERRUPTIBLE 狀態(tài)中被喚醒的,則 activated=-1(在try_to_wake_up()函數(shù)中)。
(7) 就緒進程隊列 runqueue
內(nèi)核為每CPU的數(shù)據(jù)結構,每個處理器都維護一個自己的就緒隊列。定義在/kernel/sched.c 中。
注:i.其中nr_running為隊列進程個數(shù),本就緒隊列中就緒進程的個數(shù)。它是active隊列和expired隊列就緒進程個數(shù)的和: nr_running = active->nr_active+ expired->nr_active
ii.prio_array_t_ctive,_xpired, arrays[2];// 兩個子隊列
就緒隊列根據(jù)時間片是否被用完分為了active隊列和expired隊列。queue是指定優(yōu)先級進程list的指針,如queue[i]就是priority為 i 的進程的指針。bitmap是一張優(yōu)先級的位圖,或者可以說的位數(shù)組,每一位代表了一個優(yōu)先級(類似uC/OS-II)。
MAX_PRIO指的是優(yōu)先級的數(shù)量.
(8) 還有兩個重要函數(shù):sleep_on()、wakeup()分別用于自動進入睡眠,及喚醒進程,較schedule()難理解,由于篇幅有限,不再贅述。
以上是對Linux 2.4.0版本內(nèi)核源碼進程管理部分的概括分析,主要用來為Linux源碼解讀做一個引導,起到拋磚引玉的作用。但是由于時間,篇幅等種種原因,無法將全部函數(shù)調(diào)用以及相關代碼一一呈現(xiàn)在讀者面前,還望見諒。
參考文獻:
[1] 范劍英; 吳巖; 賈佳; 周楊; 王長勁; 吳英.Linux2.6內(nèi)核實時性分析與改進方案 [J].哈爾濱理工大學學報,2008,(1).
[2] 彭雪蓮.LINUX2.6內(nèi)核進程調(diào)度策略分析[J].大眾科技,2008,(5).