1. 程式人生 > 其它 >啥叫核心執行緒-蒐集

啥叫核心執行緒-蒐集

引子

看程序排程時,介紹優先順序相同時的一些特殊處理,說當候選多給程序優先順序相同時,一些傾向選擇,有提到候選的程序和之前執行的程序有相同的程序空間時,會被優先選擇。

而什麼時候會出現這種兩個程序使用相同的程序空間呢,說了兩種情況,一個很熟悉的就是兩個排程物件是痛一個程序中的兩個執行緒物件時。

另一個說的是備選程序是核心執行緒時,這時這個執行緒會借用上個程序的地址空間。 那什麼是核心執行緒??

核心執行緒:(感覺又踩了個大坑)

簡述

網上搜的一個說的是核心執行緒,另一個經常混雜在一起說的時執行緒模型裡面的 1對1,1對n之類的東西。

著兩個東西是一個東西麼,多半不是。兩者什麼關聯呢?

感覺分別是 核心執行緒/核心程序/核心守護程序 和 核心級執行緒的兩個概念。

先看一個說法-(核心級的執行緒)

linux對多執行緒的支援,要做的工作中很重要一部分集中在如何將使用者級的執行緒對映到核心級的執行緒。

這裡涉及到兩個專案(概念):

NGPT(New Generation POSIX Thread):下一代POSIX執行緒

NPTL(Native POSIX Thread Library):本地POSIX執行緒庫

為了減少分化,2002年NGPT逐漸停止新增功能。NPTL成為新標準。pThread庫使用NPTL。

對於cpu資源的排程分配,分配的物件被一些人稱為核心級執行緒,其實就是連結串列中的一個連結串列元素。

linux裡這個元素對於一個程序(一個執行緒也是一個特殊的程序)

所謂1:1模型,就時這個核心元素對應使用者態一個程序(執行緒)。

除了1對1海域1對N,N對M,混合型,混合型應該和N對M不是同一個概念,有時間再細究。

怎麼個1對N?

這些應該都是指對核心實現上。

如果應用層,比如像Go語言,對分配給自己的執行緒資源再做排程分配,這算1:N麼?

網上所表述的核心級執行緒應該指的是核心排程的物件。使用者態執行緒應該就時在程序中表現的程式碼執行流塊。

再看另一個-核心守護程序

在使用ps檢視執行緒的時候,CMD列會有不少[...]名稱的執行緒,這些有別於其它執行緒,都是核心執行緒。

《unix環境高階程式設計》書中13章介紹系統程序:

父程序id為0的多為系統程序

,……核心程序是特殊的通常存在於系統的整個生命週期中。它們以超級使用者特權執行,無控制終端,無命令列。

ps輸出例項中,核心守護程序的名字出現在方括號中。該(哪個)版本的Linux使用一個名為kthreadd的特殊核心程序來建立其他核心程序,所以kthreadd表現為其他核心程序的父程序。對於需要在程序上下文執行工作但卻不被使用者層上下文呼叫的每個核心元件,通常有它自己的核心守護程序。

(後面介紹了kswapd、flush、sync_supers、jbd這幾個核心守護程序的工作職能。核心守護程序似乎是更標準通用的叫法)

inetd守護程序

nfsd、nfsiod、lockd、rpciod、rpc.idmapd、rpc.statd、rpc.mountd守護程序提供對網路檔案系統(NFS)的支援。注意前4個是核心守護程序,後3個是使用者守護程序

守護程序終端名設定為問號

使用者層守護程序的父程序是init程序

task_struct->mm是空指標,由於核心執行緒沒有mm,所以在程序切換時,並不需要切換TLB,這就提供了優化。

為什麼要分核心程序或執行緒,這,應用層程式都設計為多執行緒,核心功能程式碼也有同樣設計的理由吧。

核心功能分多個執行緒(程序)來執行,來被排程,也減少不同功能之間的干擾。

程序執行的核心態和使用者態切換,切換為核心態的時候,是複用/借用/呼叫某個核心守護程序來給自己執行需求麼?我感覺不是,因為即使核心守護程序沒有程序地址,它也是有自己獨立任務的,一個側面證明是,不同的程序或執行緒,都是有自己的核心棧的,核心守護程序也是。

個人認為執行緒執行系統呼叫進入核心態執行和原本一直都處於核心態的核心守護程序的某次被排程執行時兩個不同的概念。

系統守護程序被排程,它是沒有使用者級的記憶體空間的,它應該也是不需要的,所以它可以直接借用之前被排程的程序的上下文(其實不是借用,而是用不到,也就省掉修改及做相關切換了),所以才有了程序排程時優先選擇這一個可以減少切換的任務的說法。

其他不明確

而init似乎被稱為系統守護程序

《linux環境程式設計》中介紹 “PID上看,核心在kernel/pid.c中定義了RESERVED_PIDS,其值是300,300以下的pid會被系統佔用,不分配給使用者程序。”,那這些保留的PID時給這些核心執行緒的嗎?

題外話

因為linux執行緒是複用程序的一套東西發展出來的,兩者很多模糊的地方。網上很多時候喜歡把一些描述中程序的關鍵詞又備註稱為執行緒,可能是從標準理論的基礎上來看的。

但是從實現的方面來看,有時候我個人更喜歡把執行緒當作程序來看,或者,特別是在排程的時候,把兩者都統稱為任務。

比如資料【3】中開頭便說“我們通常說的 Linux 中的“程序”,實際對應的是“執行緒”,…”。我感覺反過來說更容易理解:執行緒實際是個程序,只是和主執行緒共享同一個程序地址。

參考資料:

【1】普通執行緒和核心執行緒 https://www.cnblogs.com/alantu2018/p/8526916.html

【2】核心排程模型(原文標題:關於核心執行緒、使用者執行緒概念的理解) https://www.cnblogs.com/logo-fox/p/11057166.html

【3】linux執行緒實現機制分析 https://tcore.cloud/2019/06/21/linux-thread/

【4】https://www.jianshu.com/p/5a4fc2729c17

資料【2】並非原文,而且還把文章標題改了。文章下面標記了轉自出處,但是那個原出處 文章,雖然有排版縮排,但是圖片看不到了,到是【2】連結中圖片還保留著,想了還是留【2】這個連結吧。

先記這麼多,感覺這個支線已經花費太多了,以後再繼續這塊整理收集修正吧