4.6 内核线程
内核线程(thread)或叫守护进程(daemon),在操作系统中占据相当大的比例,当Linux操作系统启动以后,尤其是Xwindow也启动以后,你可以用”ps”命令查看系统中的进程,这时会发现很多以”d”结尾的进程名,这些进程就是内核线程。
内核线程也可以叫内核任务,它们周期性地执行,例如,磁盘高速缓存的刷新,网络连接的维护,页面的换入换出等等。在Linux中,内核线程与普通进程有一些本质的区别,从以下几个方面可以看出二者之间的差异:
· 内核线程执行的是内核中的函数,而普通进程只有通过系统调用才能执行内核中的函数。
· 内核线程只运行在内核态,而普通进程既可以运行在用户态,也可以运行在内核态。
·
因为内核线程指只运行在内核态,因此,它只能使用大于PAGE_OFFSET(
内核线程是由kernel_thread( )函数在内核态下创建的,这个函数所包含的代码大部分是内联式汇编语言,但在某种程度上等价于下面的代码:
int kernel_thread(int (*fn)(void *), void * arg,
unsigned long flags)
{
pid_t p;
p = clone( 0, flags | CLONE_VM );
if ( p ) /* parent */
return p;
else { /* child */
fn(arg);
exit( );
}
}
系统中大部分的内核线程是在系统的启动过程中建立的,其相关内容将在启动系统一章进行介绍。