1. 1、本文档共35页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
7.ch07

作業系統 第七章 行程相關實作 第七章 行程相關實作 資料結構 行程描述器 行程狀態 行程串列 就緒佇列 行程運作 行程間的溝通 摘要 資料結構 以作業系統的觀點來看行程,一個行程控制區塊就代表一個行程。 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() 選出下一個可以執行的行程。 第七章 行程相關實作 資料結構 行程運作 行程間的溝通 旋

文档评论(0)

daoqqzhuan3 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档