liunx中的程序與執行緒

2022-03-08 00:00:04 字數 2666 閱讀 2495

程序和執行緒是程式執行時狀態,是動態變化的,程序和執行緒的管理操作(比如,建立,銷毀等)都是有核心來實現的。

linux中的程序於windows相比是很輕量級的,而且不嚴格區分程序和執行緒,執行緒不過是一種特殊的程序。

所以下面只討論程序,只有當執行緒與程序存在不一樣的地方時才提一下執行緒。

程序提供2種虛擬機制:虛擬處理器和虛擬記憶體

每個程序有獨立的虛擬處理器和虛擬記憶體,

每個執行緒有獨立的虛擬處理器,同乙個程序內的執行緒有可能會共享虛擬記憶體。

核心中程序的資訊主要儲存在task_struct中(include/linux/sched.h)

程序標識pid和執行緒標識tid對於同乙個程序或執行緒來說都是相等的。

linux中可以用ps命令檢視所有程序的資訊:

ps -eo pid,tid,ppid,comm

需要多執行緒原因:

許多應用中同時發生著多種活動,某些活動會隨著時間的推移被阻塞。通過將應用程式分解成可以準並執行的多個順序

執行緒可以使程式設計變得更加簡單。

執行緒比程序更加輕量化,比程序更加容易建立,更加容易撤銷。

如果存在大量的計算和i/o處理,擁有多個執行緒允許這些活動彼此重疊進行,從而加快應用程式的執行速度

在同一程序中可以並行執行多個執行緒,他們共享同一位址空間和其他資源。

linux中建立程序與其他系統有個主要區別,linux中建立程序分2步:fork()和exec()。

fork: 通過拷貝當前程序建立乙個子程序

exec: 讀取可執行檔案,將其載入到記憶體中執行

建立的流程:

呼叫dup_task_struct()為新程序分配核心棧,task_struct等,其中的內容與父程序相同。

check新程序(程序數目是否超出上限等)

清理新程序的資訊(比如pid置0等),使之與父程序區別開。

新程序狀態置為 task_uninterruptible

更新task_struct的flags成員。

呼叫alloc_pid()為新程序分配乙個有效的pid

根據clone()的引數標誌,拷貝或共享相應的資訊

做一些掃尾工作並返回新程序指標

建立程序的fork()函式實際上最終是呼叫clone()函式。

建立執行緒和程序的步驟一樣,只是最終傳給clone()函式的引數不同。

比如,通過乙個普通的fork來建立程序,相當於:clone(sigchld, 0)

建立乙個和父程序共享位址空間,檔案系統資源,檔案描述符和訊號處理程式的程序,即乙個執行緒:clone(clone_vm | clone_fs | clone_files | clone_sighand, 0)

這與之前提到的linux核心是個單核心有關。

和建立程序一樣,終結乙個程序同樣有很多步驟:

子程序上的操作(do_exit)

設定task_struct中的標識成員設定為pf_exiting

呼叫del_timer_sync()刪除核心定時器, 確保沒有定時器在排隊和執行

呼叫exit_mm()釋放程序占用的mm_struct

呼叫sem__exit(),使程序離開等待ipc訊號的佇列

呼叫exit_files()和exit_fs(),釋放程序占用的檔案描述符和檔案系統資源

把task_struct的exit_code設定為程序的返回值

呼叫exit_notify()向父程序傳送訊號,並把自己的狀態設為exit_zombie

切換到新程序繼續執行

子程序進入exit_zombie之後,雖然永遠不會被排程,關聯的資源也釋放掉了,但是它本身占用的記憶體還沒有釋放,

比如建立時分配的核心棧,task_struct結構等。這些由父程序來釋放。

父程序上的操作(release_task)

父程序受到子程序傳送的exit_notify()訊號後,將該子程序的程序描述符和所有程序獨享的資源全部刪除。

從上面的步驟可以看出,必須要確保每個子程序都有父程序,如果父程序在子程序結束之前就已經結束了會怎麼樣呢?

子程序在呼叫exit_notify()時已經考慮到了這點。

如果子程序的父程序已經退出了,那麼子程序在退出時,exit_notify()函式會先呼叫forget_original_parent(),然後再呼叫find_new_reaper()來尋找新的父程序。

find_new_reaper()函式先在當前執行緒組中找乙個執行緒作為父親,如果找不到,就讓init做父程序。(init程序是在linux啟動時就一直存在的)

4、 程序的狀態

a/ 執行態  : 程序實際占用cpu

b/ 就緒態  : 可執行,但因為其他程式正在執行而暫時停止,沒有占用cpu

c/ 阻塞態  : 除非某種外部事件發生,否則程序不能執行

前兩種狀態邏輯上類似,只是對於第二種狀態暫時沒有cpu分配給他。第三種狀態不能執行即使cpu空閒也不行。

執行與就緒的轉換由程序排程程式引起的,排程程式的主要工作就是決定應當執行那個程序、何時執行及它該執行多長時間。

程序與執行緒

程序 process 管理單元,管理分配應用程式的資料,的記憶體空間.執行緒 thread 執行單元,執行緒負責執行乙個預先編排好的 段,執行 棧是基於執行緒的.乙個應用程式啟動的時候,程序自動建立,並且會預設建立主線程,主線程負責執行main 方法.thread t new thread new ...

程序與執行緒

程序 是擁有資源的實體,包括 1。乙個程序有乙個虛擬位址空間,不同程序位於不同的 虛擬位址空間中。程序之間若要通訊,必須通過作業系統 的功能呼叫 ipc 2。程序擁有其他資源,例如開啟的檔案和i o裝置。程序結束時,作業系統會自動釋放該程序擁有的所有資源。例如,如果 open乙個檔案而不close它...

程序與執行緒

程序包括 1 私有的虛位址空間 2 可執行程式 與資料 3 開啟系統資源列表控制代碼 4 安全訪問標誌 5 程序id 6 至少有乙個執行執行緒 執行緒包括 1 一組cpu暫存器狀態 2 兩個堆疊 系統態與使用者態 3 tls 執行緒區域性儲存區 4 執行緒id 5 安全特性 因此程序是不活潑的,它從...