目录
线程的概念及一些基本理论
在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列” 。Linux没有真正意义上的线程概念,只有轻量级进程light weight process(内核级)的概念,通过Linux原生线程库(用户级)为我们提供的线程相关函数,就有了线程的概念了。线程目前分配资源,本质就是分配地址空间范围。一切进程至少都有一个线程执行流。线程在进程内部运行,本质是在进程地址空间内运行。在Linux中,在CPU视角中,看到的线程PCB都要比传统的进程更加轻量化。透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。
线程异常
单个线程如果出现除零,野指针问题导致线程崩溃,进程也会随着崩溃。线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出 。
线程与进程的关系
1、进程是承担资源分配的实体2、线程是CPU调度的基本单位。3、线程共享进程数据,但也拥有自己的一部分数据。注意:每个线程都必须有自己的 独立栈结构(储存线程启动函数中所有的局部变量)、 独立上下文(每个线程都是被CPU独立调度执行的,CPU中的一套寄存器硬件存储的相应线程的上下文数据)
线程ID、线程控制块
在 Linux 中,目前的线程实现是 Native POSIX Thread Libaray, 简称 NPTL 。在这种实现下,线程又被称为轻量级进程 (Light Weighted Process), 每一个用户态的线程,在内核中都对应一个调度实体,也拥有自己的进程 task_struct 结构体。Linux中的原生线程库提供了关于线程的函数,因此该库要先被加载到内存里形成相应的进程的页表映射关系,映射到进程地址空间里的共享区中。通过调用原生线程库里的pthread_create函数创建新线程时,原生线程库里会创建一个描述线程的线程控制块TCB,该结构体包括线程的ID、线程的独立栈结构、线程局部存储等,接下来通过系统调用clone(pthead_create封装了一个创建轻量级进程的系统调用clone),在内核创建一个轻量级进程。
在Linux中,pthread_t pid即线程的ID其实就是原生线程库里的各个描述线程的struct ptread的地址(本质就是进程地址空间上的一个地址)。