新建立的程序呼叫exec()這組函式就可以建立新的位址空間,並把新的程式載入其中;
最終,程式通過exit()函式可以退出執行;程序退出執行之後就會變為殭屍程序,直到父程序呼叫wait()或waitpid()(返回關於終止程序的狀態)
程序列表存放在任務佇列(task list)這一雙向鍊錶中
鍊錶的項是task_struct也就是程序描述符型別的結構體
該型別定義在中
task_struct包含了程序所需的所有資源
目的:linux通過slab分配task_struct結構,以達到物件復用以及和快取著色的目的(避免資源動態分配和釋放帶來的資源消耗)
分配:每個任務的堆疊尾端(比如,對於向上增長的堆疊來說,就是在堆疊的棧頂)有結構體thread_info,它指向了task_struct結構體
查詢:核心中的大部分處理處理程序的**都是通過task_struct進行的;因此,需要通過current巨集查詢到當前正在執行程序的程序描述符
x86系統中,current把棧指標的後13個有效位遮蔽掉,用來計算出thread_info的偏移(通過current_thread_info函式)
8.程序在任何時刻,都必定處於五種狀態中的一種
task_running
task_interrupt
task_uninterrupt
task_traced
task_stopped
9.設定程序當前狀態
10.呼叫set_task_state(task,state)函式將程序設定為指定狀態
11.程序上下文
可執行**從乙個可執行檔案載入到程序的位址空間執行。當乙個程式執行了系統呼叫,核心就會「代表程序執行」並處於程序上下文中
對比:在中斷上下文中,系統不代表程序執行——不會有程序去干擾這些中斷處理程式
程序繼承關係
所有的程序都是pid為1的init程序的後代
fork()通過拷貝當前程序建立乙個子程序
exec()負責讀取可執行檔案並將其載入位址空間開始執行寫時拷貝
linux的fork()使用寫時拷貝推遲甚至免除拷貝。核心在建立新程序的時候並不複製整個位址空間,而是讓父程序和子程序共享同乙個拷貝;直到子程序/父程序需要寫入的時候才進行拷貝
因而,fork的實際開銷只是複製父程序的頁表以及給子程序建立唯一的程序描述
linux通過clone系統呼叫實現fork
由clone去呼叫do_fork()
定義在中的do_fork()完成建立中的大部分工作,它呼叫copy_process函式,然後讓程序開始執行
在linux系統中,執行緒僅僅被視為乙個與其他程序共享某些資源的程序。每個執行緒都有自己的task_struct
建立執行緒:與普通程序類似,只不過在呼叫clone()的時候需要傳遞一些引數標誌來指明共享的資源
它只能通過其他核心執行緒建立;核心通過kthread核心程序衍生所有的核心執行緒
新建立的執行緒處於不可執行狀態,直到wake_up_process()明確地喚醒它
該任務是和清理工作分開進行的,因為這樣在程序終結之後系統仍然可以獲得它的資訊
通過release_task()實現程序描述符的刪除
至此,所有資源都被釋放了
概述:父程序在程序之前退出,就會遺留下子程序,也就是孤兒程序
解決方法:在當前的執行緒組內給孤兒程序尋找新的父程序;否則直接以init作為其父程序
第三章 核心物件
一 核心物件 1 每個核心物件都是一片兒記憶體 資料結構 由系統核心分配與訪問。2 令牌物件,事件物件,程序物件,訊號量物件,執行緒物件等都是核心物件。3 核心物件有安全限制,在建立之初就需要傳入乙個結構security attributes的安全描述符 4 類似的還有使用者物件和gdi物件等等,它...
第三章 核心結構
2016 07 05 lt os cfg.h中的核心功能函式 os enter critical os exit critical osinit osstart osintenter osintexit osschedlock os sched lock en osschedunlock os sc...
Linux複習第三章
第三章 系統管理 1 linux系統中的使用者大體上可分為三組,分別為 管理員 普通使用者和 系統使用者 r itheima。刪除使用者的命令為userdel 選項 r會在刪除使用者的同時,刪除與使用者相關的檔案。因此本題的答案為 userdel r itheima。3 在linux系統中用於切換使...