- 1、本文档共35页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux的行程串列.ppt
作業系統 第七章 行程相關實作 第七章 行程相關實作 資料結構 行程描述器 行程狀態 行程串列 就緒佇列 行程運作 行程間的溝通 摘要 資料結構 以作業系統的觀點來看行程,一個行程控制區塊就代表一個行程。 Linux 中與行程相關的資料結構 行程控制區塊 行程狀態 行程串列 就緒佇列 行程描述器 描述器用來描述系統元件,如行程描述器。 描述器就是對應到實作的程式碼中的某個結構。 行程描述器是個儲存在核心位址空間中的龐大結構。 Linux 中行程描述器稱為 task_struct。定義在 Linux 核心源碼的include/linux/sched.h 中。 行程狀態 在 Linux 中,行程的狀態記錄在行程描述器中的 state 欄位: 行程狀態 (續) TASK_RUNNING:行程正在執行或是等待被執行時。 TASK_INTERRUPTIBLE:等待某些事件發生時,如等待信號的傳遞。 TASK_UNINTERRUPTIBLE:與TASK_INTERRUPTIBLE 一樣,不同的是信號傳遞時並不會造成狀態的改變。 TASK_STOPPED:收到 SIGSTOP、SIGTSTP、SIGTTIN 或SIGTTOU 信號時。 TASK_ZOMBIE:當子行程結束時,父行程尚未呼叫類似 wait() 的系統呼叫來得知子行程的狀態並作適當處理,於是子行程就會處於這個狀態。 行程串列 Linux 使用鏈結串列將系統中所有的 PCB 串在一起。 行程描述器中的 next_task 與 prev_task 這兩個欄位,就是鏈結串列的指標。 使用for_each_task 巨集可以輕易地走訪整個行程串列。 Linux 的行程串列 就緒佇列 在就緒佇列中的所有行程,其狀態皆為TASK_RUNNING。 行程描述器中實作就緒佇列的 run_list 欄位: 就緒佇列的開頭 就緒佇列 (續) 將一個行程加入就緒佇列: add_to_runqueue() 第七章 行程相關實作 資料結構 行程運作 行程建立 內文切換 行程結束 行程間的溝通 摘要 行程運作 在多行程系統中,行程必須能夠動態地被建立與刪除。 Linux 中行程如何 建立 內文切換 刪除 行程建立 與建立行程有關的系統呼叫 fork() vfork() clone() fork() 複製一份與父行程相同的位址空間 copy-on-write 技術 vfork() 允許父行程與子行程共用相同的位址空間 父行程呼叫 vfork() 後會被阻隔 行程建立 (續) clone() 可以透過一些參數來設定父行程與子行程間可以共用那一些系統資源。 在核心中 fork()、 vfork() 與 clone() 系統呼叫皆會觸發 do_fork()。 以 vfork() 為例: 行程建立 (續) do_fork() 函式執行的內容大致可以分成 6 個部分,分別為: 配置 task_struct 的空間。 複製父行程 task_struct 中所有的欄位。 改變子行程 task_struct 中不可繼承的欄位並作一些初始化的設定。 根據 clone_flags 判斷要複製那些父行程資源,並且初始化子行程的核心堆疊。 將子行程的 task_struct 加入系統的行程串列中。 將子行程喚醒。 內文切換 內文切換時,最重要的就是將行程執行時的 CPU 暫存器值保存下來。 與硬體架構關係非常地密切,需要使用組合語言來輔助撰寫。 Linux 中內文切換的工作是由 switch_to 這個巨集來執行。 行程與 CPU 暫存器狀態的示意圖(1) 行程與 CPU 暫存器狀態的示意圖(2) 行程與 CPU 暫存器狀態的示意圖(3) 行程與 CPU 暫存器狀態的示意圖(4) 行程與 CPU 暫存器狀態的示意圖(5) 行程與 CPU 暫存器狀態的示意圖(6) 行程結束 大部分的行程結束是指行程執行完最後一個指令。 需要將行程先前使用過的一些系統資源回收。 正常的情況下,行程執行到最後一個指令時會觸發 exit() 系統呼叫。 在核心中真正作處理的是 do_exit() 函式。 行程結束 (續) do_exit() 函式會依序執行下列動作: 將行程描述器中的 flag 欄位設為 PF_EXITING,代表這個行程正在結束。 分別移除號誌佇列與計時器佇列中該行程曾經插入的元素。 將行程所用到的記憶體空間、開啟的檔案、檔案系統資源與信號佇列回收。 將行程描述器中的 state 與 exit_code 欄位分別設為 TASK_ZOMBIE 與相應的返回值。 更新父行程與子行程間的相互關係。 呼叫排程器 schedule() 選出下一個可以執行的行程。 第七章 行程相關實作 資料結構 行程運作 行程間的溝通 旋
您可能关注的文档
- jdmail邮件系统FAQ-金笛邮件.doc
- JJG(闽)1051-2012《铜水质自动分析仪》福建省地方计量检定规程.doc
- JKWR型低压无功补偿控制器-北海市深蓝科技发展有限责任公司.doc
- JSQW型气动钻杆卡瓦-霸州市石大宏盛石化机械有限责任公司.doc
- JWBS一体数显温度变送器.doc
- J,JL急性穿孔性阑尾炎抗生素的选用.PDF
- K-05船用生活污水处理装置-中国船级社.PDF
- KD9051多参量变送器选型样本上海肯都自动化仪表有限公司.PDF
- KDIGO急性肾损伤临床实践指南-KidneyDiseaseImprovingGlobal.PDF
- KeysightN7020A电源完整性测量探头.PDF
文档评论(0)