【操作系统】三、线程

文章目录

线程的概念

线程是一个基本的CPU执行单位,也是程序执行流的最小单位。

线程的属性

同一进程的线程切换

进程内的线程都是共享进程资源的,也就是内存空间地址等都是共享的,线程间切换时只需要切换线程上下文(寄存器的一些信息),不涉及切换内存空间地址和其他系统分配给进程资源,所以开销比较小。

不同进程的线程切换

跨进程线程切换则需要切换寄存器 + 昂贵的地址空间切换 + 其他资源切换

保证切换开销最小的策略

时间片调度与优化
  • 操作系统会给每个线程分配一个时间片 。在一个时间片内,CPU可以连续执行同一个进程内的多个线程,进行多次开销很小的同进程线程切换,直到必须切换到另一个进程为止。
  • 调度器会尽量让属于同一个进程的线程连续运行,以利用地址空间的"热度"(活跃的TLB和缓存),减少昂贵的进程切换次数。
线程模型的设计初衷
  • "开销小"是线程相对于进程的先天优势 。程序员在设计并发程序时,应有意识地将需要频繁通信和协作的任务放在同一进程的多个线程中 ,而不是分散到多个进程。这样,大部分切换都是低开销的线程切换,从而从整体上保证系统开销最小。
  • 要获得高性能并发,应优先使用多线程(在同进程内),而非动辄创建多进程。

切换开销最小的实现

  • 通过调度算法,尽量让同进程线程连续运行,减少进程切换的频率。
  • 通过合理的架构设计(使用多线程处理高耦合任务),使程序中大部分并发切换发生在进程内部,从而在整体上最小化系统的切换开销。

线程的实现方式

用户级线程

用户级线程(User-Level Thread,ULT):是由应用程序通过线程库实现,所有的线程管理工作都是由应用程序负责,包括线程切换。

用户级线程中,线程切换可以在用户态下完成,无需操作系统干预。

从用户的角度来看是有多给线程,但实际操作系统是感受不到线程的存在。只是在进程内通过应用程序实现。

优点

用户级线程的切换在用户空间内完成,不需要切换到核心态,线程切换的开销小,效率高。

缺点

当一个用户级线程被阻塞时,整个进程都会阻塞,并发度不高。多个线程不可在多核处理机上做并行处理,本质是一个进程获取时间片后,线程依次执行。

内核级线程

内核级线程(Kernel-Level Thread,KLT):是由操作系统内核直接管理和调度的线程。

线程调度、切换等工作都必须由内核负责,内核级线程的切换需要在核心态下才能完成。

操作系统会为每个内核级线程建立相应的TCB(Thread Control Block,线程控制块),通过TCB对线程进行管理。

优点

当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程在多核处理器上并行处理。

缺点

一个用户进程会占用多个内核级线程,线程的切换需要操作系统内核完成,需要切换到核心态,所以内核级线程管理的成本高,开销大。

多线程模型

多线程模型是指在支持内核级线程的系统中,根据用户级线程和内核级线程的映射关系,可以划分几种多线程模型

一对一模型

多对一模型

多对多模型

线程的状态和转换

线程的组织与控制

相关推荐
代码山河15 分钟前
基本类型转换:自动类型转换与强制类型转换
java·学习·架构·教程·面向对象·项目
老歌老听老掉牙18 分钟前
圆柱端面四平面交线及其在yoz面投影的几何解析与 Python 实现
开发语言·python·平面
旖旎夜光1 小时前
【C++ 基础入门】命名空间、输入输出、缺省参数与函数重载
开发语言·c++·笔记·学习
俩个逗号。。1 小时前
Kotlin flow 详解
android·开发语言·kotlin
Escalating_xu2 小时前
【Linux 网络编程】五种 I/O 模型与非阻塞 I/O:从“等数据”到正确处理 EAGAIN
java·linux·网络
程序猿乐锅2 小时前
万字详解Single-flight(单飞模式)
java·开发语言·分布式·后端·学习·single-flight
Java后端的Ai之路2 小时前
【AIAgent开发】-Agent工具封装成CLI(纯干货!!!)
java·javascript·人工智能·agent·cli
AntsData3 小时前
用 12K+ 条亚马逊评论信号,定位机械键盘下一版该改什么
java·大数据·计算机外设
code2cat3 小时前
【随笔】连续批处理:长短请求怎样在迭代之间补位
java·人工智能·后端·大语言模型·vllm
最强小杰3 小时前
DeepSeek V4 Flash + Codex CLI 接入教程:原生 Responses API 适配,从配置到跑通收藏这篇就够了(2026)
java·前端·python·ai