当前位置: 首页 > news >正文

操作系统: 线程(Thread)

目录

什么是线程(Thread)?

线程与进程之间的关系

线程调度与并发执行

多线程编程的四大核心优势(benefits of multithreaded programming)

1️⃣ 响应性(Responsiveness)

2️⃣ 资源共享(Resource Sharing)

3️⃣ 经济性(Economy)

4️⃣ 多核架构的利用(Utilization of Multiprocessor Architectures)


什么是线程(Thread)?

在操作系统中,线程(Thread)是程序执行的最小单位。也就是说,线程是 CPU 实际调度和执行的基本单元。

所以,从 CPU 的角度看,它不是在执行“程序”,也不是在执行“进程”,而是在执行一个个线程。

线程的组成部分

每个线程在运行时,需要具备一定的执行上下文(execution context)。一个线程通常由以下几部分组成:

组成部分作用
Thread ID操作系统为每个线程分配的唯一编号,用于标识和管理线程
Program Counter(程序计数器)当前线程将要执行的下一条指令的地址
Register Set(寄存器集合)包括通用寄存器、堆栈指针、程序状态字等,用于存储线程的运行状态
Stack(栈)每个线程都有自己的栈空间,用于存储函数调用、返回地址、局部变量等

这些是线程私有的,每个线程都要拥有自己的这些资源,才能独立运行。

线程与进程之间的关系

进程(Process)是一个正在运行的程序实例,它是操作系统资源分配的最基本单位。一个进程拥有:

  • 独立的地址空间(虚拟内存)

  • 独立的代码段、数据段、堆和栈

  • 文件描述符等系统资源

所以,一个传统的进程只包含一个线程,也叫“单线程进程”。

具体关于进程的介绍可以参考:操作系统:进程管理(Process Management)-CSDN博客

那么,线程与进程的关系是什么?

可以这样理解:

  • 一个线程是属于某个进程的

  • 一个进程可以包含一个或多个线程

  • 一个进程中的所有线程共享该进程的资源

线程共享的内容包括:

共享内容描述
代码段(Code Section)所有线程执行的程序指令是一样的
数据段(Data Section)包括全局变量、静态变量等
堆(Heap)动态分配的内存区域
打开的文件描述符所有线程可以访问同一组文件、socket 等

换句话说,线程是在同一个进程中运行的多个控制流(control flow)。

线程调度与并发执行

线程是操作系统调度的单位。每当 CPU 需要切换任务,它可以在不同线程之间切换,形成并发执行的效果。

如果一个程序只有一个线程:

程序中的所有任务只能串行(sequential)执行,一件事做完,才能做下一件。

如果一个程序有多个线程:

多个线程可以并发执行,每个线程负责一部分任务,比如:

  • 一个线程负责接收用户输入

  • 一个线程负责处理后台计算

  • 一个线程负责保存文件

这样,程序就可以显得“更快”“更流畅”。如果只有一个线程,那么当用户在输入时,下载任务等就会被迫停止。

在多核 CPU 上,多个线程甚至可以真正同时执行(并行 execution)。


多线程编程的四大核心优势(benefits of multithreaded programming)

多线程编程的四大核心好处

分类中文名称简要概括
 Responsiveness响应性线程分工协作,避免程序“卡死”
 Resource Sharing资源共享多线程天然共享内存资源
 Economy资源经济性线程创建和切换成本比进程低
 Utilization of Multiprocessors多核处理器利用率多线程可在多核 CPU 上真正并行运行

下面我们一项一项详细解释。

1️⃣ 响应性(Responsiveness)

在一个交互式应用程序中(例如图形界面、浏览器、游戏),有些操作可能需要较长时间,例如:

  • 加载大文件;

  • 下载网络资源;

  • 进行复杂计算(比如渲染、解压缩)。

如果这些任务由主线程(主控制流)执行,用户界面将冻结或卡住,导致用户体验极差。

多线程的好处:

通过将耗时操作放入后台线程执行,主线程仍然能接收用户输入,界面保持响应。

 举例说明:

  • 在一个 Word 编辑器中,主线程负责响应键盘输入;

  • 后台线程负责保存、拼写检查、自动备份;

  • 即使备份正在进行,你依然可以输入文字。

2️⃣ 资源共享(Resource Sharing)

