1. 如何理解 Linux 中的线程?
线程:是进程内的一个执行分支。线程的执行粒度要比进程细。
2. 重新定义线程和进程
问题一:什么叫做线程?
我们认为,线程是操作系统调度的基本单位!重新理解进程:内核观点:进程是承担分配系统资源的基本实体。(进程 == 所有的内核数据结构 + 所有的代码和数据)
问题二:执行流是资源吗?
线程是进程内部的执行流资源!!!
问题三:如何理解我们以前说过的进程?
操作系统以进程为单位,给我们的进程分配资源,我们的进程内部,当前只有一个执行流,以前我们所提到的进程是一个特殊情况,只有一个执行流,现在说的一个进程有多个执行流才是正常!!!
其中既然线程是一种资源,那么线程就要被管理起来------先描述,再组织!!!Struct TCB(Thread Control Block)在大多数操作系统中,都有对应的 PCB 结构体(很复杂,但又不得不这样做,还不好维护)。而在 Linux 中,线程直接复用进程数据结构和管理算法,struct task_struct—模拟进程。Linux 没有真正意义上的线程,而是用进程的内核数据结构模拟的线程
CPU 无法识别 Linux 中的进程和线程。线程<=执行流<=进程。Linux 中的执行流:轻量型进程
3. 重谈地址空间—多线程
如图:
CPU 中有个 CR3 寄存器,其中存的就是页表的页目录地址,也有寄存器存储的是进程控制块的地址
问题一:虚拟地址是如何转换到物理地址的?(32 位虚拟地址为例)
其中 32 位虚拟地址并非一个整体,而是分为了三个部分 32=10+10+12。而页表也不是一张表那么简单!!!
32 = 10 + 10 + 12,通过前 20 位,就已经知道页框的起始位置了。
页框的起始位置 + 虚拟地址最后 12 位(你要访问的物理内存在页框中的偏移量) = 物理地址中的数据
所以创建一个进程依旧是一个很重的工作。
所以至此以后,我们知道了虚拟地址是如何映射物理地址的,那么访问任何变量都是起始地址 + 类型 == 页框的起始地址 + 偏移量。
问题一:如何理解资源分配给线程?
线程目前分配资源,本质就是分配地址空间的范围。
4. Linux 线程周边的概念
线程 vs 进程
问题一:为什么线程比进程要更加轻量化?


