Linux核心分析 讀書筆記 (第三章)

2022-09-02 13:06:11 字數 2497 閱讀 3618

1.程序:

2.執行緒:執行執行緒,簡稱執行緒,是在程序中活動的物件。

3.在現代作業系統中,程序提供兩種虛擬機制:虛擬處理器和虛擬記憶體包含在同乙個程序中的執行緒可以共享虛擬記憶體,但是每個都擁有各自的虛擬處理器。

4.幾個函式

核心把程序的列表存放在叫做任務佇列的雙向迴圈鍊錶中。

鍊錶中的每一項都是程序描述符。

程序描述符的型別為task_struct。

linux通過slab分配器分配task_struct結構——能達到物件復用和快取著色的目的。

slab分配器——動態生成,只需在棧底或者棧頂建立乙個新的結構struct thread_info。

每個任務的thread_info結構在它的核心棧的尾端分配。

結構中task域中存放的是指向該任務實際task_struct的指標。

核心通過乙個唯一的程序標識值pid來標識每個程序。

pid型別為pid_t,實際上就是乙個int型別,最大值預設設定為32768,上限私改/proc/sys/kernel/pid_max。

pid存放在各自程序描述符中。

程序描述符中的state域是用來描述程序當前狀態的。共有五種狀態,標誌如下:

用set_task_state(task,state)函式。
程式執行系統呼叫或者觸發異常後,會陷入核心空間,這時候核心代表程序執行,並且處於程序上下文中。

程序對核心的訪問必須通過介面:系統呼叫和異常處理程式

所有的程序都是pid為1的init程序的後代。

核心在系統啟動的最後階段啟動init程序。系統中的每乙個程序必有乙個父程序,可以擁有0個或多個子程序,擁有同乙個父程序的程序叫做兄弟。這種關係存放在程序描述符中,parent指標指向父程序task_struct,children是子程序鍊錶。

unix系統的程序建立方式

linux通過clone系統呼叫實現fork

由clone去呼叫do_fork()

定義在中的do_ fork()完成建立中的大部分工作,它呼叫copy_process函式,然後讓程序開始執行

最後copy_process返回的就是指向子程序的指標

除了不拷貝父程序的頁表項外,vfork()系統呼叫和fork()功能相同。子程序作為父程序的乙個單獨的執行緒在它的位址空間裡執行,父程序被阻塞,直到子程序退出或執行exec()。

vfork()系統呼叫的實現是通過向clone()系統呼叫傳遞乙個特殊標誌來進行的:

執行緒機制提供了在同一程式內共享記憶體位址空間執行的一組執行緒。在linux系統中,執行緒僅僅被視為乙個與其他程序共享某些資源的程序。每個執行緒都有自己的task_struct。

1.執行緒的建立與普通程序類似,只不過在呼叫clone()的時候需要傳遞一些引數標誌來指明共享的資源

2.傳遞給clone()的引數標誌決定了新建立程序的行為方式和父子程序之間共享的資源種類

終結程序大部分依賴於do_exit()來完成:

該任務是和清理工作分開進行的,因為這樣在程序終結之後系統仍然可以獲得它的資訊

通過release_task()實現程序描述符的刪除

至此,所有資源都被釋放了

1. 孤兒程序:父程序在程序之前退出,就會遺留下子程序,也就是孤兒程序

2. 解決方法:在當前的執行緒組內給孤兒程序尋找新的父程序;否則直接以init作為其父程序

一旦系統為程序成功地找到和設定了新的父程序,就不會再有出現駐留僵死程序的危險了。init程序會例行呼叫wait()來檢查其子程序,清除所有與其相關的僵死程序。

《Linux核心分析》第七周 讀書筆記

學習內容 鏈結需要的 資料 鏈結機制 鏈結生成的目標檔案 定義 鏈結是將各種資料和 收集起來成並組合成為乙個單一檔案的過程 這個檔案可以被拷貝到儲存器並且執行 場合 作用 編譯驅動程式代表使用者呼叫語言預處理器 編譯器 彙編器和聯結器 預處理器將.c檔案翻譯成ascii碼中間檔案.i 編譯器將.i檔...

linux核心設計與實踐第三版讀書筆記

程序提供兩種虛擬機制,虛擬cpu和虛擬記憶體 linux中所有的程序都在乙個list中,可以通過下面的方法來訪問整合中的子執行緒 struct task struct task struct list head list list for each list,t children 這裡的siblin...

《Linux核心設計與實現》第三章讀書筆記

新建立的程序呼叫exec 這組函式就可以建立新的位址空間,並把新的程式載入其中 最終,程式通過exit 函式可以退出執行 程序退出執行之後就會變為殭屍程序,直到父程序呼叫wait 或waitpid 返回關於終止程序的狀態 程序列表存放在任務佇列 task list 這一雙向鍊錶中 鍊錶的項是task...