线程的概念
- 程序中的一个执行路线就是线程,线程就是一个进程内部的控制序列
- 一个进程至少都有一个执行线程
- 线程在进程内部运行,本质是在进程地址空间内运行
- liunx系统下,cpu眼里的PCB比传统进程更加轻量化
- 透过虚拟地址空间,把进程的大部分资源,把资源合理分配给每个执行流,就形成了线程
线程和进程
- 进程是资源分配的基本单位
- 线程是调度的基本单位
- 线程共享进程地址空间,但是也有自己的一部分数据:线程ID,一组寄存器,栈,errno,信号屏蔽字,有限调度级
线程私有
1.线程的硬件上下文(cpu寄存器的值)
线程的硬件上下文是指线程在执行过程中,CPU寄存器的当前状态。这些寄存器包括通用寄存器、程序计数器(IP)、处理器状态寄存器(如EFLAGS在x86架构中)以及栈指针(ESP)等。这些寄存器的值在线程切换时会被保存,以便在线程重新获得CPU时能够恢复其执行状态。
- 通用寄存器:用于存储线程在执行过程中的临时数据。
- 程序计数器:存储线程当前正在执行的指令的地址,或者即将执行的下一条指令的地址。
- 处理器状态寄存器:包含线程的执行状态信息,如条件码、中断标志等。
- 栈指针:指向线程私有栈的栈顶,用于管理线程的栈空间。
在线程切换时,操作系统会保存当前线程的硬件上下文,并加载下一个要执行的线程的硬件上下文。这样,当线程重新获得CPU时,它可以从上次中断的地方继续执行。
2.线程的独立栈结构
每个线程都有自己独立的栈结构,用于存储线程的局部变量、函数调用信息以及返回地址等。线程的栈空间是线程私有的,这意味着一个线程不能访问另一个线程的栈空间。
栈的作用:
- 存储局部变量:线程在执行函数时,会在栈上分配空间来存储局部变量。
- 函数调用信息:当线程调用一个函数时,会在栈上保存函数的参数、返回地址以及调用者的上下文信息。
- 返回地址:当函数执行完毕后,线程会从栈上获取返回地址,并跳转到该地址继续执行。
栈的独立性:
- 线程的栈空间是私有的,这保证了线程之间的数据隔离。
- 一个线程的栈空间大小是有限的,通常由操作系统在创建线程时指定。
- 如果线程使用的栈空间超过了指定的限制,就会发生栈溢出错误。
线程共有
- 进程地址空间
- 全局变量
- 文件描述表
- 每种信号的处理方式
- 当前工作目录
- 用户id和组id
线程就是轻量级进程
在Linux系统中,线程通常是通过轻量级进程来实现的。线程与轻量级进程在概念上是相似的,都表示进程内部的一个执行单元。linux中没有线程相关的系统调用,只有轻量级进程的系统调用。原生线程库:将轻量级进程系统调用做封装,转成线程相关的接口语义提供给用户