Linux中線程與程序的區別

2022-06-13 14:54:07 字數 1981 閱讀 3794

**自:

linux有兩種不同的函式來建立程序:fork函式,vfork函式。兩個函式都是從父程序拷貝出乙個新程序,但是也有區別。下面是fork和vfork的定義。定義於中。本段**源於kernel 4.4版本。

//

fork系統呼叫

syscall_define0(fork)

syscall_define0(vfork)

long do_fork(unsigned long

clone_flags,

unsigned

long

stack_start,

unsigned

long

stack_size,

int __user *parent_tidptr,

int __user *child_tidptr)

long _do_fork(unsigned long

clone_flags,

unsigned

long

stack_start,

unsigned

long

stack_size,

int __user *parent_tidptr,

int __user *child_tidptr,

unsigned

long

tls)

我們可以看到fork和vfork最終都是通過呼叫do_fork來實現的,只不過傳入的引數值不一致。第乙個引數傳入了clone_flags,並且這個clone_flags最終被copy_process所使用。copy_process這個方法是真正的執行拷貝的地方,有興趣的同學可以研究研究。那麼這些flag有什麼含義呢?下面是linux中的flag定義(定義於)。

fork會拷貝父程序的頁表,而vfork永遠不會複製,直接讓子程序共用父程序的頁表(頁表實現從頁號到物理塊號的位址對映)。這是vfork優於當前的fork的地方

vfork建立完子程序後,子程序作為父程序的執行緒在位址空間中執行,同時阻塞父程序,直到子程序退出或者執行exec()。並且子程序不能像位址空間寫入。這一點在fork沒有支援寫時拷貝前是很有意義的,但是由於fork後來引入了寫時拷貝頁並且明確了子程序先執行,vfork的好處就只限於不拷貝頁表項了。

建立執行緒和建立普通的程序類似,只不過需要在呼叫do_fork的時候需要傳遞不同的flag來指明需要共享的資源。使用pthread_create方法來進行建立,最終會呼叫到do_fork方法。傳入的flag為

clone_vm | clone_fs | clone_files | clone_sighand

共享位址空間、檔案系統資訊、開啟的檔案、訊號處理函式
從上面的flag我們可以看出,建立出來的執行緒從核心層面來看其實也是一種特殊的程序,它跟父程序共享了開啟的檔案和檔案系統資訊,共享了位址空間和訊號處理函式,這也跟我們傳統印象中的執行緒和程序的關係是符合的。linux的實現和windows之類的操作實現差異很大,假設乙個程序有四個執行緒,在其它提供了專門執行緒支援的系統中,系統會在程序中增加乙個包含指向該程序所有執行緒的指標的程序描述符,每個執行緒再去描述自己獨佔的資源,但是linux就僅僅建立四個程序並分配四個普通的程序描述符,指定他們共享某些資源,這樣更為簡單。

執行緒又分為核心執行緒使用者執行緒,核心執行緒是獨立執行於核心空間的標準程序,他們沒有獨立位址空間,從來不會切換到使用者空間去。使用者執行緒就是咱們所認知的普通執行緒了。

linux中線程的掛起與恢復(程序暫停)

今天在網上查了一下linux中對程序的掛起與恢復的實現,相關資料少的可憐,大部分都是貼上複製。也沒有完整詳細的 故自己整理了一下 程式流程為 主線程建立子執行緒 當前子執行緒狀態為stop停止狀態 5秒後主執行緒喚醒子執行緒,10秒後主執行緒掛起子執行緒,15秒後主執行緒再次喚醒子執行緒,20秒後主...

linux中線程的掛起與恢復(程序暫停)

今 天在網上查了一下 linux中對程序的掛起與恢復的實現,相關資料少的可憐,大部分都是貼上複製。也沒有完整詳細的 故自己整理了一下 程式流程為 主線程建立子執行緒 當前子執行緒狀態為stop停止狀態 5秒後主執行緒喚醒子執行緒,10秒後主執行緒掛起子執行緒,15秒後主執行緒再次喚醒子執行緒,20秒...

Linux中線程與訊號

由於程序中所有執行緒共享該程序訊號,所以執行緒庫將根據執行緒掩碼決定把訊號傳送給哪個具體的執行緒。因此在每個子執行緒中都單獨設定訊號掩碼,就很容易導致邏輯錯誤。此外,所有執行緒共享訊號處理函式。也就是說,乙個執行緒中設定了某個訊號的訊號處理函式後,它將覆蓋其他執行緒為同乙個訊號設定的訊號處理函式。所...