2、因为内核线程只运行在内核态,它只使用大于PAGE_OFFSET的线性地址空间。另一方面,不管在用户态还是在内核态,普通进程可以用4GB的线性地址空间。
撤销进程:进程终止后,需要通知内核以便内核释放进程所拥有的资源,包括内存、打开文件以及其他资源,如信号量。进程终止的一般方式是调用exit()库函数,该函数释放C函数库所分配的资源,执行编程者所注册的每个函数,并结束从系统回收进程的那个系统调用。
除了进程自己终止自己外,内核可以有选择地强迫整个线程组死掉。这发生在:当进程接收到一个不能处理或忽视的信号时,或者当内核正在代表进程运行时再内核态产生一个不可恢复的CPU异常时。
有两个终止用户态应用的系统调用:exit_group()系统调用,它终止整个线程组,即整个基于多线程的应用。do_group_exit()是实现这个系统调用的主要内核函数。exit()系统调用,它终止一个线程,而不管该线程所属线程组中的所有其他进程。do_exit()是实现这个系统调用的主要内核函数。
进程切换:进程切换又称为任务切换、上下文切换。它是这样一种行为,为了控制进程的执行,内核挂起当前在CPU上运行的进程,并恢复以前挂起的某个进程的执行。
跟函数的调用类似,进程切换时,一般要在CPU上装载要执行进程的进程上下文。进程的硬件上下文指:可执行程序上下文的一个子集,是进程恢复执行前装入寄存器的一组数据。其中一部分放在TSS段,即任务状态段,剩余部分存放在内核态堆栈中。进程的切换只发生在内核态,在执行进程切换之前,用户态进程使用的所有寄存器内容都已保存在内核态堆栈上。
进程的切换有两种方法,一种是硬件切换,一种是软件切换。软件切换就是利用程序逐步执行切换,它的优点是,可以对切换时装入的数据进行合法性检查,执行时间虽与硬件切换大致相同,但仍有可改进的地方。
进程切换使用schedule()函数完成,在本质上,每个进程切换由两部分组成:1、切换页全局目录以安装一个新的地址空间。2、切换内核态堆栈和硬件上下文,因为硬件上下文提供了内核执行新进程所需要的所有信息,包括CPU寄存器,主要有switch_to函数完成。