新聞中心
Linux操作系統(tǒng)的內(nèi)核是一個非常復(fù)雜的軟件系統(tǒng),它承擔(dān)了整個操作系統(tǒng)的核心任務(wù)。線程是Linux操作系統(tǒng)中非常常見的概念,線程的創(chuàng)建機(jī)制也是Linux內(nèi)核中非常重要的一部分。本文將深入探究Linux內(nèi)核中線程創(chuàng)建的神奇機(jī)制。

一、線程的定義
線程是一種輕量級的進(jìn)程,也可以稱為輕量級進(jìn)程,是程序執(zhí)行流的最小單位。一個進(jìn)程可以包含多個線程,線程之間共享進(jìn)程所擁有的資源。線程與進(jìn)程的主要區(qū)別在于,進(jìn)程是一個擁有資源的獨(dú)立單位,而線程則是由進(jìn)程創(chuàng)建,它與創(chuàng)建它的進(jìn)程共享資源。
二、線程創(chuàng)建的過程
在Linux操作系統(tǒng)中,線程的創(chuàng)建主要包括以下四個步驟:
1. 分配線程所需要的??臻g
線程使用棧存儲函數(shù)調(diào)用過程中的本地變量和函數(shù)返回地址。??臻g是在線程創(chuàng)建時分配的,Linux內(nèi)核為每個線程分配一個??臻g,棧的大小可以通過參數(shù)來進(jìn)行設(shè)置。
2. 創(chuàng)建線程的task_struct結(jié)構(gòu)體
線程的task_struct結(jié)構(gòu)體是Linux內(nèi)核中表示進(jìn)程/線程的數(shù)據(jù)結(jié)構(gòu),每個線程在創(chuàng)建時都會分配一個對應(yīng)的task_struct結(jié)構(gòu)體。該結(jié)構(gòu)體內(nèi)包含了線程的各種屬性,例如線程ID、進(jìn)程ID、調(diào)度實(shí)體、狀態(tài)、棧等信息。
3. 設(shè)置線程的屬性
創(chuàng)建線程后,需要設(shè)置線程的一些屬性,例如線程的優(yōu)先級、調(diào)度策略、信號屏蔽、棧指針等。這些屬性設(shè)置完成后,線程就可以被調(diào)度器進(jìn)行調(diào)度了。
4. 把線程添加到進(jìn)程的線程鏈表中
新創(chuàng)建的線程需要添加到進(jìn)程的線程鏈表中,這樣才能被進(jìn)程管理。在Linux內(nèi)核中,每個進(jìn)程都會維護(hù)一個線程鏈表,所有的線程都被添加到該鏈表中。線程創(chuàng)建完成后,就可以通過調(diào)度器進(jìn)行調(diào)度了。
三、線程調(diào)度的機(jī)制
在Linux操作系統(tǒng)中,線程的調(diào)度是由調(diào)度器進(jìn)行管理的。調(diào)度器負(fù)責(zé)把CPU的使用權(quán)分配給不同的線程,以實(shí)現(xiàn)多任務(wù)并發(fā)執(zhí)行。線程被調(diào)度時,調(diào)度器會按照其優(yōu)先級和調(diào)度策略來進(jìn)行調(diào)度,使得優(yōu)先級較高的線程優(yōu)先被執(zhí)行。
Linux內(nèi)核中有多種調(diào)度策略,包括實(shí)時調(diào)度策略和普通調(diào)度策略。實(shí)時調(diào)度策略是一種優(yōu)先級調(diào)度策略,適用于對響應(yīng)時間要求較高的應(yīng)用場景,例如實(shí)時音視頻應(yīng)用。普通調(diào)度策略采用搶占式調(diào)度策略,適用于對響應(yīng)時間要求不太高的應(yīng)用場景,例如桌面應(yīng)用、服務(wù)器應(yīng)用等。
四、線程創(chuàng)建的時序圖
下圖是關(guān)于Linux內(nèi)核中線程創(chuàng)建的時序圖,從中可以清晰地了解到線程創(chuàng)建的過程和機(jī)制。
圖1:Linux內(nèi)核中線程創(chuàng)建的時序圖。
(圖片來源:https://elixir.bootlin.com/linux/latest/source/kernel/fork.c#L1552)
五、
本文從線程的定義、線程創(chuàng)建的過程、線程調(diào)度的機(jī)制、線程創(chuàng)建的時序圖等多個方面深入探究了Linux內(nèi)核中線程創(chuàng)建的神奇機(jī)制。線程是Linux操作系統(tǒng)中非常重要的概念,對于使用Linux的開發(fā)者來說,深入了解線程的創(chuàng)建機(jī)制可以更好地理解Linux內(nèi)核的運(yùn)作原理,也可以更好地進(jìn)行Linux應(yīng)用程序的開發(fā)。
相關(guān)問題拓展閱讀:
- linux進(jìn)程、線程及調(diào)度算法(二)
- 在linux編為什么要創(chuàng)建線程
linux進(jìn)程、線程及調(diào)度算法(二)
執(zhí)行一個 copy,但是只要任何修改,都造成分裂如,修改了chroot,寫memory,mmap,sigaction 等。
p1 是一個 task_struct, p2 也是一個 task_struct. linux內(nèi)核的調(diào)度器只認(rèn)得task_struck (不管你是進(jìn)程還是線程), 對其進(jìn)行調(diào)度。
p2 的task_struck 被創(chuàng)建出來后,也有一份自己的資源。但是這些資源會短暫的與p1 相同。
進(jìn)程是區(qū)分資源的單位,你的資源是我的資源,那從概念上將就不叫進(jìn)程。
其他資源都好分配,唯一比較難的是內(nèi)存資源的重新分配。
非常簡單的程序,但是可以充分說明 COW。
結(jié)果:10 -> 20 -> 10
COW 是嚴(yán)重依賴于CPU中的MMU。CPU如果沒有 MMU,fork 是不能工作的。
在沒有mmu的CPU中,不可能執(zhí)行COW 的,所以只有vfork
vfork與fork相比的不同
P2沒有自己的 task_struct, 也就是說P1 的內(nèi)存資源 就是 P2的內(nèi)存資源。
結(jié)果 10,20,20
vfork:腔寬者
vfork 執(zhí)行上述流程,P2也只是指向了P1的mm,那么將這個vfork 放大,其巧旅余的也全部clone,共同指向P1,那么就是線程的屬性了。
phtread_create -> Clone()
P1 P2 在內(nèi)核中都是 task_struct. 都可以被調(diào)度。共享資源可調(diào)度,即線程。
這就是線程為什么也叫做輕量級進(jìn)程
不需要太糾結(jié)線程和進(jìn)程的區(qū)別。
4651 : TGID
, 4653 tid 內(nèi)核中 task_struct 真正的pid
linux 總是白發(fā)人 送 黑發(fā)人。如果父進(jìn)程在子進(jìn)程推出前掛掉了。那么子進(jìn)程應(yīng)該怎么辦?
p3 -> init, p5 -> subreaper
每一個孤兒都會找最近的火葬場
可以設(shè)置進(jìn)程的屬性,將其變?yōu)閟ubreaper,會像1號進(jìn)程那樣收養(yǎng)孤兒進(jìn)程。
linux的進(jìn)程睡眠依靠等待隊(duì)列,這樣的機(jī)制類似與涉及模式中的訂閱與發(fā)布。
睡眠,分兩種
每一個進(jìn)程都是創(chuàng)建出來的,那么之一個進(jìn)程是誰創(chuàng)建的呢?
init 進(jìn)程是被linux的
0 進(jìn)程
創(chuàng)建出來的。開機(jī)創(chuàng)建。
父進(jìn)程就是 0 號進(jìn)程,但在pstree,是看不到0進(jìn)程的。因?yàn)?進(jìn)程創(chuàng)建子進(jìn)程后,就退化成了idle進(jìn)程。
idle進(jìn)程是 linux內(nèi)核里,特殊調(diào)伍薯度類。
所有進(jìn)程都睡眠停止
,則調(diào)度idle進(jìn)程,進(jìn)入到 wait for interrupte 等中斷。此時 cpu及其省電,除非來一個中斷,才能再次被喚醒。
喚醒后的任何進(jìn)程,從調(diào)度的角度上說,都比idle進(jìn)程地位高。idle是調(diào)度級別最更低的進(jìn)程。
0 進(jìn)程 一跑,則進(jìn)入等中斷。一旦其他進(jìn)程被喚醒,就輪不到 0進(jìn)程了。
所有進(jìn)程都睡了,0就上來,則cpu需要進(jìn)入省電模式
在linux編為什么要創(chuàng)建線程
也可以不用創(chuàng)建線程啊
如果你的程序單個進(jìn)程可以源早指完成需求,那么就不用創(chuàng)建線程。
當(dāng)你的需求需要多個任務(wù)進(jìn)行協(xié)雹配同處理時,那么需要你創(chuàng)建多個線程或者進(jìn)程來進(jìn)行處理。
舉個簡單的例子,如果公路上有很多車,你現(xiàn)在是一車道,那么你有1倆車,這條公路就能滿足現(xiàn)在的需求。
但是如果你現(xiàn)在又1W輛車,那么你需要4車道或者8車道來運(yùn)行,才能滿足1W輛車睜肢的需求。
linux 內(nèi)核 線程 創(chuàng)建的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于linux 內(nèi)核 線程 創(chuàng)建,深入探究Linux內(nèi)核:線程創(chuàng)建的神奇機(jī)制,linux進(jìn)程、線程及調(diào)度算法(二),在linux編為什么要創(chuàng)建線程的信息別忘了在本站進(jìn)行查找喔。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
文章名稱:深入探究Linux內(nèi)核:線程創(chuàng)建的神奇機(jī)制(linux內(nèi)核線程創(chuàng)建)
當(dāng)前URL:http://m.fisionsoft.com.cn/article/djgpepe.html


咨詢
建站咨詢
