内核线程VS普通进程

来源:互联网 发布:java json 数组转换 编辑:程序博客网 时间:2024/04/28 16:37

参考文章:(1) http://blog.csdn.net/tigerjibo/article/details/8299686 (2)http://blog.chinaunix.net/uid-27032138-id-3364542.html

同一程序中可以运行多个线程,这些线程共享内存空间,除此之外,还共享打开的文件,
但是我们要建立一个概念,对于LINUX内核而言,根本没有线程一说!
LINUX的内核线程是由kernel_thread()函数在内核态下创建的。(将创建时得到的函数永远执行下去,由一个循环组成,在需要的时候,内核线程将被唤醒执行)。每个内核线程都拥有唯一属于自己的task_struct,所以在内核中,它看起来就像是一个普通的进程(只是该进程和其他一些进程共享某些资源,如地址空间)



内核线程VS普通进程
(1)内核线程执行的是内核中的函数,而普通进程只能通过系统调用才能执行内核函数。
(2)内核线程只运行在内核态,而普通进程即可以运行在内核状态也可以运行在用户态。
(3)由于内核线程只运行在内核态,所以内核线程只能运行在3G~4G这个地址空间内,而一个普通进程可以运行在0G~4G的地址空间内。

(4)内核线程没有独立的地址空间,实际它的mm指针被设置为NULL

(5)内核经常需要在后台执行一些操作。这种任务可以通过内核线程 (kernel thread)完成。

在现有内核线程中创建一个新的内核线程的方法如下:

int kernel_thread(int (*fn)(void *),void *arg, unsigned long flags)

新的任务也是通过向普通的clone()系统调用传递特定的flags参数而创建的。在上面的函数返回时,父线程退出,并返回一个指向子线程task_struct的指针。子线程开始运行fn指向的函数,arg是运行时需要用到的参数

(6)一般情况下,内核线程会将它在创建时得到的函数永远执行下去(除非系统重启)。该函数通常由一个循环构成,在需要的时候,这个内核线程就会被唤醒和执行吗,完成了当前任务,它会自行休眠。

(7) 内核线程和 普通进程一样,可以被调度,也可以被抢占


0 0