本文的主要目的是介紹在Linux內核中,task,process, thread這3個名字之間的區別和聯系。並且和WINDOWS中的相應觀念進行比較。如果你已經很清楚了,那么就不用往下看了。
LINUX版本:2.6.18
ARCH: X86
首先要明確的是,按照LKD 2里面的說法,LINUX和其他OS 比如WINDOWS, SOLARIS之間一個很大的不同是沒有嚴格定義的線程(thread)。那么你也許會問,如果LINUX中沒有線程,那么如何來表示類似WINDOWS 線程的那種執行觀念呢?答案是LINUX中,PROCESS(進程)可以當作線程。
那么你也許又會問,WINDOWS中的多線程程序在LINUX中是怎樣表示的呢?具體來說,LINUX中的PROCESS有2種。一種是獨立的 PROCESS。自己有自己的地址空間,資源列表,代碼等。另外一種PROCESS是和其他PROCESS共享一個地址空間,資源列表的。這種 PROCESS就類似於WINDOWS中的線程。
在看LINUX內核代碼的時候,你會同時看到process, task, thread這3個名字。下面簡要介紹下他們之間的區別:
1、task 可以理解為一個LINUX PROCESS。最著名的定義TASK的數據結構叫做struct task_struct, 在linux\sched.h中。我覺得這個名字起得不好。因為大家都已經對PROCESS, THREAD之類得觀念很熟悉了。現在又冒出來個TASK,很容易讓人搞混。不過也許是歷史原因吧。這個TASK一直保留着。
在 task_struct 中有一堆的成員。其中有PID 和TGID. PID實際上類似於WINDOWS中的THREAD ID。而TGID (thead group id) 對應於WINDOWS中的PID。PID對於獨立的PROCESS來說,就是它的PID。這時PID == TGID。對於和其他PROCESS共享地址空間的PROCESS來說,每個都有獨立的PID,但是他們的TGID是一樣的。
2、thead雖然說LINUX不支持THREAD. 但是在內核代碼里又可以看到THREAD這個名字。這時可以把他們和WINDOWS中的THREAD對應起來。一個比較著名的是thread_info 結構。
3、kernel thread在LINUX中,kernel thread是一個專門的名詞。它的特點是沒有獨立的地址空間(MM結構為NULL). 他們只運行在KERNEL SPACE.不能切換到USER SPACE。
最后,總結下,在LINUX中,一個PROCESS即可能是一個WINDOWS PROCESS類似的觀念,也可能是一個與WINDOWS THREAD類似的觀念。而且有時還被叫做TASK(感覺有點亂)。不過最常用的還是與WINDOWS PROCESS類似的觀念。比如在內核代碼中有一個for_each_process宏。它就是只遍歷那些主要的,獨立的PROCESS。
參考資料:
1、LKD 2
2. http://blog.csdn.net/pppjob/archive/2009/02/05/3864020.aspx