Linux程序的建立和終結

2021-05-23 00:38:56 字數 1472 閱讀 1545

linux建立程序很複雜,首先呼叫fork(),最終呼叫do_fork(),而do_fork()呼叫copy_process() 。

首先是copy_process()的一系列工作:

1.複製父程序。呼叫dup_task_struct(),此時子程序與父程序描述符完全相同。

2.把程序描述符中的各項設為0或者初始值,並把程序狀態設為task_uninteruptible,保證程序未建立完畢前不要投入執行。

3.呼叫copy_flags(),設定描述符中的flag,表明程序是否有超級許可權。

4.get_pid()設定程序pid。  

5.根據clone()引數標誌,拷貝或者開啟檔案、檔案系統資訊訊號處理函式、程序位址空間和命名空間等等。linux其實使用的是寫時複製,也就是共享資源。   

6.讓父程序和子程序平分剩餘的時間片。  

7.返回乙個指向子程序的指標。

如果成功的返回到do_fork(),這個新建的子程序會被喚醒,核心有意讓子程序先執行。子程序一般立即呼叫exec()函式,這樣避免了寫時複製的額外開銷。如果 父程序先執行,有可能向共享的位址空間寫入。

我們程式設計的時候只需要呼叫exit()或者return來結束,不過實際在核心的結束的確是麻煩,不過總的還是分為釋放程序資源和刪除程序描述符。

釋放程序資源:

1.將task_struct中的flags設定為pr_exiting;

2.呼叫del_timer_sync()刪除核心定時器,確保沒有定時器在排隊;

3.呼叫_exti_mm()放棄占用的mm_struct,如果沒有其他的程序使用就徹底釋放;

4.呼叫exit_sem(),如果有ipc訊號就離開佇列;

5.呼叫_exit_files(),_exit_fs(),exit_namespace(),exit_sighand(),釋放檔案描述符、檔案系統資料、程序名空間、訊號處理函式;

6.把task_strcut的exit_code設定為exit()提供的**中,供父程序檢索;

7.呼叫exit_nofify()向父程序傳送訊號,把子程序設定為task_zombie ;

8.do_exit()呼叫schedule()切換到其他程序;

這裡子程序為task_zombie,但是程序描述符還在系統中保留,這裡必須刪除程序描述符:

1.呼叫free_uid()減少程序擁有者的計數;

2.release_task()呼叫unhash_process()從pidhash上刪除該程序。同時從task_list中刪除;

4.對應父程序重設;

5.release_task()呼叫put_task_struc()釋放核心棧和thread_info,task_struct占用的slab快取記憶體;

Linux程序建立和結束

在linux 中,程序的建立由系統呼叫fork 和vfork 完成。它們生成乙個子程序並且子程序是父程序的乙個複製品。fork 系統呼叫對應的kernel 函式是sys fork 此函式簡單的呼叫kernel 函式do fork 乙個簡化版的do fork 執行如下 1 alloc pid 給新的程...

程序的建立和程序狀態

程序 程序是乙個程式在記憶體中執行的過程。程序由程式 資料和程序控制塊 簡稱pcb 組成 程序控制塊 pcb linux中的pcb是乙個名叫task struct 的結構體,其中有一下幾個內容 識別符號 用來區別於其他的程序的識別符號。狀態 任務狀態,退出 退出訊號等。優先順序 程序的優先順序。程式...

程序建立和執行

簡單的說,每個應用在執行時就會產生乙個程序,這個程序就對這個應用負責,掌握這個應用的執行狀態。可是為什麼還要用乙個程序來控制乙個應用呢,下面將會簡單的解釋一下。現在的應用對於資源的要求都是獅子大開口,開口就是幾個g,一台電腦的記憶體一般也就幾個g,總不能一台電腦就跑這乙個應用吧。為了解決這個問題,作...