- 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的行程串列-RSWiki.ppt
* /43 * 訊息佇列 使用者號誌、訊息與共用記憶體屬於 IPC 的範圍。 透過代號來使用 IPC 資源。 semget()、msgget() 或 shmget() 分別取得信號、訊息或共用記憶體的 IPC 代號。 Linux 中所有與 IPC 相關的函式都是透過 ipc() 系統呼叫來完成的。 訊息佇列: msgget() - 取得訊息佇列的代號。 msgsnd() - 傳送訊息。 msgrcv() - 接受訊息。 * /43 * 訊息佇列 (續) Linux IPC 訊息佇列的資料結構: struct ipc_ids - 每一種 IPC 資源各自擁有一個 ipc_ids 結構,訊息佇列為 msg_ids。 struct msg_queue - 代表一個訊息佇列。 struct msg_msg、struct msg_msgseg - struct msg_msg 用來代表一個訊息,每個訊息使用雙向鏈結串列連接在一起。訊息超過一個分頁(4 KB)時,使用其它的 struct msg_msgseg 來儲存。 struct msg_sender、struct msg_receiver - 用來代表正在等待的傳送端與接收端行程。 msgsnd() 在核心中是呼叫 sys_msgsnd(),大致可分為三個部分,分別為: 初始化。 檢查訊息佇列是否有空間存放訊息。 檢查訊息佇列中的接收端行程串列是否有行程正等待訊息。 * /43 * IPC 訊息佇列的資料結構 m_list … … entries[] … q_messages q_senders q_receivers msg_queue … 7 … … … msg_ids msg_msg next m_list … msg_msg next msg_msgseg list tsk next msg_sender r_list r_tsk … r_msg msg_receiver * /43 * 摘要 (1) Linux 核心中的行程控制區塊是由一個 task_struct 結構來代表。 Linux 核心中動態建立行程的系統呼叫 fork() vfork() clone() Linux 核心中處理內文切換的巨集: switch_to * /43 * 摘要 (2) Linux 核心中的同步機制 旋轉鎖 / 讀寫旋轉鎖 號誌 down() - 使用號誌。 up() - 釋出號誌。 Linux 提供 IPC 機制,允許使用者空間的行程進行同步或相互溝通。 Linux 核心中的訊息佇列 msgget() - 取得訊息佇列的代號。 msgsnd() - 傳送訊息。 msgrcv() - 接受訊息。 /43 資工系網媒所 NEWS實驗室 國立台灣大學 資訊工程學系 /43 作業系統 第七章 行程相關實作 * /43 * 第七章 行程相關實作 資料結構 行程描述器 行程狀態 行程串列 就緒佇列 行程運作 行程間的溝通 摘要 * /43 * 資料結構 以作業系統的觀點來看行程,一個行程控制區塊就代表一個行程。 Linux 中與行程相關的資料結構 行程控制區塊 行程狀態 行程串列 就緒佇列 * /43 * 行程描述器 描述器用來描述系統元件,如行程描述器。 描述器就是對應到實作的程式碼中的某個結構。 行程描述器是個儲存在核心位址空間中的龐大結構。 Linux 中行程描述器稱為 task_struct。定義在 Linux 核心源碼的include/linux/sched.h 中。 * /43 * 行程狀態 在 Linux 中,行程的狀態記錄在行程描述器中的 state 欄位: #define TASK_RUNNING 0 #define TASK_INTERRUPTIBLE 1 #define TASK_UNINTERRUPTIBLE 2 #define TASK_ZOMBIE 4 #define TASK_STOPPED 8 volatile long state; /* -1 不可執行,0 可執行,0 被停止 */ * /43 * 行程狀態 (續) TASK_RUNNING:行程正在執行或是等待被執行時。 TASK_INTERRUPTIBLE:等待某些事件發生時,如等待信號的傳遞。 TASK_UNINTERRUPTIBLE:與TASK_INTERRUPTIBLE 一樣,不同的是信號傳遞時並不會造成狀態的改變。 TASK_STOPPED:收到 SIGSTOP、SIGTSTP、SIGTTIN 或SIGTTOU 信號時。 TASK_ZOMBIE:當子行程結束時,父行程尚未呼叫類似 wait() 的系統呼叫來得知子行程的狀態並作適當處理,於
文档评论(0)