2013-10-30 52 views
5

我在進程ID和線程ID之間存在一些混淆。我已經經歷了幾個網頁後消失了,包括堆棧溢出here,它說線程ID和進程ID之間的關係

開始一個新的進程爲您提供了一個新的PID和新TGID,同時啓動一個新的線程爲您提供了一個新的PID,同時保持相同TGID 。

所以當我運行一個程序時,爲什麼從程序創建的所有線程都沒有不同的PID?

我知道在編程中,我們通常說的主要是一個線程和執行從主開始,所以,如果我從主創建多個線程,所有的線程將具有相同的PID等於主要的PID。

所以我想問的就是如下:

1)當我們運行程序就會運行一個進程或線程?

2)main線程創建線程和進程創建線程有什麼區別嗎?

3)linux中的線程和進程有什麼區別嗎?因爲我在某處讀過linux並沒有區分Thread和Process。

+0

[difference-between-pid-and-tid]的可能重複(http://stackoverflow.com/questions/4517301/difference-between-pid-and-tid)。 – rodrigo

+0

我不認爲這是http://stackoverflow.com/questions/4517301/difference-between-pid-and-tid的重複。當我們運行一個程序並創建線程時,我在這裏詢問線程和進程ID。 – neo

+1

@mohit ::通過這個[鏈接](http://stackoverflow.com/questions/19676071/understanding-pthreads),我剛剛幾個小時前發佈。 –

回答

1

我在stackoverflow上得到了答案here。它指出如果我們在Linux上運行一個包含libc libuClibc-0.9.30.1.so(1)的程序。基本上是舊版本的的libc然後線程創建將具有不同的PID如下所示

[email protected]:~# ./test 
main thread pid is 1151 
child thread pid is 1153 

,我試圖與包含的libc從ubuntu的libc6的(2),即新的libc的版本,那麼線程一個Linux運行此程序所創建的將具有與該過程相同的PID。

$ ./test 
main thread pid is 2609 
child thread pid is 2609 
The libc (1) use linuxthreads implementation of pthread 

而且提供的libc(2)使用NPTL( 「本地POSIX線程庫」)執行並行線程

的按照linuxthreads FAQ(在J.3答案):

每個線程真是一個截然不同的PID過程,並且信號發送到PID的一個線程只能通過那個線程來處理

所以在舊的libc裏面用linuxthreads實現,每個線程都是ha s其獨特的PID

在使用NPTL實現的新libc版本中,所有線程都具有與主進程相同的PID。

NPTL是由redhat團隊開發的。並根據redhat NPTL document:其一這是在NPTL實現解決的問題是:

(Chapter: Problems with the Existing Implementation, page5) 

Each thread having a different process ID causes compatibility problems with other POSIX thread implementations. This is in part a moot point since signals can't be used very well but is still noticeable

這說明這個問題。

我正在使用包含pthread的NPTL(「Native posix線程庫」)實現的新libc版本。

10

簡化了一下:

  1. PID是進程ID,TID是線程ID。關於fork()創建的第一個線程,PID = TID。如果在進程內創建更多線程,使用clone()命令,則PID和TID將不同,PID將始終小於TID。

  2. 不,沒有區別,除非可能是如果main被殺死,所有其他線程也被殺死。

  3. 是的,該線程是實際上預定的。從技術上講,這個過程只是不同代碼段(text,bss,stack,heap和OS)的內存映射。

+4

展開你的3.一個進程*存在*,一個線程*做*。 – Adam

+0

@亞當:哈,這很酷,從來沒有聽說過。感謝你的比喻。 –

+0

+1用於回答我對TID和PID是否與主線程相同的懷疑 – pRAShANT

0

你會得到相同的進程ID的所有線程共享這是你的過程,所以當你打電話的進程ID,你會得到相同的程序數據。

1

您已經顯示的帖子描述了Linux線程實現,我認爲這是Linux實現的老版本,其中線程被創建爲不同的進程。 在線程的POSIX實現中,線程並不是作爲一個不同的進程創建的,而是創建了不同的並行執行代碼的流,這些並行執行的並行執行中有一些組件,其中的信息由Thread Descriptor存儲TID。 雖然創建多個線程的進程可以被稱爲多線程進程,因此它的所有線程具有相同的PID,但具有不同的TID。主進程創建線程可以稱爲主線程

4

這種混淆來自Linux的任務概念。

在Linux中,任務和線程之間幾乎沒有區別。

每個進程都是一個獨立的虛擬機,至少運行一項任務。

每個任務都是流程範圍內的獨立執行單元。

進程的主要任務是爲進程提供任務ID(TID),因爲它是進程ID(PID)。

在流程中產生的每個新線程都會在其中創建一個新任務。爲了在內核中單獨識別,他們被分配了他們自己的個人任務ID(TID)。

進程中的所有任務共享相同的任務組標識(TGID)。

+0

所以當我在一個進程中創建多個線程時,所有線程的pid是相同還是不同? – neo

+0

他們在技術上是TIDs,他們會有所不同。檢查'/ proc/[pid]/tasks'。進程ID PID將等於主線程的TID,並且當您解決該PID時,您將尋址主線程。 –