Linux上有3種調(diào)度的單位,內(nèi)核線程(或者叫核心進程)、用戶進程、用戶線程
其中內(nèi)核線程和用戶進程,由kernel統(tǒng)一調(diào)度,但用戶線程是由用戶進程在kernel的調(diào)度下,自己完成調(diào)度的,在用戶態(tài)完成。
用戶線程:posix
輕量級線程:
內(nèi)核線程擁有 進程描述符、PID、進程正文段、核心堆棧
當(dāng)和用戶進程擁有相同的static_prio 時,內(nèi)核線程有機會得到更多的cpu資源
內(nèi)核線程的bug直接影響內(nèi)核,很容易搞死整個系統(tǒng)
內(nèi)核線程不需要訪問用戶空間內(nèi)存,這是再好不過了。所以內(nèi)核線程的task_struct 的mm域為空
但是剛才說過,內(nèi)核線程還有核心堆棧,沒有mm怎么訪問它的核心堆棧呢?這個核心堆棧跟task_struct的
thread_info共享8k的空間,所以不用mm描述。
但是內(nèi)核線程總要訪問內(nèi)核空間的其他內(nèi)核啊,沒有mm域畢竟是不行的。
所以內(nèi)核線程被調(diào)用時,內(nèi)核會將其task_strcut 的active_mm指向前一個被調(diào)度出的進程的mm域
,在需要的時候,內(nèi)核線程可以使用前一個進程的內(nèi)存描述符。
因為內(nèi)核線程不訪問用戶空間,只操作內(nèi)核空間內(nèi)存,而所有進程的內(nèi)核空間都是一樣的。這樣就省下了一個mm域的內(nèi)存。
用戶進程擁有 進程描述符、PID、進程正文段、核心堆棧 、用戶空間的數(shù)據(jù)段和堆棧
用戶線程擁有進程描述符、PID、進程正文段、核心堆棧,同父進程共享用戶空間的數(shù)據(jù)段和堆棧
用戶線程也可以通過exec函數(shù)族擁有自己的用戶空間的數(shù)據(jù)段和堆棧,成為用戶進程。