Search Google

Friday, June 20, 2008

[Process Management] Process/Thread Termination Part 1

專門用語:

  • 使用打字機(Courier New)字體表示原始碼。
  • task/process即為Linux中的thread。
  • 文中的Linux與Linux kernel指的皆為作業系統核心。
  • 使用斜體字型標示Linux中的資料結構,macro,變數或函式名稱。

Kernel版本:
  • v2.6.24.3

有關thread termination有兩件事情需要確認,一是kernel thread與user thread結束的步驟是否相同(Part 1),二是他們結束的步驟各1為何(Part 2)。

講到thread termination讓人立即想到的就是程式執行(user thread)完畢,user thread通常是因執行應用程式的可執行檔而產生,而compiler在編譯應用程式可執行檔的過程中會在程式最後加上exit函式,該函式會透過system call sys_exit讓Linux結束並移除該應用程式(user thread)[1],實際上sys_exit函式就等於do_exit函式。

asmlinkage long sys_exit(int error_code)
{
do_exit((error_code&0xff)<<8);
}

雖然說kernel thread通常在關機(或重新開機)前是不會停止運作2,kernel thread一旦執行完畢3還是會跟user thread走相同的步驟呼叫do_exit函式,詳見下圖。

上圖所顯示的是kernel thread hello_world執行完畢正在被Linux移除的debug screenshot,我們在kernel中新增一個叫做hello_world的函式並於開機的過程中4透過kernel_thread函式執行列印二行文字5,而breakpoint正是設在hello_world第二次呼叫printk的時候。

以上說明了Linux透過相同的do_exit函式移除束完畢的kernel thread與user thread。



1 如果結束步驟不同再分別探討。
2 Kernel thread大部分都是用於維持電腦正常運作,因此都會以無窮回圈方式執行,但如果是由driver所建立的kernel thread就有可能在某些時候遭到停止甚至移除。
3 離開無窮回圈或根本就沒有回圈存在。
4 於rest_init函式中呼叫,確定一些基本硬體設定都已初始完成。
5 分別為"hello world"與"leaving now"。


[1] Linux Kernel Development, Robert Love, DEVELOPER'S LIBRARY
http://www.amazon.com/exec/obidos/tg/detail/-/0672327201/ref=lpr_g_1/104-4939002-4103159?v=glance&s=books&n=507846



No comments: