一、创建进程
二、线程及其创建
线程机制提供了在同一程序内可以运行多个线程,这些线程共享内存地址空间,还可以共享打开的文件和其它资源。从内核角度来说,没有线程这个概念。Linux把所有线程当作进程来实现。
Linux的内核线程由kernel_thread()函数在内核态下创建的。内核线程也可以叫内核任务,它们周期性地执行。
在Linux中,内核线程与普通进程有本质的区别,如下:
(1)内核线程执行的是内核中的函数,而普通进程只有通过系统调用才能执行内核中的函数。
(2)内核线程只运行在内核态,而普通进程既可以运行在用户态,也可以运行在内核态。
(3)因为内核线程只运行在内核态,因此,它只能使用大于3GB的地址空间。另一方面,不管在用户态还是内核态,普通进程可以使用4GB的地址空间。
介绍几个特殊的内核线程
1、进程0
内核是一个大程序,可以控制硬件,并创建、运行、终止及控制所有进程。内核被加载到内存后,首先由完成内核初始化工作的start_kernel()函数从无到有地创建一个内核线程swap,并设置其PID为0。因为Linux对进程和线程统一编号,也把它叫进程0,又叫空闲进程。进程0执行的是cpu_idle()函数,该函数中只有一条汇编指令,指令在系统闲置时不仅能降低电力的作用还能减少热的产生。进程0的PCB叫做init_task,当就绪队列没有其他进程时,空闲进程0就被调度程序选中,来达到省电的目的。
2、进程1
init进程1号进程,Linux 2.6在初始化阶段首先把它建为一个内核线程kernel_init。当调度程序选择到kernel_init内核线程时,kernel_init就开始执行内核的一些初始化函数将系统初始化。
init是内核线程启动起来的一个普通的进程,这也是用户态下的第一个进程。init进程从不终止,因为它创建和监控操作系统外层所有进程的活动。