每個程序和執行緒都會通過task_struct 這麼乙個結構體去維護
這個結構體主要就是儲存著程序或執行緒在記憶體排程所使用的資源
struct task_struct
;
於是 我們就有了這麼一張圖
mm_struct每個程序都會維護乙份屬於自己乙個結構體 然而每個執行緒都會共享程序的這個mm_struct
於是我們有了這張圖
那麼除了這個mm_struct結構體是否還有其他資料是共享的呢,當然有了,跟蹤一下fork 和pthread_create的排程流程
fork 和pthread_create都會呼叫核心的_do_fork,關鍵函式是copy_process
long
do_fork
(unsigned
long clone_flags,
unsigned
long stack_start,
unsigned
long stack_size,
int __user *parent_tidptr,
int __user *child_tidptr)
long
_do_fork
(unsigned
long clone_flags,
unsigned
long stack_start,
unsigned
long stack_size,
int __user *parent_tidptr,
int __user *child_tidptr,
unsigned
long tls)
我們看一下copy_process幹了什麼事情,這個核心解釋以及很明顯了,主要是根據flag去拷貝old one!!!,主要是程式執行的暫存器資訊和合適的程序變數
/*1.執行緒是共享程序部分記憶體,所以記憶體的使用率降低了
2. linux下核心其實本質上沒有執行緒的概念, linux下執行緒其實上是與其他程序共享某些資源的程序而已
無論是程序還是執行緒 在核心這邊都統一叫做執行緒,核心維護著乙個runqueue指向就緒態的執行緒表,待條件滿足進行排程。
所以如果要說執行緒開銷小 程序開銷大 實際是只的就是記憶體的開銷,cpu每一次fork都要申請新的頁表來維護vm、file、fs、signal操作,除了消耗了記憶體 也消耗了cpu的執行指令。
建立守護程序的深入分析
原文 建立守護程序的過程有兩種 一 fork兩次 int main 二 int main 其實兩種方法在某種程度上來說都可以,但是double fork會帶來一些區別。首先,我們得搞清楚這些 都幹了什麼 1 第一次fork,確保當前的process一定不是session leader,關於sessi...
深入分析 和equals的區別
和equals是非常常見的面試題。共同點 都可以做比較,返回值都是boolean 區別 1.是比較運算子,即可以比較的基本資料型別,也可以比較引用資料型別。基本資料型別比較的是值,引用資料型別比較的是記憶體位址值 2.equals方法只能比較的是引用資料型別,equals方法在沒有重寫是比較的是位址...
深入分析java執行緒中的volatile
平時在閱讀jdk原始碼的時候,經常看到原始碼中有寫變數被volatile關鍵字修飾,但是卻不是十分清除這個關鍵字到底有什麼用處,現在終於弄清楚了,那麼我就來講講這個volatile到底有什麼用吧。當乙個變數被定義為volatile之後,就可以保證此變數對所有執行緒的可見性,即當乙個執行緒修改了此變數...