程序 輕量級程序(LWP) 執行緒

2022-08-12 00:33:11 字數 2918 閱讀 3899

程序描述符

每程序有自己的thread_info, (分配釋放函式: alloc_thread_info, free_thread_info)

執行緒組id(tgid),用lwp實現多執行緒支援

程序組id(pgrp)。

回話的id(session).

管理id資料結構——雜湊表管理 (利用id找到所用相關的pd,方便)。

程序組id(pgrp), 回話id(session)在共享訊號的資料結構裡。因為同一程序內的所有lwp,這兩個id都是一樣的

監控(自己起的名字,類似於監護。由於管理方式相同,也歸為家族關係)

在煉表裡為了管理方便:

鎖住記憶體大小

程序頁數 (只有記錄,沒有限制)

堆大小,棧大小

資源相關:

程序同步與通訊

相關資料結構 和 處理流程

只有超級使用者才能增大資源限制。

一般使用者登陸時:

阻塞不可中斷阻塞,task_uninterruptible

組織pb的結構:等待列隊: 每一類事件乙個列隊,用內嵌鍊錶實現(雖然沒列出內嵌鍊錶節點)

列隊節點:

停止追蹤task_traced

組織pb的結構:fixme: 訊號的等待列隊?

退出退出_死亡exit_dead

組織pb的結構:不掛到佇列上,只在家族關係中,等待父程序收回資源

程序控制 :

變化:變化

原來用硬體指令()儲存cpu資訊。後來改成軟體(乙個個mov指令)

對於一些暫存器(ds、es)可以檢查值。

與用硬體指令儲存時間差不多。

switch_to 巨集

步驟:呼叫__switch_to ()函式,該函式動作如下:

更新cpu的暫存器(pd->thread (tss) 與 cpu暫存器交換資料):

返回如果next不是新程序:

任務狀態段(乙個存cpu狀態的陣列,tss_struct init_tss)

程序切換時,更新tss上的資訊。

tss的描述符在gdt裡。

路徑和許可權設定:

執行緒通訊

程序關係

同乙個執行緒組: clone_thread. 屬於同乙個程序(執行緒組)

都被trace: clone_ptrace

子程序不被trace: clone_untrace (核心設定, 覆蓋clone_ptrace)

返回tid

子程序的狀態:

程序死亡或exec通知:

賦給子程序的資源

返回子程序tid的位址

clone, fork, vfork實現方式

區別在於:

fork, vfork:

使用者棧: 都是父程序的棧.

parent_tidptr, child_ctidptr都是null.

複製程序描述符(copy_process)

複製程序描述符

相關計數加1: (此處先相關計數檢查, 都通過後再都加1)

新程序的可執行格式的引用計數(fixme: pd裡標有可執行個數嗎)

系統執行fork總數.

程序pd的關鍵域的設定(順序與原始碼可能不一致):

拷貝資源(如果clone_flags沒標明共享):

設定子程序的核心棧(thread_info), 核心態相關暫存器(thread_struct, 不知道這個結構的具體用處): copy_thread()

設定子程序的核心棧:

設定排程資訊(sched_fork())

其他:pd->flags: 清除pf_superpriv , 設定pf_forknoexec

大核心鎖 pd->lock_depth = -1

exec次數: pd->did_exec = 0

拷貝child_tidptr到pd->set_child_tid. 以備子程序開始執行時, 把tid放到自己記憶體空間的child_tidptr

返回pd

設定父子程序的執行狀態, 排程資訊

設狀態,入列隊:如果有clone_stopped位, 子程序設為stopped狀態; 否則呼叫wake_up_new_task(), 把子程序加入就緒列隊:

如果不同cpu上執行, 或者共享頁表, 子程序放在列隊最後

如果父程序處於被除錯狀態, 程通知偵錯程式

設定父程序狀態

返回子程序的pid.

子程序被排程後,執行pd.thread.eip(ret_from_fork). 呼叫關係(=>): ret_from_fork=>schedule_tail=>finish_task_switch.

新執行緒被排程後. 由ret_from_fork, 用regs恢復暫存器, 開始執行kernel_thread_helper

kernel_thread_helper: 把args壓入棧, call fn(args, fn都暫存器中)

典型的核心執行緒:

功能使能中斷

建立核心執行緒1, (函式是init)

進入idle

程序1:

其他核心執行緒:

管理資源:

程序銷毀

do_group_exit流程: (整個組內至少有乙個執行緒呼叫它, 用於整組協調)

呼叫do_exit, 使本執行緒退出

do_exit流程:

釋放資源:

如果這個執行緒的函式實現了一種可執行格式, 可執行格式數的引用計數--; fixme: 還沒看到這塊兒, 湊合翻譯的不一定對

改變父子關係, 並向父程序發訊號, 改變自己的狀態(exit_notify)

向父程序發訊號

殭屍自己或直接死亡,  並設定pf_dead位

否則: 殭屍

整理"殭屍"與"發臨殭屍訊號"的關係:

排程. 排程函式會忽略殭屍程序, 但會減少殭屍程序的pd的使用計數; 會檢查pf_dead位, 把它變成exit_dead狀態

程序移除 todo:

程序和和輕量級程序

在多執行緒程式中,乙個新的執行緒通常由乙個程序呼叫phtread create 函式而誕生的。新執行緒建立後,通常將這個程序稱為主線程。你也許會有所迷惑 乙個程序怎麼會程式設計執行緒?此刻有幾個執行緒,幾個程序?其實通過上文對執行緒 輕量級程序以及執行緒組之間關係的理解後,這個問題似乎也不難回答。我...

linux核心 程序,輕量級程序,執行緒,執行緒組

本篇文章將介紹本人對以下問題的理解。1 程序 輕量級程序 執行緒 執行緒組之間的關係 2 及它們的標識相關說明 一 程序 輕量級程序 執行緒 執行緒組之間的關係 借助上圖說明 程序p0有四條執行流,即執行緒,主線程t0是它的第乙個執行緒,且與程序p0相關聯,之後衍生出t1 t2 t3三個執行緒,這三...

程序 輕量級程序和執行緒的一些點

從核心觀點看,程序的目的就是擔當分配系統資源 cpu 時間 記憶體等 的實體。程序是資源管理的最小單位,執行緒是程式執行的最小單位。在作業系統設計上,從程序演化出執行緒,最主要的目的就是更好的支援 smp以及減小 程序 執行緒 上下文切換開銷。最初的程序定義都包含程式 資源及其執行三部分,其中程式通...