版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Linux內(nèi)核源代碼導(dǎo)讀中國(guó)科學(xué)技術(shù)大學(xué)計(jì)算機(jī)系陳香蘭(0551-3606864)xlanchen@/~xlanchen
Spring2009進(jìn)程(任務(wù)管理)主要內(nèi)容進(jìn)程描述符進(jìn)程切換進(jìn)程的創(chuàng)建和刪除2/2/20233Linux內(nèi)核源代碼導(dǎo)讀進(jìn)程的概念進(jìn)程是執(zhí)行程序的一個(gè)實(shí)例進(jìn)程和程序的區(qū)別 幾個(gè)進(jìn)程可以并發(fā)的執(zhí)行一個(gè)程序一個(gè)進(jìn)程可以順序的執(zhí)行幾個(gè)程序2/2/20234Linux內(nèi)核源代碼導(dǎo)讀進(jìn)程描述符為了管理進(jìn)程,內(nèi)核必須對(duì)每個(gè)進(jìn)程進(jìn)行清晰的描述。進(jìn)程描述符提供了內(nèi)核所需了解的進(jìn)程信息源碼include/linux/sched.h定義
structtask_struct數(shù)據(jù)結(jié)構(gòu)很龐大2/2/20235Linux內(nèi)核源代碼導(dǎo)讀stack2/2/20236Linux內(nèi)核源代碼導(dǎo)讀Linux2.6進(jìn)程的狀態(tài)簡(jiǎn)單過(guò)一下,與狀態(tài)相關(guān)的一些宏1)組合狀態(tài)2)狀態(tài)判斷3)狀態(tài)設(shè)置2/2/20237Linux內(nèi)核源代碼導(dǎo)讀進(jìn)程狀態(tài)轉(zhuǎn)換圖EXIT_ZOMBIE或者EXIT_DEAD或者TASK_DEAD2/2/20238Linux內(nèi)核源代碼導(dǎo)讀標(biāo)識(shí)一個(gè)進(jìn)程使用進(jìn)程描述符地址進(jìn)程和進(jìn)程描述符之間有非常嚴(yán)格的一一對(duì)應(yīng)關(guān)系,使得用32位進(jìn)程描述符地址標(biāo)識(shí)進(jìn)程非常方便使用PID(ProcessID,PID)每個(gè)進(jìn)程的PID都存放在進(jìn)程描述符的pid域中2/2/20239Linux內(nèi)核源代碼導(dǎo)讀進(jìn)程和進(jìn)程的內(nèi)核堆棧Linux為每個(gè)進(jìn)程分配一個(gè)8KB大小的內(nèi)存區(qū)域,用于存放該進(jìn)程兩個(gè)不同的數(shù)據(jù)結(jié)構(gòu):Thread_info進(jìn)程的內(nèi)核堆棧進(jìn)程處于內(nèi)核態(tài)時(shí)使用
不同于用戶態(tài)堆棧內(nèi)核控制路徑所用的堆棧
很少,因此對(duì)棧和描述符
來(lái)說(shuō),8KB足夠了Thread_info2/2/202310Linux內(nèi)核源代碼導(dǎo)讀Thread_unionC語(yǔ)言允許用如下的一個(gè)union結(jié)構(gòu)來(lái)方便的表示這樣的一個(gè)混合體2/2/202311Linux內(nèi)核源代碼導(dǎo)讀進(jìn)程描述符的分配/回收/訪問(wèn)Thread_info的分配/回收/訪問(wèn)alloc_thread_infofree_thread_info2/2/202312Linux內(nèi)核源代碼導(dǎo)讀2/2/202313Linux內(nèi)核源代碼導(dǎo)讀從當(dāng)前內(nèi)核堆棧獲得當(dāng)前thread_info根據(jù)thread_info描述符和內(nèi)核態(tài)堆棧之間的配對(duì),內(nèi)核可以很容易的從esp寄存器的值獲得當(dāng)前在CPU上運(yùn)行的進(jìn)程的描述符指針因?yàn)檫@個(gè)內(nèi)存區(qū)是8KB=213大小,內(nèi)核必須做的就是讓esp有13位的有效位,以獲得thread_info的基地址2/2/202314Linux內(nèi)核源代碼導(dǎo)讀current宏進(jìn)程描述符2/2/202315Linux內(nèi)核源代碼導(dǎo)讀可知,從每個(gè)cpu相關(guān)參數(shù)中,把per_cpu__current_task,取出返回需要找到該參數(shù)的賦值之處??!2/2/202316Linux內(nèi)核源代碼導(dǎo)讀考慮對(duì)應(yīng)的x86_write_percpu的使用情況在__switch_to中被調(diào)用2/2/202317Linux內(nèi)核源代碼導(dǎo)讀Current宏的使用Current宏可以看成當(dāng)前進(jìn)程的進(jìn)程描述符指針,在內(nèi)核中直接使用比如current->pid返回在CPU上正在執(zhí)行的進(jìn)程的PID2/2/202318Linux內(nèi)核源代碼導(dǎo)讀進(jìn)程的PID進(jìn)程的pid字段Pid最大值2/2/202319Linux內(nèi)核源代碼導(dǎo)讀Pid的管理和分配創(chuàng)建一個(gè)進(jìn)程時(shí),Pid名字空間do_forkcopy_processalloc_pidStructpid的cache2/2/202320Linux內(nèi)核源代碼導(dǎo)讀Pid位圖Pid數(shù)據(jù)結(jié)構(gòu)對(duì)pid名字空間:2.6內(nèi)核為PID專門(mén)引入了一個(gè)數(shù)據(jù)結(jié)構(gòu),Why?
獨(dú)立的進(jìn)程;進(jìn)程組;sessions
使用pid數(shù)字的注意之處考慮進(jìn)程的刪除和創(chuàng)建2/2/202321Linux內(nèi)核源代碼導(dǎo)讀最初的pid名字空間在kernel_init中,被修改為init進(jìn)程在start_kernel中,調(diào)用pidmap_init進(jìn)行合理的初始化2/2/202322Linux內(nèi)核源代碼導(dǎo)讀分配第一個(gè)位圖頁(yè)初始化structpid的cache2/2/202323Linux內(nèi)核源代碼導(dǎo)讀2.6內(nèi)核為PID專門(mén)引入了一個(gè)數(shù)據(jù)結(jié)構(gòu)Why?獨(dú)立的進(jìn)程;進(jìn)程組;sessions使用pid數(shù)字的注意之處考慮進(jìn)程的刪除和創(chuàng)建2/2/202324Linux內(nèi)核源代碼導(dǎo)讀閱讀alloc_pid、alloc_pidmap函數(shù)2/2/202325Linux內(nèi)核源代碼導(dǎo)讀進(jìn)程鏈表為了對(duì)給定類型的進(jìn)程(比如所有在可運(yùn)行狀態(tài)下的進(jìn)程)進(jìn)行有效的搜索,內(nèi)核維護(hù)了幾個(gè)進(jìn)程鏈表所有進(jìn)程鏈表在進(jìn)程描述符中:2/2/202326Linux內(nèi)核源代碼導(dǎo)讀進(jìn)程鏈表中的插入和刪除使用常規(guī)list數(shù)據(jù)結(jié)構(gòu)操作2/2/202327Linux內(nèi)核源代碼導(dǎo)讀list_addlist_add_taillist_dellist_movelist_emptylist_for_eachlist_for_each_prevlist_for_each_safelist_for_each_entry…2/2/202328Linux內(nèi)核源代碼導(dǎo)讀例如,在do_fork調(diào)用的copy_process中for_each_process宏掃描整個(gè)進(jìn)程鏈表2/2/202329Linux內(nèi)核源代碼導(dǎo)讀TASK_RUNNING狀態(tài)的進(jìn)程組織對(duì)可運(yùn)行隊(duì)列的一些操作函數(shù)底層:常規(guī)的list數(shù)據(jù)結(jié)構(gòu)操作入列出列等操作:dequeue_taskenqueue_taskconststructsched_class,調(diào)度類rt_sched_classfair_sched_classidle_sched_class每個(gè)cpu有一個(gè)運(yùn)行隊(duì)列關(guān)于調(diào)度的描述,參見(jiàn)sched_coding.txt和sched-design-CFS.txt2/2/202330Linux內(nèi)核源代碼導(dǎo)讀運(yùn)行隊(duì)列數(shù)據(jù)結(jié)構(gòu)2/2/202331Linux內(nèi)核源代碼導(dǎo)讀structcfs_rq……紅黑樹(shù)2/2/202332Linux內(nèi)核源代碼導(dǎo)讀structrt_rq……基于優(yōu)先級(jí)的運(yùn)行隊(duì)列2/2/202333Linux內(nèi)核源代碼導(dǎo)讀2/2/202334Linux內(nèi)核源代碼導(dǎo)讀2/2/202335Linux內(nèi)核源代碼導(dǎo)讀調(diào)度類閱讀調(diào)度類sched_class的定義源碼找到主要與運(yùn)行隊(duì)列有關(guān)的enqueue_task、dequeue_taskIdle相關(guān):idle_sched_classnoenqueue/yield_taskforidletasksdequeue_task_idleFair相關(guān)enqueue_task_fairdequeue_task_fairRt相關(guān)enqueue_task_rtdequeue_task_rt2/2/202336Linux內(nèi)核源代碼導(dǎo)讀Idle類特殊2/2/202337Linux內(nèi)核源代碼導(dǎo)讀Fair類進(jìn)而查看1)enqueue_entity2)__enqueue_entity
(紅黑樹(shù))3)sched_entity結(jié)構(gòu)4)structrq5)structcfs_rqCompletelyFairScheduler完全公平調(diào)度2/2/202338Linux內(nèi)核源代碼導(dǎo)讀Rt類進(jìn)而查看:1)enqueue_rt_entity2)__enqueue_rt_entity 每個(gè)cpu有一個(gè)隊(duì)列3)sched_rt_entity4)structrq5)structrt_rq6)structrt_prio_array優(yōu)先級(jí)隊(duì)列2/2/202339Linux內(nèi)核源代碼導(dǎo)讀激活一個(gè)任務(wù)activate_task相對(duì)的:deactivate_task2/2/202340Linux內(nèi)核源代碼導(dǎo)讀pidhash表及鏈接表在一些情況下,內(nèi)核必須能從進(jìn)程的PID得出對(duì)應(yīng)的進(jìn)程描述符指針。例如kill系統(tǒng)調(diào)用為了加速查找,引入了pid_hash散列表初始化:pidhash_initTask_struct中:2/2/202341Linux內(nèi)核源代碼導(dǎo)讀pidhash表及鏈接表2/2/202342Linux內(nèi)核源代碼導(dǎo)讀進(jìn)程之間的親屬關(guān)系程序創(chuàng)建的進(jìn)程具有父子關(guān)系,在編程時(shí)往往需要引用這樣的父子關(guān)系。進(jìn)程描述符中有幾個(gè)域用來(lái)表示這樣的關(guān)系2/2/202343Linux內(nèi)核源代碼導(dǎo)讀等待隊(duì)列當(dāng)要把除了TASK_RUNNING狀態(tài)之外的進(jìn)程組織在一起時(shí),linux使用了等待隊(duì)列TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE狀態(tài)的進(jìn)程再分成很多類,每一類對(duì)應(yīng)一個(gè)特定的事件。在這種情況下,進(jìn)程狀態(tài)提供的信息滿足不了快速檢索,因此,內(nèi)核引進(jìn)了另外的進(jìn)程鏈表,叫做等待隊(duì)列等待隊(duì)列在內(nèi)核中有很多用途,尤其是對(duì)中斷處理、進(jìn)程同步和定時(shí)用處很大2/2/202344Linux內(nèi)核源代碼導(dǎo)讀等待隊(duì)列使得進(jìn)程可以在事件上的條件等待,并且當(dāng)?shù)却臈l件為真時(shí),由內(nèi)核喚醒它們等待隊(duì)列由循環(huán)鏈表實(shí)現(xiàn)閱讀相關(guān)的宏2/2/202345Linux內(nèi)核源代碼導(dǎo)讀在等待隊(duì)列上內(nèi)核實(shí)現(xiàn)了一些操作函數(shù)add_wait_queueadd_wait_queue_exclusiveremove_wait_queue2/2/202346Linux內(nèi)核源代碼導(dǎo)讀進(jìn)程等待等待一個(gè)特定事件的進(jìn)程能調(diào)用下面幾個(gè)函數(shù)中的任一個(gè)sleep_onsleep_on_timeoutinterruptible_sleep_oninterruptible_sleep_on_timeout進(jìn)程等待由需要等待的進(jìn)程自己進(jìn)行(調(diào)用)2/2/202347Linux內(nèi)核源代碼導(dǎo)讀sleep_on相當(dāng)于閱讀實(shí)際的sleep_on代碼2/2/202348Linux內(nèi)核源代碼導(dǎo)讀此外,還可能按照如下方式進(jìn)行sleep2/2/202349Linux內(nèi)核源代碼導(dǎo)讀例如事件等待wait_event__wait_event等待,直到事件發(fā)生(有效,或…)2/2/202350Linux內(nèi)核源代碼導(dǎo)讀進(jìn)程的喚醒利用wake_up或者wake_up_interruptible等一系列的宏,都讓插入等待隊(duì)列中的進(jìn)程進(jìn)入TASK_RUNNING狀態(tài)2/2/202351Linux內(nèi)核源代碼導(dǎo)讀__wake_up__wake_up_common 間接default_wake_functionactivate_tasktry_to_wake_up2/2/202352Linux內(nèi)核源代碼導(dǎo)讀進(jìn)程切換(processswitching)為了控制進(jìn)程的執(zhí)行,內(nèi)核必須有能力掛起正在CPU上執(zhí)行的進(jìn)程,并恢復(fù)以前掛起的某個(gè)進(jìn)程的執(zhí)行,這叫做進(jìn)程切換,任務(wù)切換,上下文切換2/2/202353Linux內(nèi)核源代碼導(dǎo)讀進(jìn)程上下文包含了進(jìn)程執(zhí)行需要的所有信息用戶地址空間
包括程序代碼,數(shù)據(jù),用戶堆棧等控制信息
進(jìn)程描述符,內(nèi)核堆棧等硬件上下文2/2/202354Linux內(nèi)核源代碼導(dǎo)讀硬件上下文盡管每個(gè)進(jìn)程可以有自己的地址空間,但所有的進(jìn)程只能共享CPU的寄存器。因此,在恢復(fù)一個(gè)進(jìn)程執(zhí)行之前,內(nèi)核必須確保每個(gè)寄存器裝入了掛起進(jìn)程時(shí)的值。這樣才能正確的恢復(fù)一個(gè)進(jìn)程的執(zhí)行硬件上下文:
進(jìn)程恢復(fù)執(zhí)行前必須裝入寄存器的一組數(shù)據(jù)包括通用寄存器的值以及一些系統(tǒng)寄存器通用寄存器系統(tǒng)寄存器2/2/202355Linux內(nèi)核源代碼導(dǎo)讀在linux中一個(gè)進(jìn)程的上下文主要保存在thread_info,
task_struct的thread_struct中,其他信息放在內(nèi)核態(tài)堆棧中2/2/202356Linux內(nèi)核源代碼導(dǎo)讀thread_info2/2/202357Linux內(nèi)核源代碼導(dǎo)讀Thread_struct……2/2/202358Linux內(nèi)核源代碼導(dǎo)讀Pt_regs2/2/202359Linux內(nèi)核源代碼導(dǎo)讀上下文切換switch_to宏執(zhí)行進(jìn)程切換,schedule()函數(shù)通過(guò)調(diào)用context_switch,間接調(diào)用這個(gè)宏一調(diào)度一個(gè)新的進(jìn)程在CPU上運(yùn)行switch_to利用了prev
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 土地租賃協(xié)議2023
- 部編版六年級(jí)語(yǔ)文上冊(cè)第八單元知識(shí)梳理填空
- (2024)1-4酸鈉鹽生產(chǎn)建設(shè)項(xiàng)目可行性研究報(bào)告(一)
- 2023年天津市益中學(xué)校高考語(yǔ)文模擬試卷
- 2023年家政服務(wù)項(xiàng)目融資計(jì)劃書(shū)
- 零食行業(yè)藍(lán)皮書(shū)
- 電力電纜模擬習(xí)題+參考答案
- 養(yǎng)老院老人生活設(shè)施維修人員管理制度
- 養(yǎng)老院老人訪客管理制度
- 2024年旅游產(chǎn)品銷售與推廣合同3篇
- 2024秋期國(guó)家開(kāi)放大學(xué)本科《中國(guó)當(dāng)代文學(xué)專題》一平臺(tái)在線形考(形考任務(wù)一至六)試題及答案
- 期末(試題)-2024-2025學(xué)年人教PEP版(2024)英語(yǔ)三年級(jí)上冊(cè)
- 第五單元簡(jiǎn)易方程 提升練習(xí)題(單元測(cè)試)-2024-2025學(xué)年五年級(jí)上冊(cè)數(shù)學(xué)人教版
- 重點(diǎn)語(yǔ)法清單2024-2025學(xué)年人教版英語(yǔ)八年級(jí)上冊(cè)
- 紅色簡(jiǎn)約中國(guó)英雄人物李大釗課件
- NGS與感染性疾病醫(yī)學(xué)課件
- 2024版《大學(xué)生職業(yè)生涯規(guī)劃與就業(yè)指導(dǎo)》 課程教案
- 2024年煤礦事故匯編
- Unit 2 Different families(教學(xué)設(shè)計(jì))-2024-2025學(xué)年人教PEP版英語(yǔ)三年級(jí)上冊(cè)
- Unit 7單元教案 2024-2025學(xué)年人教版(2024)七年級(jí)英語(yǔ)上冊(cè)
- Unit 6 My sweet home(教學(xué)設(shè)計(jì))-2024-2025學(xué)年外研版(三起)(2024)小學(xué)英語(yǔ)三年級(jí)上冊(cè)
評(píng)論
0/150
提交評(píng)論