Linux中的task,process, thread 簡介


本文的主要目的是介紹在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM