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