Alex_McAvoy

想要成为渔夫的猎手

线程的基本概念

【线程】

进程是一个资源的拥有者,因而在创建、撤销、切换过程中,系统要付出较大的时空开销,这就限制了系统中所设置进程的数目,且进程切换也不能太过频繁,这就限制了程序的并发程度

为解决上述问题,在进程的基础上引入了线程,由于进程的不仅拥有资源,其还是调度与分派的基本单位,因此将进程的两个属性分开,使得不把作为调度与分派的基本单位也同时作为拥有资源的单位

由此,线程就成为了调度与分派的基本单位

线程具有许多传统进程的特征,因此称为轻量级进程,其是一个基本的 CPU 执行单元,也是程序执行流的最小单元,相应的,传统进程被称为重量级进程

【线程控制块】

系统为每个线程配置了一个线程控制块(Thread Control Block,TCB),所有用于控制、管理线程的信息均记录其中,其包括以下几项内容:

  • 线程标识符:每个线程具有一个唯一的线程标识符
  • 寄存器:包括程序计数器 PC、状态寄存器、通用寄存器等
  • 线程运行状态:描述线程处于何种运行状态
  • 优先级:线程执行的优先程度
  • 线程专有存储区:用于线程切换时暂存线程保护信息
  • 信号屏蔽:对某些信号加以屏蔽
  • 堆栈指针:保存局部变量与返回地址

【线程状态】

基础状态

与传统进程一样,各线程间也存在着共享资源与相互合作的制约关系,使得线程在运行时具有间断性,相应地,线程在运行时也具有下述的三种基本状态,其状态转换与进程间的状态转换相同:

  • 执行态:线程已获得处理机而正在运行
  • 就绪态:线程已具备各种执行条件,只需获得 CPU 资源即可执行
  • 阻塞态:线程在执行过程中因某事件受阻而处于暂停状态

线程的创建

应用程序启动时,通常只有一个线程(初始化线程) 在执行,其主要功能是创建新线程

在创建新线程时,利用一个线程创建函数(或系统调用) ,并提供相应参数,在创建完成后,将返回一个线程标识符供以后使用

线程的终止

当一个线程被终止后,不会立即释放资源,只有当进程中的其它线程执行分离函数后,资源才分离出来能被其它线程利用

被终止而未释放资源的线程仍可被需要它的线程调用,使其重新恢复运行

【进程与线程的对比】

在多线程的操作系统中,进程包含多个线程,并为它们提供资源,操作系统支持在一个进程中的多个线程能并发执行,但此时的进程不再作为一个执行的实体

多线程下的进程具有以下属性:

  • 进程是一个拥有资源的基本单位,其仍为系统资源分配的基本单位
  • 多个线程可并发执行,但至少有一个线程为其他线程提供资源与运行环境
  • 进程已不再是可执行的实体,线程作为独立运行的基本单位

因此,进程与线程可进行以下对比:

  • 调度:线程作为CPU调度的基本单位,而进程只作为其它资源分配单位
  • 并发性:进程之间可以并发,实质上是不同进程中的两个线程并发,而一个进程的多个线程之间也可并发
  • 拥有资源:进程间资源相互独立,同一进程的各线程间共享,但某进程内的线程在其它进程不可见
  • 系统开销:由于同进程内线程间共享内存地址和打开的文件资源,因此线程上下文切换在同进程环境下上下文切换要快得多
感谢您对我的支持,让我继续努力分享有用的技术与知识点!