程序和和輕量級程序

2021-07-15 08:41:34 字數 1888 閱讀 1411

在多執行緒程式中,乙個新的執行緒通常由乙個程序呼叫phtread_create()函式而誕生的。新執行緒建立後,通常將這個程序稱為主線程。你也許會有所迷惑:乙個程序怎麼會程式設計執行緒?此刻有幾個執行緒,幾個程序?

其實通過上文對執行緒、輕量級程序以及執行緒組之間關係的理解後,這個問題似乎也不難回答。我們可以將所有的程序都看作乙個執行緒組,只不過普通程序的執行緒組只包含它自己乙個執行緒,它不能與其他執行緒共享資源,只能獨享自己的資源(而成為程序)。

對於多執行緒程式來說,一旦在程序內建立了乙個執行緒,那麼該程序也就搖身變成了乙個執行緒。主線程和子執行緒共享「以前」那個程序所獨享的資源。主線程和子執行緒之間是並列關係,不存在類似fork()函式那樣的父子程序關係,這也就是不將建立執行緒的程序稱為父執行緒的原因。

如果你還對上述的描述有所疑惑,那麼通過下面的實驗結果可以理解的更加深刻。下述的程式就是乙個普通的執行緒建立,只不過主線程和子執行緒增加了延時以方便我們檢視實驗結果。

int *thread(void* arg)

int main()

printf("my id is %lu, new thread id is %lu\n", pthread_self(), thid);

sleep(1000);

return 0;

}

我們帶開乙個終端(稱為終端1)執行上述程式,再另乙個終端(稱為終端2)裡使用ps -elf命令檢視系統當前的執行緒資訊。

1uid        pid  ppid   lwp  c nlwp stime tty          time cmd

2edsionte  2210  2208  2210  0    1 09:10 pts/0    00:00:00 bash

3edsionte  2429  2210  2429  0    2 09:52 pts/0    00:00:00 ./createthread

4edsionte  2429  2210  2430  0    2 09:52 pts/0    00:00:00 ./createthread

5edsionte  2431  2208  2431  5    1 09:52 pts/1    00:00:00 bash

6edsionte  2449  2431  2449  0    1 09:52 pts/1    00:00:00 ps -elf

請注意上述資訊中三類id資訊:pid,ppid和lwp。lwp是輕量級程序的pid,nlwp為執行緒組中線程的個數。下面對上述的實驗結果作以解釋。

1.執行實驗程式的終端對應的pid為2210;

2.我們的實驗程式產生了兩個執行緒,其pid都是2429。這說明這兩個執行緒是並列關係,它們屬於同乙個執行緒組,該執行緒組的pid為2429。

3.實驗程式產生的兩個執行緒的ppid均為2210,再次說明這兩個執行緒之間沒有父子關係,他們的父親均為終端1對應的程序。

4.每個執行緒都與乙個輕量級程序關聯,因此兩個執行緒的lwp不同,分別為2429和2430。

5.這兩個執行緒形成乙個執行緒組,因此他們對應的nlwp為2。

6.通過pid,ppid和lwp的分配情況可以看到,核心對於程序和輕量級程序的id分配是統一管理的,這源於他們使用相同的資料結構task_struct。

上述分析基本上用實驗結果詮釋了程序、執行緒和輕量級程序之間的關係。

程序 輕量級程序(LWP) 執行緒

程序描述符 每程序有自己的thread info,分配釋放函式 alloc thread info,free thread info 執行緒組id tgid 用lwp實現多執行緒支援 程序組id pgrp 回話的id session 管理id資料結構 雜湊表管理 利用id找到所用相關的pd,方便 程...

Linux中的輕量級程序

在linux中,輕量級程序可以是程序,也可以是執行緒。我們所說的執行緒,在linux中,其實是輕量級程序之間共享 段,檔案描述符,訊號處理,全域性變數時 如果不共享,就是我們所說的程序。程序是資源管理的最小單位,執行緒是程式執行的最小單位。在作業系統設計上,從程序演化出執行緒,最主要的目的就是減小多...

linux核心 程序,輕量級程序,執行緒,執行緒組

本篇文章將介紹本人對以下問題的理解。1 程序 輕量級程序 執行緒 執行緒組之間的關係 2 及它們的標識相關說明 一 程序 輕量級程序 執行緒 執行緒組之間的關係 借助上圖說明 程序p0有四條執行流,即執行緒,主線程t0是它的第乙個執行緒,且與程序p0相關聯,之後衍生出t1 t2 t3三個執行緒,這三...