第六章:内核线程
线程与进程
从源代码经过编译器一系列处理(编译、链接、优化等)得到的可执行文件,我们称为程序。
而简单地说,进程 (Process) 就是使用正在运行并使用资源的程序,与放在磁盘中一动不动的程序不同,首先,进程得到了操作系统的资源支持:程序的代码、数据段被加载到内存中,程序所需的虚拟内存空间被真正构建出来。同时操作系统还给进程分配了程序所要求的各种其他资源,最典型的当属文件、网络等。
然而如果仅此而已,进程还尚未体现出其“正在运行”的特性。而正在运行意味着 CPU 要去执行程序代码段中的代码,为了能够进行函数调用,我们还需要一点额外的内存:即栈(stack)。如果要进行动态内存分配,我们还需要另外一些额外的内容:即堆(heap)。
出于种种目的,我们通常将“正在运行”的特性从进程中剥离出来,这样的一个借助 CPU + 栈的执行流,我们称之为线程 (Thread) 。一个进程可以有多个线程,也可以如传统进程一样只有一个线程。
这样,进程虽然仍是代表一个正在运行的程序,但是其主要功能是作为资源管理的单位,管理内存、文件、网络等资源。而一个进程的多个线程则共享这些资源,专注于执行,从而作为执行流调度的单位。
现代的处理器 (Processor),往往都具有多个核(核、Core 其实都是一个概念),从而可以在同一时间运行多个线程(可能来自于同个进程,也可能不同)。因此基于多线程的程序,则可以在占据同样资源的情况下,充分利用多核来同时执行更多的指令,宏观上提高整个程序的运行速度。
在本教程中,出于简化,进程的概念被弱化。我们主要讨论线程以及基于线程进行执行流调度。 本章你将会学到:
- 内核线程的概念
- 线程执行的状态表示与保存
- 线程切换