4.6 内核线程

     内核线程(thread)或叫守护进程(daemon),在操作系统中占据相当大的比例,Linux操作系统启动以后,尤其是Xwindow也启动以后,你可以用ps命令查看系统中的进程,这时会发现很多以d结尾的进程名,这些进程就是内核线程。

   内核线程也可以叫内核任务,它们周期性地执行,例如,磁盘高速缓存的刷新,网络连接的维护,页面的换入换出等等。在Linux中,内核线程与普通进程有一些本质的区别,从以下几个方面可以看出二者之间的差异:

·      内核线程执行的是内核中的函数,而普通进程只有通过系统调用才能执行内核中的函数。

·      内核线程只运行在内核态,而普通进程既可以运行在用户态,也可以运行在内核态。

·     因为内核线程指只运行在内核态,因此,它只能使用大于PAGE_OFFSET3G)的地址空间。另一方面,不管在用户态还是内核态,普通进程可以使用4GB的地址空间。

 

内核线程是由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(  );

   }

}

     系统中大部分的内核线程是在系统的启动过程中建立的,其相关内容将在启动系统一章进行介绍。