由於內核對進程和線程不做區分,所以內核線程(kernel thread)又稱為內核進程(kernel process)。注意不能把普通進程中的線程理解為進程。
內核線程和普通進程的區別:
1、內核線程只運行在內核態,普通進程可以運行在內核態和用戶態。
2、內核線程只能調用內核函數,普通進程可以通過系統調用調用內核函數。
3、內核線程只能運行在大於PAGE_OFFSET的地址空間,而普通進程可以4G的地址空間(除了訪問用戶空間的3G,通過系統調用可以訪問內核空間的1G空間)。
由於內核線程不受用戶態上下文的拖累,常被內核用於執行一些重要的任務,如刷新磁盤高速緩存,交換不同的頁面。
在linux系統中用ps –ef命令看到的帶“d”結尾的進程就是內核線程。
內核線程由kernel_thread在內核態被創建。
在linux2.6.xxx/arch/arm/include/asm/processor.h /* * Create a new kernel thread */ extern intkernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
參數說明:
fn:新創建的內核線程要執行的函數。
arg:fn的參數。
flags:和do_fork中的clone_flags作用相似。在kernel_thread中do_fork缺省使用了CLONE_VM.
查看本欄目更多精彩內容:http://www.bianceng.cn/OS/unix/