版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(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í)使用
不同于用戶(hù)態(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)程描述符的分配/回收/訪(fǎng)問(wèn)Thread_info的分配/回收/訪(fǎng)問(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/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專(zhuān)門(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專(zhuān)門(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ì)給定類(lèi)型的進(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)度類(lèi)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)度類(lèi)閱讀調(diào)度類(lèi)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類(lèi)特殊2/2/202337Linux內(nèi)核源代碼導(dǎo)讀Fair類(lèi)進(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類(lèi)進(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)程再分成很多類(lèi),每一類(lèi)對(duì)應(yīng)一個(gè)特定的事件。在這種情況下,進(jìn)程狀態(tài)提供的信息滿(mǎn)足不了快速檢索,因此,內(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í)行需要的所有信息用戶(hù)地址空間
包括程序代碼,數(shù)據(jù),用戶(hù)堆棧等控制信息
進(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)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)個(gè)人述職報(bào)告
- 關(guān)于房頂做防水的合同書(shū)
- 中班新學(xué)期工作計(jì)劃
- 死因培訓(xùn)課件教學(xué)課件
- 探公望隱居地-思創(chuàng)業(yè)中國(guó)夢(mèng)
- 鱷魚(yú)掉牙課件教學(xué)課件
- 自建房安全事故免責(zé)協(xié)議書(shū)(2篇)
- 南京航空航天大學(xué)《材料工藝學(xué)實(shí)踐》2021-2022學(xué)年第一學(xué)期期末試卷
- 稻香樓賓館臨湖俱樂(lè)部項(xiàng)目安裝工程施工組織設(shè)計(jì)
- 法國(guó)號(hào)說(shuō)課稿
- 2023-2024學(xué)年江蘇省南京玄武區(qū)中考語(yǔ)文最后一模試卷含解析
- 職場(chǎng)心理學(xué)智慧樹(shù)知到期末考試答案章節(jié)答案2024年山東工商學(xué)院
- 2024中國(guó)通信服務(wù)股份限公司招聘公開(kāi)引進(jìn)高層次人才和急需緊缺人才筆試參考題庫(kù)(共500題)答案詳解版
- 中醫(yī)養(yǎng)生活動(dòng)策劃方案
- 汽車(chē)坡道玻璃雨棚施工方案
- 漫畫(huà)解讀非煤地采礦山重大事故隱患判定標(biāo)準(zhǔn)
- 2024年建筑業(yè)10項(xiàng)新技術(shù)
- 飛控系統(tǒng)組成
- 外貿(mào)跟單員培訓(xùn)培訓(xùn)材料
- GB 5009.11-2024食品安全國(guó)家標(biāo)準(zhǔn)食品中總砷及無(wú)機(jī)砷的測(cè)定
- 職業(yè)健康檢查機(jī)構(gòu)執(zhí)法監(jiān)督檢查表
評(píng)論
0/150
提交評(píng)論