




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Linux內(nèi)核進(jìn)程調(diào)度與控制源代碼分析與研究The Process Scheduling and Control of Linux Kernel Source Code Analyses and Research摘要 本文對(duì)Linux內(nèi)核中進(jìn)程調(diào)度和進(jìn)程控制部分的源代碼分別進(jìn)行了詳細(xì)的流程分析與代碼注釋,并對(duì)這兩部分的代碼實(shí)現(xiàn)進(jìn)行了研究,闡述了它們的優(yōu)缺點(diǎn)。在進(jìn)程調(diào)度部分,主要涉及了Linux的調(diào)度算法及實(shí)現(xiàn)、時(shí)鐘中斷、定時(shí)器、Linux內(nèi)核機(jī)制以及系統(tǒng)調(diào)用nanosleep、pause。在進(jìn)程控制部分,主要涉及了Linux系統(tǒng)調(diào)用的實(shí)現(xiàn)和進(jìn)程的創(chuàng)建、裝入執(zhí)行、等待、消亡的過程。關(guān)鍵詞:操作系
2、統(tǒng) 進(jìn)程 進(jìn)程調(diào)度 中斷 定時(shí)器 運(yùn)行隊(duì)列 系統(tǒng)調(diào)用 門 內(nèi)核空間 用戶空間ABSTRACT In this article ,we have written the program flow and comment of the code that about The Process Scheduling and Control of Linux Kernel。We also make a research on implementation of the code and indicate the strongpoint and shortcoming of it. In Process
3、Scheduling,the things we have done include the algorithms and implementation of process scheduling,time interrupt,timer,bottom half,nanosleep and pause. In Process Control, the things what we have done include the implementation of System Call and the course of the process creating,exec,wait and exi
4、t.Key Words: Oprerating system Process Process sceduling Interrupt Timer Run-queue System call Gate Kernel space User space目錄第1章 引言 1第2章 Linux內(nèi)核的整體結(jié)構(gòu)2第3章 Linux進(jìn)程調(diào)度4 3.1 相關(guān)概念簡述43.1.1 Linux進(jìn)程的四個(gè)要素43.1.2 task_struct結(jié)構(gòu)描述43.1.3 調(diào)度與時(shí)間片143.1.4 實(shí)時(shí)進(jìn)程與非實(shí)時(shí)進(jìn)程143.1.5 Linux進(jìn)程優(yōu)先級(jí) 143.1.6 Linux進(jìn)程系統(tǒng)的特點(diǎn) 15 3.2 進(jìn)程的調(diào)度
5、173.2.1 Linux進(jìn)程調(diào)度的策略 183.2.2 Linux進(jìn)程的調(diào)度算法 183.2.3 Linux進(jìn)程的調(diào)度時(shí)機(jī) 183.2.4 Linux進(jìn)程的隊(duì)列 183.2.5 Linux進(jìn)程調(diào)度全過程 203.2.6 schedule( )及其調(diào)用函數(shù) 22 3.3 時(shí)鐘中斷 233.3.1 時(shí)鐘233.3.2 實(shí)時(shí)時(shí)鐘中斷233.3.3 bottom half處理機(jī)制 243.3.4 系統(tǒng)定時(shí)器 25 3.4系統(tǒng)調(diào)用nanosleep( )和pause( ) 273.4.1 nanosleep( )及部分子程序283.4.2 sys_pause( )29 3.5對(duì)于Linux進(jìn)程調(diào)度的研
6、究總結(jié) 303.5.1 Linux對(duì)調(diào)度算法的應(yīng)用 303.5.2 Linux進(jìn)程優(yōu)先級(jí)的代碼實(shí)現(xiàn) 303.5.3 Linux對(duì)CPU的充分利用 30第4章 Linux進(jìn)程的控制 31 4.1 進(jìn)程的創(chuàng)建、執(zhí)行、消亡 314.1.1 系統(tǒng)調(diào)用的實(shí)現(xiàn)324.1.2 子進(jìn)程的創(chuàng)建414.1.3 子進(jìn)程的執(zhí)行464.1.4 父進(jìn)程的等待484.1.5 子進(jìn)程的消亡494.1.6 進(jìn)程控制的全過程51 4.2 對(duì)于Linux進(jìn)程控制的研究總結(jié) 524.2.1 Linux系統(tǒng)的內(nèi)核保護(hù)與系統(tǒng)調(diào)用 524.2.2 Linux進(jìn)程的創(chuàng)建、執(zhí)行、等待和消亡 524.2.3 Linux進(jìn)程的并發(fā)特性 52第5章
7、 Linux內(nèi)核源碼模塊功能 53 5.1 進(jìn)程調(diào)度 535.1.1 schedule( )535.1.2 goodness( )545.1.3 switch_mm( ) 565.1.4 add_to_runqueue( ) 565.1.5 del_from_runqueue( ) 575.1.6 move_last_runqueue( )575.1.7 move_first_runqueue( ) 57 5.2 nanosleep,pause及時(shí)鐘函數(shù) 585.2.1 sys_nanosleep ( )585.2.2 schedule_timeout ( ) 585.2.3 internal
8、_add_timer( ) 595.2.4 run_timer_list( ) 615.2.5 sys_pause ( )615.2.6 do_timer_interrupt( ) 625.2.7 do_timer ( )635.2.8 do_bottom_half( ) 635.2.9 timer_bh ( )65 5.3 系統(tǒng)調(diào)用總控入口 65 5.4 子進(jìn)程的創(chuàng)建 665.4.1 sys_fork ( ) 665.4.2 sys_clone ( )665.4.3 sys_vfork ( )675.4.4 do_fork ( )675.4.5 get_pid ( )705.4.6 copy
9、_fs ( )705.4.7 copy_mm ( )725.4.8 copy_files ( ) 735.4.9 copy_sighand ( ) 735.4.10 copy_thread ( ) 77 5.5 子進(jìn)程的裝入和執(zhí)行 785.5.1 sys_execve ( ) 785.5.2 getname ( ) 795.5.3 do_execve ( ) 795.5.4 search_binary_handler ( ) 81 5.6 父進(jìn)程的等待 825.6.1 sys_wait4 ( ) 825.6.1 release_task ( ) 83 5.7 子進(jìn)程的消亡 865.7.1 sy
10、s_exit ( ) 865.7.2 do_exit ( )865.7.3 _exit_mm ( )875.7.4 _exit_files ( ) 885.7.5 _exit_fs ( )895.7.6 _exit_notify ( ) 895.7.7 _exit_sighand ( ) 90第6章 Linux內(nèi)核源代碼分析 92 6.1 進(jìn)程調(diào)度 92 6.2 nanosleep,pause及時(shí)鐘函數(shù) 99 6.3 系統(tǒng)調(diào)用總控入口105 6.4 子進(jìn)程的創(chuàng)建106 6.5 子進(jìn)程的裝入和執(zhí)行118 6.6 父進(jìn)程的等待123 6.7 子進(jìn)程的消亡126結(jié)束語 133致謝 134參考文獻(xiàn) 1
11、35翻譯譯文 136第1章 引言Linux是一種能運(yùn)行于多種平臺(tái)、源代碼公開、免費(fèi)、功能強(qiáng)大、遵守POSIX標(biāo)準(zhǔn)、與UNIX兼容的操作系統(tǒng)。Linux最初版本是由Linus Benedict Torvalds編寫的,為了能夠使Linux更加完善,Torvalds在網(wǎng)絡(luò)上公開了Linux的源碼,邀請全世界的志愿者來參與Linux的開發(fā)。在這些無私的人們的幫助下,Linux得到不斷的完善,并在短時(shí)期內(nèi)迅速崛起。現(xiàn)在,Linux內(nèi)核已經(jīng)發(fā)展到了2.5.X版,并還在以相當(dāng)快的速度不斷地發(fā)展著。據(jù)報(bào)道,它是一個(gè)很有發(fā)展前途的操作系統(tǒng),也是為數(shù)不多可以與Microsoft旗下操作系統(tǒng)相競爭的操作系統(tǒng)。我國
12、的IT產(chǎn)業(yè)起步較晚,技術(shù)落后于西方經(jīng)濟(jì)發(fā)達(dá)國家。在我國,由于受知識(shí)產(chǎn)權(quán)的限制,無論是使用PC 平臺(tái)上的Windows,還是使用應(yīng)用于大中型機(jī)的UNIX,都無法窺視到其內(nèi)部結(jié)構(gòu)。這些系統(tǒng)很可能存在不為我們所知的漏洞,如果這些漏洞為別有用心者所利用,將會(huì)嚴(yán)重危及我國的經(jīng)濟(jì)安全和國家安全。操作系統(tǒng)不同于其它軟件產(chǎn)品,它是其它應(yīng)用程序得以運(yùn)行的平臺(tái),應(yīng)用軟件的開發(fā)必須基于對(duì)相應(yīng)平臺(tái)(操作系統(tǒng))的技術(shù)的理解和掌握。由于我們的軟件企業(yè)無法獲知這些系統(tǒng)的細(xì)節(jié),根本無法與擁有這些關(guān)鍵技術(shù)的國外先進(jìn)企業(yè)相抗衡,長此以往,將會(huì)對(duì)我國軟件產(chǎn)業(yè)產(chǎn)生深遠(yuǎn)的負(fù)面影響。為了打破這種受制于人的局面,我國迫切的需要開發(fā)一個(gè)具有
13、自主知識(shí)產(chǎn)權(quán)的操作系統(tǒng)。由于Linux性能優(yōu)越,屬于自由軟件,公開源代碼且完全免費(fèi),所以拿來作發(fā)展自主知識(shí)產(chǎn)權(quán)的操作系統(tǒng)的底版是非常合適的選擇。只有完全了解當(dāng)前Linux的實(shí)現(xiàn)細(xì)節(jié),才能在它的基礎(chǔ)上作進(jìn)一步的開發(fā)和完善。因此,分析Linux源代碼對(duì)于在Linux現(xiàn)有的基礎(chǔ)上開發(fā)我們自己的Linux就具有非常現(xiàn)實(shí)和重要的意義。本論文主要在源碼水平上討論Linux內(nèi)核進(jìn)程調(diào)度與控制的實(shí)現(xiàn),其目的是通過對(duì)源碼的分析與研究,找出Linux在本論文研究方向上的優(yōu)缺點(diǎn),作為今后Linux系統(tǒng)開發(fā)的參考。第2章 Linux內(nèi)核的整體結(jié)構(gòu)Linux內(nèi)核由5個(gè)主要的子系統(tǒng)組成。這5個(gè)子系統(tǒng)分別是進(jìn)程調(diào)度(SCH
14、ED)、內(nèi)存管理(MM)、虛擬文件系統(tǒng)(Virtual File System,VFS)、網(wǎng)絡(luò)接口(NET)和進(jìn)程間通信(IPC)。進(jìn)程調(diào)度控制著進(jìn)程對(duì)CPU的訪問。當(dāng)需要選擇下一個(gè)進(jìn)程運(yùn)行時(shí),由調(diào)度程序選擇最值得運(yùn)行的進(jìn)程??蛇\(yùn)行進(jìn)程實(shí)際是僅等待CPU資源的進(jìn)程,如果某個(gè)進(jìn)程在等待其它資源,則該進(jìn)程是不可運(yùn)行進(jìn)程。Linux使用了比較簡單的基于優(yōu)先級(jí)的進(jìn)程調(diào)度算法選擇新的進(jìn)程。內(nèi)存管理允許多個(gè)進(jìn)程安全地共享主內(nèi)存區(qū)域。Linux的內(nèi)存管理支持虛擬內(nèi)存,即在計(jì)算機(jī)中運(yùn)行的程序,其代碼、數(shù)據(jù)和堆棧的總量可以超過實(shí)際內(nèi)存的大小,操作系統(tǒng)只將當(dāng)前使用的程序塊保留在內(nèi)存中,其余的程序塊則保留在磁盤上。
15、必要時(shí),操作系統(tǒng)負(fù)責(zé)在磁盤和內(nèi)存之間交換程序塊。內(nèi)存管理從邏輯上可以分為硬件無關(guān)的部分和硬件相關(guān)的部分。硬件無關(guān)的部分提供了進(jìn)程的映射和虛擬內(nèi)存的對(duì)換;硬件相關(guān)的部分為內(nèi)存管理硬件提供了虛擬接口。虛擬文件系統(tǒng)隱藏了各種不同硬件的具體細(xì)節(jié),為所有設(shè)備提供了統(tǒng)一的接口,虛擬文件系統(tǒng)還支持多達(dá)數(shù)十種不同的文件系統(tǒng),這也是Linux較有特色的部分。虛擬文件系統(tǒng)可分為邏輯文件系統(tǒng)和設(shè)備驅(qū)動(dòng)程序。邏輯文件系統(tǒng)指Linux所支持的文件系統(tǒng),如ext2、fat等,設(shè)備驅(qū)動(dòng)程序指為每一種硬件控制器所編寫的設(shè)備驅(qū)動(dòng)程序模塊。網(wǎng)絡(luò)接口提供了對(duì)各種網(wǎng)絡(luò)標(biāo)準(zhǔn)的存取和各種網(wǎng)絡(luò)硬件的支持。網(wǎng)絡(luò)接口可分為網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)驅(qū)動(dòng)程
16、序兩部分。網(wǎng)絡(luò)協(xié)議部分負(fù)責(zé)實(shí)現(xiàn)每一種可能的網(wǎng)絡(luò)傳輸協(xié)議,網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序負(fù)責(zé)與硬件設(shè)備進(jìn)行通信,每一種可能的硬件設(shè)備都有相應(yīng)的設(shè)備驅(qū)動(dòng)程序。進(jìn)程間通信支持進(jìn)程間各種通信機(jī)制。下圖顯示了上述五個(gè)子系統(tǒng)之間的關(guān)系: 各個(gè)子系統(tǒng)之間的依賴關(guān)系如下:1 進(jìn)程調(diào)度與內(nèi)存管理之間的關(guān)系:這兩個(gè)子系統(tǒng)互相依賴。在多道程序環(huán)境下,程序要運(yùn)行必須為之創(chuàng)建進(jìn)程,而創(chuàng)建進(jìn)程的第一件事,就是要將程序和數(shù)據(jù)裝入內(nèi)存。2 進(jìn)程間通信與內(nèi)存管理之間的關(guān)系:進(jìn)程間通信子系統(tǒng)要依賴內(nèi)存管理支持共享內(nèi)存通信機(jī)制,這種機(jī)制允許兩個(gè)進(jìn)程除了擁有自己的私有內(nèi)存,還可存取共同的內(nèi)存區(qū)域。3 虛擬文件系統(tǒng)與網(wǎng)絡(luò)接口之間的關(guān)系: 虛擬文件系
17、統(tǒng)利用網(wǎng)絡(luò)接口支持網(wǎng)絡(luò)文件系統(tǒng)(NFS),也利用內(nèi)存管理支持RAMDISK設(shè)備。4 內(nèi)存管理與虛擬文件系統(tǒng)之間的關(guān)系: 內(nèi)存管理利用虛擬文件系統(tǒng)支持交換,交換進(jìn)程定期地由調(diào)度程序調(diào)度,這也是內(nèi)存管理依賴于進(jìn)程調(diào)度的唯一原因。當(dāng)一個(gè)進(jìn)程存取的內(nèi)存映射被換出時(shí),內(nèi)存管理向文件系統(tǒng)發(fā)出請求,同時(shí),掛起當(dāng)前當(dāng)前正在運(yùn)行的進(jìn)程。 在這些子系統(tǒng)中,進(jìn)程調(diào)度子系統(tǒng)是其他子系統(tǒng)得以順利工作的關(guān)鍵。無論是文件系統(tǒng)的系統(tǒng)進(jìn)程還是網(wǎng)絡(luò)子系統(tǒng)的服務(wù)進(jìn)程都需要通過進(jìn)程調(diào)度來獲得相應(yīng)的CPU時(shí)間以正常運(yùn)行。第3章 Linux進(jìn)程調(diào)度3.1 相關(guān)概念簡述3.1.1Linux進(jìn)程的四個(gè)要素一般來說Linux系統(tǒng)的進(jìn)程都具備下
18、列諸要素:(1) 有一段程序供其執(zhí)行。這段程序不一定是某個(gè)進(jìn)程所專有,可以與其他進(jìn)程共用。(2) 有進(jìn)程專用的內(nèi)核空間堆棧。(3) 在內(nèi)核中有一個(gè)task_struct數(shù)據(jù)結(jié)構(gòu),即通常所說的“進(jìn)程控制塊”。有了這個(gè)數(shù)據(jù)結(jié)構(gòu),進(jìn)程才能成為內(nèi)核調(diào)度的一個(gè)基本單位接受內(nèi)核的調(diào)度。同時(shí),這個(gè)結(jié)構(gòu)還記錄著進(jìn)程所占用的各項(xiàng)資源。(4) 有獨(dú)立的存儲(chǔ)空間,這意味著擁有專有的用戶空間;進(jìn)一步,還意味著除前述的內(nèi)核空間堆棧外還有其專用的用戶空間堆棧。有一點(diǎn)必須指出,內(nèi)核空間是不能獨(dú)立的,任何進(jìn)程都不可能直接(不通過系統(tǒng)調(diào)用)改變內(nèi)核空間的內(nèi)容(除其本身的內(nèi)核空間堆棧以外)。這四條都是必要條件,缺了任何一條都不能
19、成為“進(jìn)程”。如果只具備了前三條而缺第四條,就稱為“線程”。如果完全沒有用戶空間,就稱為“內(nèi)核線程”(kernel thread);而如果共享用戶空間則稱為“用戶線程”。二者往往都簡稱“線程”。事實(shí)上,在Linux系統(tǒng)中,進(jìn)程和線程的區(qū)分并不十分嚴(yán)格,許多進(jìn)程在“誕生”之初都與其父進(jìn)程共用同一個(gè)存儲(chǔ)空間,所以嚴(yán)格說來還是線程;但是子進(jìn)程可以建立其自己的存儲(chǔ)空間,并與父進(jìn)程分離,成為真正意義上的進(jìn)程。3.1.2 task_struct結(jié)構(gòu)描述task_struct結(jié)構(gòu)是向系統(tǒng)表明進(jìn)程存在的唯一憑證,它包含了進(jìn)程的全部信息。同時(shí),也是進(jìn)程為實(shí)現(xiàn)操作而取得必要資源的唯一途徑。下面列出了task_st
20、ruct結(jié)構(gòu)的全部源碼,在源碼后面有對(duì)task_struct結(jié)構(gòu)(參見includelinuxsched.h)各數(shù)據(jù)項(xiàng)的分類解釋:struct task_struct /* these are hardcoded - dont touch */volatile long state;/* -1 unrunnable, 0 runnable, 0 stopped */unsigned long flags;/* per process flags, defined below */int sigpending;mm_segment_t addr_limit;/* thread address s
21、pace: 0-0xBFFFFFFF for user-thead0-0xFFFFFFFF for kernel-thread */struct exec_domain *exec_domain;long need_resched;/* various fields */long counter;long priority;cycles_t avg_slice;/* SMP and runqueue state */int has_cpu;int processor;int last_processor;int lock_depth;/* Lock depth. We can context
22、switch in and out of holding a syscall kernel lock. */struct task_struct *next_task, *prev_task;struct list_head run_list;/* task state */struct linux_binfmt *binfmt;int exit_code, exit_signal;int pdeath_signal; /* The signal sent when the parent dies */* ? */unsigned long personality;int dumpable:1
23、;int did_exec:1;pid_t pid;pid_t pgrp;pid_t tty_old_pgrp;pid_t session;/* boolean value for session group leader */int leader;/* * pointers to (original) parent process, youngest child, younger sibling, * older sibling, respectively. (p-father can be replaced with * p-p_pptr-pid) */struct task_struct
24、 *p_opptr, *p_pptr, *p_cptr, *p_ysptr, *p_osptr;/* PID hash table linkage. */struct task_struct *pidhash_next;struct task_struct *pidhash_pprev;wait_queue_head_t wait_chldexit;/* for wait4() */struct semaphore *vfork_sem;/* for vfork() */unsigned long policy, rt_priority;unsigned long it_real_value,
25、 it_prof_value, it_virt_value;unsigned long it_real_incr, it_prof_incr, it_virt_incr;struct timer_list real_timer;struct tms times;unsigned long start_time;long per_cpu_utimeNR_CPUS, per_cpu_stimeNR_CPUS;/* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific */
26、unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap;int swappable:1;/* process credentials */uid_t uid,euid,suid,fsuid;gid_t gid,egid,sgid,fsgid;int ngroups;gid_tgroupsNGROUPS;kernel_cap_t cap_effective, cap_inheritable, cap_permitted;struct user_struct *user;/* limits */struct rlimit
27、rlimRLIM_NLIMITS;unsigned short used_math;char comm16;/* file system info */int link_count;struct tty_struct *tty; /* NULL if no tty */* ipc stuff */struct sem_undo *semundo;struct sem_queue *semsleeping;/* CPU-specific state of this task */struct thread_struct thread;/* filesystem information */str
28、uct fs_struct *fs;/* open file information */struct files_struct *files;/* memory management info */struct mm_struct *mm, *active_mm;/* signal handlers */spinlock_t sigmask_lock;/* Protects signal and blocked */struct signal_struct *sig;sigset_t signal, blocked;struct signal_queue *sigqueue, *sigque
29、ue_tail;unsigned long sas_ss_sp;size_t sas_ss_size;1. 調(diào)度數(shù)據(jù)成員(1) volatile long states;表示進(jìn)程的當(dāng)前狀態(tài): TASK_RUNNING:正在運(yùn)行或在就緒隊(duì)列run-queue中準(zhǔn)備運(yùn)行的進(jìn)程,實(shí)際參與進(jìn)程調(diào)度。 TASK_INTERRUPTIBLE:處于等待隊(duì)列中的進(jìn)程,待資源有效時(shí)喚醒,也可由其它進(jìn)程通過信號(hào)(signal)或定時(shí)中斷喚醒后進(jìn)入就緒隊(duì)列run-queue。 TASK_UNINTERRUPTIBLE:處于等待隊(duì)列中的進(jìn)程,待資源有效時(shí)喚醒,不可由其它進(jìn)程通過信號(hào)(signal)或定時(shí)中斷喚醒。 T
30、ASK_ZOMBIE:表示進(jìn)程結(jié)束但尚未消亡的一種狀態(tài)(僵死狀態(tài))。此時(shí),進(jìn)程已經(jīng)結(jié)束運(yùn)行且釋放大部分資源,但尚未釋放進(jìn)程控制塊。TASK_STOPPED:進(jìn)程被暫停,通過其它進(jìn)程的信號(hào)才能喚醒。導(dǎo)致這種狀態(tài)的原因有二,或者是對(duì)收到SIGSTOP、SIGSTP、SIGTTIN或SIGTTOU信號(hào)的反應(yīng),或者是受其它進(jìn)程的ptrace系統(tǒng)調(diào)用的控制而暫時(shí)將CPU交給控制進(jìn)程。 TASK_SWAPPING: 進(jìn)程頁面被交換出內(nèi)存的進(jìn)程。(2) unsigned long flags;進(jìn)程標(biāo)志:PF_ALIGNWARN 打印“對(duì)齊”警告信息。PF_PTRACED 被ptrace系統(tǒng)調(diào)用監(jiān)控。PF_T
31、RACESYS 正在跟蹤。PF_FORKNOEXEC 進(jìn)程剛創(chuàng)建,但還沒執(zhí)行。PF_SUPERPRIV 超級(jí)用戶特權(quán)。PF_DUMPCORE dumped core。PF_SIGNALED 進(jìn)程被信號(hào)(signal)殺出。PF_STARTING 進(jìn)程正被創(chuàng)建。PF_EXITING 進(jìn)程開始關(guān)閉。PF_USEDFPU 該進(jìn)程使用FPU(SMP only)。PF_DTRACE delayed trace (used on m68k)。(3) long priority;進(jìn)程優(yōu)先級(jí)。 Priority的值給出進(jìn)程每次獲取CPU后可使用的時(shí)間(按jiffies計(jì))。優(yōu)先級(jí)可通過系統(tǒng)調(diào)用sys_setp
32、riorty改變(在kernel/sys.c中)。(4) unsigned long rt_priority;rt_priority給出實(shí)時(shí)進(jìn)程的優(yōu)先級(jí),rt_priority+1000給出進(jìn)程每次獲取CPU后可使用的時(shí)間(同樣按jiffies計(jì))。實(shí)時(shí)進(jìn)程的優(yōu)先級(jí)可通過系統(tǒng)調(diào)用sys_sched_setscheduler()改變(見kernel/sched.c)。(5) long counter;在輪轉(zhuǎn)法調(diào)度時(shí)表示進(jìn)程當(dāng)前還可運(yùn)行多久。在進(jìn)程開始運(yùn)行是被賦為priority的值,以后每隔一個(gè)tick(時(shí)鐘中斷)遞減1,減到0時(shí)引起新一輪調(diào)度。重新調(diào)度將從run_queue隊(duì)列選出counte
33、r值最大的就緒進(jìn)程并給予CPU使用權(quán),因此counter起到了進(jìn)程的動(dòng)態(tài)優(yōu)先級(jí)的作用(priority則是靜態(tài)優(yōu)先級(jí))。(6) unsigned long policy;該進(jìn)程的進(jìn)程調(diào)度策略,可以通過系統(tǒng)調(diào)用sys_sched_setscheduler()更改(見kernel/sched.c)。調(diào)度策略有:SCHED_OTHER 0 非實(shí)時(shí)進(jìn)程,基于優(yōu)先權(quán)的輪轉(zhuǎn)法(round robin)。SCHED_FIFO 1 實(shí)時(shí)進(jìn)程,用先進(jìn)先出算法。SCHED_RR 2 實(shí)時(shí)進(jìn)程,用基于優(yōu)先權(quán)的輪轉(zhuǎn)法。2. 信號(hào)處理(1) unsigned long signal;進(jìn)程接收到的信號(hào)。每位表示一種信號(hào),
34、共32種。置位有效。(2) unsigned long blocked;進(jìn)程所能接受信號(hào)的位掩碼。置位表示屏蔽,復(fù)位表示不屏蔽。(3) struct signal_struct *sig;因?yàn)閟ignal和blocked都是32位的變量,Linux最多只能接受32種信號(hào)。對(duì)每種信號(hào),各進(jìn)程可以由PCB的sig屬性選擇使用自定義的處理函數(shù),或是系統(tǒng)的缺省處理函數(shù)。指派各種信息處理函數(shù)的結(jié)構(gòu)定義在include/linux/sched.h中。對(duì)信號(hào)的檢查安排在系統(tǒng)調(diào)用結(jié)束后,以及“慢速型”中斷服務(wù)程序結(jié)束后(IRQ#_interrupt(),參見9。5節(jié)“啟動(dòng)內(nèi)核”)。3. 進(jìn)程隊(duì)列指針(1) s
35、truct task_struct *next_task,*prev_task;所有進(jìn)程(以PCB的形式)組成一個(gè)雙向鏈表。next_task和就是鏈表的前后指針。鏈表的頭和尾都是init_task(即0號(hào)進(jìn)程)。(2) struct task_struct *next_run,*prev_run;由正在運(yùn)行或是可以運(yùn)行的,其進(jìn)程狀態(tài)均為TASK_RUNNING的進(jìn)程所組成的一個(gè)雙向循環(huán)鏈表,即run_queue就緒隊(duì)列。該鏈表的前后向指針用next_run和prev_run,鏈表的頭和尾都是init_task(即0號(hào)進(jìn)程)。(3) struct task_struct *p_opptr,*p
36、_pptr;和struct task_struct *p_cptr,*p_ysptr,*p_osptr; 以上分別是指向原始父進(jìn)程(original parent)、父進(jìn)程(parent)、子進(jìn)程(youngest child)及新老兄弟進(jìn)程(younger sibling,older sibling)的指針。相關(guān)的操作宏參見kenerl/linux/sched.h。它們之間的關(guān)系見下圖: 4. 進(jìn)程標(biāo)識(shí)(1) unsigned short uid,gid;uid和gid是運(yùn)行進(jìn)程的用戶標(biāo)識(shí)和用戶組標(biāo)識(shí)。(2) int groupsNGROUPS;與多數(shù)現(xiàn)代UNIX操作系統(tǒng)一樣,Linux允許
37、進(jìn)程同時(shí)擁有一組用戶組號(hào)。在進(jìn)程訪問文件時(shí),這些組號(hào)可用于合法性檢查。(3) unsigned short euid,egid;euid和egid又稱為有效的uid和gid。出于系統(tǒng)安全的權(quán)限的考慮,運(yùn)行程序時(shí)要檢查euid和egid的合法性。通常,uid等于euid,gid等于egid。有時(shí)候,系統(tǒng)會(huì)賦予一般用戶暫時(shí)擁有root的uid和gid(作為用戶進(jìn)程的euid和egid),以便于進(jìn)行運(yùn)作。(4) unsigned short fsuid,fsgid;fsuid和fsgid稱為文件系統(tǒng)的uid和gid,用于文件系統(tǒng)操作時(shí)的合法性檢查,是Linux獨(dú)特的標(biāo)識(shí)類型。它們一般分別和euid和
38、egid一致,但在NFS文件系統(tǒng)中NFS服務(wù)器需要作為一個(gè)特殊的進(jìn)程訪問文件,這時(shí)只修改客戶進(jìn)程的fsuid和fsgid。(5) unsigned short suid,sgid;suid和sgid是根據(jù)POSIX標(biāo)準(zhǔn)引入的,在系統(tǒng)調(diào)用改變uid和gid時(shí),用于保留真正的uid和gid。(6) int pid,pgrp,session;進(jìn)程標(biāo)識(shí)號(hào)、進(jìn)程的組織號(hào)及session標(biāo)識(shí)號(hào),相關(guān)系統(tǒng)調(diào)用(見程序kernel/sys.c)有sys_setpgid、sys_getpgid、sys_setpgrp、sys_getpgrp、sys_getsid及sys_setsid幾種。(7) int lea
39、der;是否是session的主管,布爾量。5. 時(shí)間數(shù)據(jù)成員(1) unsigned long timeout;用于軟件定時(shí),指出進(jìn)程間隔多久被重新喚醒。采用tick為單位。(2) unsigned long it_real_value,it_real_iner;用于itimer(interval timer)軟件定時(shí)。采用jiffies為單位,每個(gè)tick使it_real_value減到0時(shí)向進(jìn)程發(fā)信號(hào)SIGALRM,并重新置初值。初值由it_real_incr保存。具體代碼見kernel/itimer.c中的函數(shù)it_real_fn()。(3) struct timer_list rea
40、l_timer;一種定時(shí)器結(jié)構(gòu)(Linux共有兩種定時(shí)器結(jié)構(gòu),另一種稱作old_timer)。數(shù)據(jù)結(jié)構(gòu)的定義在include/linux/timer.h中,相關(guān)操作函數(shù)見kernel/sched.c中add_timer()和del_timer()等。(4) unsigned long it_virt_value,it_virt_incr;關(guān)于進(jìn)程用戶態(tài)執(zhí)行時(shí)間的itimer軟件定時(shí)。采用jiffies為單位。進(jìn)程在用戶態(tài)運(yùn)行時(shí),每個(gè)tick使it_virt_value減1,減到0時(shí)向進(jìn)程發(fā)信號(hào)SIGVTALRM,并重新置初值。初值由it_virt_incr保存。具體代碼見kernel/sche
41、d.c中的函數(shù)do_it_virt()。(5) unsigned long it_prof_value,it_prof_incr;同樣是itimer軟件定時(shí)。采用jiffies為單位。不管進(jìn)程在用戶態(tài)或內(nèi)核態(tài)運(yùn)行,每個(gè)tick使it_prof_value減1,減到0時(shí)向進(jìn)程發(fā)信號(hào)SIGPROF,并重新置初值。初值由it_prof_incr保存。 具體代碼見kernel/sched.c中的函數(shù)do_it_prof。(6) long utime,stime,cutime,cstime,start_time;以上分別為進(jìn)程在用戶態(tài)的運(yùn)行時(shí)間、進(jìn)程在內(nèi)核態(tài)的運(yùn)行時(shí)間、所有層次子進(jìn)程在用戶態(tài)的運(yùn)行時(shí)間總
42、和、所有層次子進(jìn)程在核心態(tài)的運(yùn)行時(shí)間總和,以及創(chuàng)建該進(jìn)程的時(shí)間。6. 信號(hào)量數(shù)據(jù)成員(1) struct sem_undo *semundo;進(jìn)程每操作一次信號(hào)量,都生成一個(gè)對(duì)此次操作的undo操作,它由sem_undo結(jié)構(gòu)描述。這些屬于同一進(jìn)程的undo操作組成的鏈表就由semundo屬性指示。當(dāng)進(jìn)程異常終止時(shí),系統(tǒng)會(huì)調(diào)用undo操作。sem_undo的成員semadj指向一個(gè)數(shù)據(jù)數(shù)組,表示各次undo的量。結(jié)構(gòu)定義在include/linux/sem.h。(2) struct sem_queue *semsleeping;每一信號(hào)量集合對(duì)應(yīng)一個(gè)sem_queue等待隊(duì)列(見include/
43、linux/sem.h)。進(jìn)程因操作該信號(hào)量集合而阻塞時(shí),它被掛到semsleeping指示的關(guān)于該信號(hào)量集合的sem_queue隊(duì)列。反過來,semsleeping。sleeper指向該進(jìn)程的PCB。7. 進(jìn)程上下文環(huán)境(1) struct desc_struct *ldt;進(jìn)程關(guān)于CPU段式存儲(chǔ)管理的局部描述符表的指針,用于仿真WINE Windows的程序。其他情況下取值NULL,進(jìn)程的ldt就是arch/i386/traps.c定義的default_ldt。(2) struct thread_struct tss;任務(wù)狀態(tài)段,其內(nèi)容與INTEL CPU的TSS對(duì)應(yīng),如各種通用寄存器.C
44、PU調(diào)度時(shí),當(dāng)前運(yùn)行進(jìn)程的TSS保存到PCB的tss,新選中進(jìn)程的tss內(nèi)容復(fù)制到CPU的TSS。結(jié)構(gòu)定義在include/linux/tasks.h中。(3) unsigned long saved_kernel_stack;為MS-DOS的仿真程序(或叫系統(tǒng)調(diào)用vm86)保存的堆棧指針。(4) unsigned long kernel_stack_page;在內(nèi)核態(tài)運(yùn)行時(shí),每個(gè)進(jìn)程都有一個(gè)內(nèi)核堆棧,其基地址就保存在kernel_stack_page中。8. 文件系統(tǒng)數(shù)據(jù)成員(1) struct fs_struct *fs;fs保存了進(jìn)程本身與VFS的關(guān)系消息,其中root指向根目錄結(jié)點(diǎn),p
45、wd指向當(dāng)前目錄結(jié)點(diǎn),umask給出新建文件的訪問模式(可由系統(tǒng)調(diào)用umask更改),count是Linux保留的屬性,如下頁圖所示。結(jié)構(gòu)定義在include/linux/sched.h中。(2) struct files_struct *files;files包含了進(jìn)程當(dāng)前所打開的文件(struct file *fdNR_OPEN)。在Linux中,一個(gè)進(jìn)程最多只能同時(shí)打開NR_OPEN個(gè)文件。而且,前三項(xiàng)分別預(yù)先設(shè)置為標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和出錯(cuò)消息輸出文件。 (3) int link_count;文件鏈(link)的數(shù)目。9. 內(nèi)存數(shù)據(jù)成員(1) struct mm_struct *mm;在
46、linux中,采用按需分頁的策略解決進(jìn)程的內(nèi)存需求。task_struct的數(shù)據(jù)成員mm指向關(guān)于存儲(chǔ)管理的mm_struct結(jié)構(gòu)。其中包含了一個(gè)虛存隊(duì)列mmap,指向由若干vm_area_struct描述的虛存塊。同時(shí),為了加快訪問速度,mm中的mmap_avl維護(hù)了一個(gè)AVL樹。在樹中,所有的vm_area_struct虛存塊均由左指針指向相鄰的低虛存塊,右指針指向相鄰的高虛存塊,見下圖。 結(jié)構(gòu)定義在include/linux/sched.h中。10. 頁面管理(1) int swappable:1;進(jìn)程占用的內(nèi)存頁面是否可換出。swappable為1表示可換出。對(duì)該標(biāo)志的復(fù)位和置位均在do
47、_fork()函數(shù)中執(zhí)行(見kerenl/fork.c)。(2) unsigned long swap_address;虛存地址比swap_address低的進(jìn)程頁面,以前已經(jīng)換出或已換出過,進(jìn)程下一次可換出的頁面自swap_address開始。參見swap_out_process()和swap_out_pmd()(見mm/vmscan.c)。(3) unsigned long min_flt,maj_flt;該進(jìn)程累計(jì)的minor缺頁次數(shù)和major缺頁次數(shù)。maj_flt基本與min_flt相同,但計(jì)數(shù)的范圍比后者廣(參見fs/buffer.c和mm/page_alloc.c)。min_f
48、lt只在do_no_page()、do_wp_page()里(見mm/memory.c)計(jì)數(shù)新增的可以寫操作的頁面。(4) unsigned long nswap;該進(jìn)程累計(jì)換出的頁面數(shù)。(5) unsigned long cmin_flt,cmaj_flt,cnswap;以本進(jìn)程作為祖先的所有層次子進(jìn)程的累計(jì)換入頁面、換出頁面計(jì)數(shù)。(6) unsigned long old_maj_flt,dec_flt;(7) unsigned long swap_cnt;下一次信號(hào)最多可換出的頁數(shù)。11. 支持對(duì)稱多處理器方式(SMP)時(shí)的數(shù)據(jù)成員(1) int processor;進(jìn)程正在使用的CPU
49、。(2) int last_processor;進(jìn)程最后一次使用的CPU。(3) int lock_depth;上下文切換時(shí)系統(tǒng)內(nèi)核鎖的深度。12. 其它數(shù)據(jù)成員(1) unsigned short used_math;是否使用FPU。(2) char comm16;進(jìn)程正在運(yùn)行的可執(zhí)行文件的文件名。(3) struct rlimit rlimRLIM_NLIMITS;結(jié)構(gòu)rlimit用于資源管理,定義在linux/include/linux/resource.h中,成員共有兩項(xiàng):rlim_cur是資源的當(dāng)前最大數(shù)目;rlim_max是資源可有的最大數(shù)目。在i386環(huán)境中,受控資源共有RLIM_NLIMITS項(xiàng),即10項(xiàng),定義在linux/include/asm/resource.h中,見下表:(4) int errno;最后一次出錯(cuò)的系統(tǒng)調(diào)用的錯(cuò)誤號(hào),0表示無錯(cuò)誤。系統(tǒng)調(diào)用返回時(shí),全程量也擁有該錯(cuò)誤號(hào)。(5) lo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 制造業(yè)公共服務(wù)平臺(tái)項(xiàng)目目標(biāo)與定位
- 2025至2030年中國礦車輪對(duì)數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國牙雕數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國污水處理鏈條數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國松木建筑模板數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國新膚螨靈霜數(shù)據(jù)監(jiān)測研究報(bào)告
- 教研成果的評(píng)估與應(yīng)用策略
- 2025至2030年中國USB硬盤連接線數(shù)據(jù)監(jiān)測研究報(bào)告
- 量子科技項(xiàng)目投資計(jì)劃書(參考模板)
- 鈑金加工項(xiàng)目可行性研究報(bào)告
- 《PDCA循環(huán)法在建筑工程項(xiàng)目施工質(zhì)量管理中的應(yīng)用探究》13000字(論文)
- 【MOOC】計(jì)算機(jī)組成與CPU設(shè)計(jì)實(shí)驗(yàn)-江蘇大學(xué) 中國大學(xué)慕課MOOC答案
- 內(nèi)鏡下內(nèi)痔治療
- 物業(yè)管理服務(wù)房屋及公用設(shè)施維修養(yǎng)護(hù)方案
- 中華人民共和國工會(huì)法
- 制藥廠安全教育培訓(xùn)內(nèi)容
- 電子教案-電工基礎(chǔ)
- 施工單位安全員述職報(bào)告
- 大單元視域下的單元整體教學(xué)與實(shí)施
- 批判性思維能力測量表(CDTI-CV)-彭美慈
- 《現(xiàn)代家政導(dǎo)論》電子教案 4.1模塊四項(xiàng)目一家政教育認(rèn)知
評(píng)論
0/150
提交評(píng)論