在学习操作系统的过程中,“进程”和“线程”的概念其实很模糊。在不同的上下文中,名称所指代的概念很可能不同。概念不清会给学习和交流带来障碍。所以,我们一开始先把概念对齐。很多书籍和文章都是这样定义进程和线程的:进程:资源分配的最小单位;线程:程序执行的最小单位;事实上,这样的描述还不够具体。一个执行程序实际上是由一组资源和(一个或多个)执行实体组成的。每个执行实体都需要独特的执行自身所必需的资源,所有执行实体共享可共享的资源。这里的执行实体是线程;这里的执行实体和共享资源都是进程。进程(用户)虚拟地址空间中的资源Stack:(运行中的)局部变量、函数参数、返回地址等Heap:动态分配的内存BSS段:未初始化或初始化为0的全局变量和静态局部变量数据段:已初始化且初始值不为0的全局变量和静态局部变量代码段:可执行代码、字符串字面量、只读变量文件描述符(FileDescriptor)设置在一个线程中,但整个进程的所有线程共享这个设置,以上次设置为准)信号屏蔽设置semaphore(这里的信号量和上面的信号不同,上面的信号指的是中断,这里的信号量是指进程间通信的一种机制)在上面所有的资源中,加粗的资源是每个线程独有的,不加粗的资源是所有线程共享的。关于虚拟地址空间,这里有一张图比较方便我们理解。这张图的详细解释在很多文章中都会提到下面的东西:子进程计数器和寄存器程序计数器(PC)寄存器指令寄存器(IR)地址寄存器其中,Linux中的进程关系实际上是用一个独立的结构存储的通过内核提供的方法获取,本质上不应被视为某种资源。它的主体是内核task_struct,后面我们会详细介绍。计数器和寄存器是架构相关的硬件实现,执行实体(线程)在执行中会用到这些硬件,所以不能把它们看成是某种资源。本段延伸阅读:Linux虚拟地址空间布局介绍文件描述符(FileDescriptor)多线程信号总结Linux对进程和线程的实现(5.0.0内核)Linux只有一个结构体来描述进程/线程——task_struct,该文件位于/linux/include/linux/sched.h。这个结构体中有字段指向/描述相关的资源以及彼此之间的关系。因此,这个结构应该被认为是一个“线程结构”,“线程结构”与相关资源和相互关系有关。它们之间关系的描述构成了一个“过程”。后面的笔记中会有对task_struct结构体的详细分析。参考流程-WikipediaThread-维基百科轻量级流程-维基百科Linux操作系统趣谈-极客时间