同一进程内的所有线程共享代码、数据、内存空间和操作系统资源(如打开的文件、套接字)。

这和进程之间数据隔离的情况不同 —— 进程之间要通信,通常要使用 IPC(进程间通信机制)。

 多线程的好处:

  • 数据可以直接共享,不需要复制;

  • 通信无需借助复杂机制(如管道、共享内存、消息队列);

  • 更容易开发结构清晰的协同模块。

 举例说明:

  • 浏览器的多个标签页可能是一个进程内的多个线程;

  • 所有线程共享缓存、网络连接、内存;

  • 不需要在标签页之间“传递数据” —— 它们天然就在同一个地址空间里。

3️⃣ 经济性(Economy)

创建一个线程比创建一个进程更加轻量(经济):

操作

资源消耗

创建新进程

分配独立地址空间、内存映射、文件表复制等,代价高

创建新线程

只需分配一个新的栈空间,复用现有进程资源,开销小

此外,线程之间的上下文切换(context switch)也比进程快得多。因为它们在同一个进程中,不涉及地址空间切换。

 多线程的好处:

  • 更快的启动速度;

  • 更少的内存占用;

  • 更高的执行效率。

 举例说明:

  • 一个下载器开启 10 个线程同时下载 10 个文件;

  • 如果是 10 个进程,系统将为每个进程分配内存、创建文件描述符,开销更大;

  • 使用 10 个线程则只需一份代码和资源。

4️⃣ 多核架构的利用(Utilization of Multiprocessor Architectures)

现代计算机几乎都拥有多核 CPU(如 4 核、8 核甚至更多);

  • 一个单线程程序始终只能在一个 CPU 核上运行;

  • 而多线程程序中的多个线程可以被操作系统同时分配到多个核心上。

 多线程的好处:

  • 真正的并行计算;

  • 提高程序的整体吞吐量;

  • 充分利用硬件资源,尤其在高性能场景(如图像处理、科学计算)中收益巨大。

 举例说明:

你写了一个程序,需要对 1000 张图片同时做缩放处理:

  • 单线程:一张一张顺序处理;

  • 多线程:开启 8 个线程,8 核 CPU 每个线程各自处理一部分图片,速度提升近 8 倍。

http://www.dtcms.com/a/320967.html

相关文章:

  • Lazada东南亚矩阵营销破局:指纹手机如何以“批量智控+数据中枢”重构运营生态
  • Android 之 OOM的产生和解决办法
  • Android 之 ANR问题的全面解析与优化方案
  • 综合项目记录:自动化备份全网服务器数据平台
  • 日本站群服务器与普通日本服务器对比
  • 深入解析C++流运算符(>>和<<)重载:为何必须使用全局函数与友元机制
  • [论文阅读] 人工智能 + 软件工程 | LLM协作新突破:用多智能体强化学习实现高效协同——解析MAGRPO算法
  • 在发布应用程序内测时如何选择合适的分发上架方式?
  • Vite 深度解析:现代前端开发引擎
  • 瑞利杂波背景下不同环境的虚警概率与目标检测概率仿真
  • C# 异步编程(GUI程序中的异步操作)
  • 日常开发-5,工具使用。datagrip mysql 写查询语句 数据库表名和字段 无法提示
  • 语音识别 SenseVoice与FunASR对比
  • 机器学习——07 朴素贝叶斯
  • 数据结构(二叉树)
  • C++ 模拟实现 map 和 set:掌握核心数据结构
  • Jmeter接口测试实例
  • Idea配置——build system的选项区别
  • 经常问的14002
  • 5.0.9 C# wpf通过WindowsFormsHost嵌入winform控件
  • hive-日期拆分为多行
  • 32-Hive SQL DML语法之查询数据
  • 系统网络端口安全扫描脚本及详解
  • SpringBoot激活指定profile的方式
  • linux统计文本文件中行数、单词数和字节数的命令行工具wc介绍
  • 深入解析Linux信号处理机制
  • Linux软硬链接与动静态库
  • MQTT与服务器通讯
  • LINUX88 变量:命令定义;普通数组定义(复);declare -i /-x
  • 接口返回504 Gateway Time-out 错误,这意味着请求在网关或代理服务器等待上游服务器响应时超时。以下是可能的原因和排查建议: