核心概念
线程是操作系统调度的基本单位,进程是资源分配的基本单位。
理解:
进程:内核视角:操作系统分配资源(内存、网络端口等)的最小独立实体。每个进程有自己独立的 task_struct(进程控制块),包含进程 ID、文件描述符表、信号处理等。其中有一个执行流是单线程进程,本质上进程是资源容器,可以包含多个线程。可以认为进程包含:执行流 + 地址空间 + 页表 + 部分物理内存。
线程:内核视角:CPU 调度的最小单位,是进程内的执行分支。在 Linux 的 CPU 下看待的粒度:线程 <= 执行流 <= 进程,不区分线程和进程,只有执行流。同一进程内的所有线程共享该资源(地址空间、文件描述符表、环境变量等)。线程的动态特性:拥有自己独立的栈(保证执行流不会错乱),进程的独立上下文(线程是被独立调度的),线程 ID、一组寄存器、栈、errno、信号屏蔽字、调度优先级。
进程是工厂(分配资源),线程是工人(执行任务),一个工厂可以有多个工人,工人共享工厂的设备(资源),但是相互独立。
理解地址空间是进程的资源窗口:虚拟地址空间的划分:0
3GB 是用户空间(进程私有区域),用来存放数据、栈、堆、环境变量、动态库内存映射等,不同进程的用户空间相互隔离;34GB 是内核空间(所有进程共享的区域),只通过一张页表映射,存放操作系统的内核代码和数据、系统接口。只有在内核态才能访问。地址空间的作用:进程无法直接访问物理内存,只能通过'虚拟地址 + 页表映射'的方式访问。其中,加载环境变量、执行代码、访问全局变量等,本质是进程找到虚拟地址空间中找到对应的虚拟地址,CPU 通过CR3 寄存器找到对应的页表地址,再通过页表(包含页目录、二级页表),将 32 位平台的 10+10+12 的方式找到对应的物理地址。有 10 位虚拟地址代表页目录的内容 -> 二级页表的地址,后 10 位代表二级页表的内容 -> 指向物理内存的地址,后 12 位代表物理内存 4KB 页框的偏移量,从而精确定位。
访问实际的代码、数据、内核资源。如果访问的地址在二级页表不存在,引发缺页中断,通过标记位确定。所以进程是通过地址空间 + 页表来获取数据,地址空间是进程获取资源的窗口。
页表寄存器:CPU 内置的寄存器,存放进程页表的物理地址。当切换进程时,内核会更新该寄存器,保证不同进程的地址空间隔离。
内核态、用户态寄存器:CPU 通过该寄存器区分当前执行的态。
硬件支撑:

