窺探 kernel — 淺析do_exit

來源:互聯網
上載者:User

本系列文章由張同浩編寫,轉載請註明出處:http://blog.csdn.net/muge0913/article/details/7483054

郵箱:muge0913@sina.com


進程在退出時,必須釋放它所擁有的資源,並通過某種方式告訴父進程。進程的退出一般是顯示或隱式地調用了eixt(),或者接受了某種訊號。不過什麼原因退出,最終都調用了do_exit。




用於進程退出的系統調用有兩個exit和exit_group,exit只是終止某個進程,而exit_group整個線程中的進程。它們在核心中的服務函數分別為sys_exit和sys_exit_group,它們又分別調用了do_exit和do_group_exit。而do_group最終又調用了do_exit。

 

do_exit定義在kernel/exit.c中:

僵死進程:僵死進程是一個進程已經退出,它的記憶體和資源已經釋放掉了,但是位了時系統在它退出後能夠獲得它的退出狀態等資訊,它的進程描述符仍然保留。

一個進程退出時,它的父進程會接收到一個SIGCHLD訊號,一般情況下這個訊號的處理函數會執行wait系列函數等待子進程的結束。從子進程退出到父進程調用wait(子進程結束)的這段時間,子進程稱為僵死進程。執行ps –ef命令以“z”結尾的為僵死進程。

 

僵死進程很特殊,它沒有任何可執行代碼,不會被調度,只有一個進程描述符用來記錄退出等狀態,除此之外不再佔用其他任何資源。

 

如果僵死進程的父進程沒有調用wait,則該進程會一直處於僵死狀態。如果父進程結束,核心會在當前線程組裡為其找一個父進程,如果沒找到則把init作為其父進程,此時新的父進程將負責清楚其進程。如果父進程一直不結束,該進程會一直僵死。在root下用kill -9 也不能將其殺死。


下面只對do_exit重點地方解析下:


struct task_struct *tsk = current;//擷取當前要釋放進程的進程描述符

exit_signals(tsk);  /* sets PF_EXITING 以免內和其他部分訪問該進程*/

exit_mm(tsk);if (group_dead)acct_process();trace_sched_process_exit(tsk);exit_sem(tsk);exit_files(tsk);exit_fs(tsk);check_stack_usage();exit_thread();

/*更新父子關係,並告訴父進程正在退出*/exit_notify(tsk, group_dead);

最後要切換為其他進程

/*切換到其他進程*/schedule();

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.