Linux线程与进程:探秘共享地址空间的并发实现与内

news2025/4/27 5:29:28

Linux系列


文章目录

  • Linux系列
  • 前言
  • 一、线程的概念
  • 二、线程与地址空间
    • 2.1 线程资源的分配
    • 2.2 虚拟地址到物理地址的转换
  • 三 、线程VS进程
  • 总结


前言

在Linux操作系统中,线程作为CPU调度的基本单位,起着至关重要的作用。深入理解线程控制机制,是学习Linux系统不可或缺的重要环节。

本篇文章我主要介绍,线程的概念、线程与进程的关系及线程在Linux下的实现。


一、线程的概念

线程(Thread)是操作系统能够进行运算调度的最小单位,是进程中的一个独立执行流。线程在进程的上下文中运行,共享进程的资源(如:内存、文件、内核数据结构等),但拥有自己的独立的执行栈。线程的存在使得程序可以更高效的并发执行。

Linux系统中,并未为线程单独构建管理结构,而是通过模拟进程的方式实施线程管理,复用进程的数据结构与管理算法。因此,Linux不存在真正意义上的线程,从操作系统层面来看,所有执行实体本质上均为轻量级进程。

下图表示的线程与进程的关系:

  1. 进程是资源分配的单位:图中红色框内的「进程地址空间」(包含用户空间的正文代码、数据段、共享区、栈等,以及内核空间)是进程的资源集合。进程拥有独立的地址空间,是系统分配资源(如内存、文件描述符)的基本单位。

  2. 线程是调度的基本单位:图中多个 task_struct(任务控制块)都表示一个线程,均指向同一进程地址空间,它们属于同一个进程的不同线程。每个 task_struct 代表一个线程,线程是 CPU 调度的基本单位,由 CPU 分配时间片执行。

  3. 资源共享关系:同一进程内的线程共享进程地址空间的资源(如用户空间的共享区、数据段、正文代码等),但每个线程有独立的栈空间(图中未详细区分每个线程的栈)和 task_struct(记录线程状态、寄存器信息等)。

  4. 内核视角与用户视角:在 Linux 中,线程本质是「轻量级进程」,内核通过 task_struct 管理线程,与管理进程的方式类似。但从用户视角看,多个线程属于同一进程,协作完成任务,共享进程资源,提升执行效率。

总结:进程是资源载体,线程是执行实体。在创建线程时不需要重新加载数据(代码、页表等),进程内的线程共用同一份地址空间,最开始创建的task_struct我们称为主线程,其他线程称为新线程。
在这里插入图片描述
我们之前介绍过的进程,都是只有一个执行流的特殊情况

二、线程与地址空间

2.1 线程资源的分配

在学习进程时我们了解到,CPU 访问进程资源需借助 task_struct 结构,通过进程地址空间获取虚拟内存地址,再经页表转换得到物理内存,进而实现对进程数据的访问。由此可见,进程地址空间是进程的资源载体。而线程并不单独分配地址空间资源,其本质是对所属进程地址空间特定范围的使用与操作,通过共享进程地址空间来实现资源利用。

2.2 虚拟地址到物理地址的转换

以32为计算机为例

磁盘文件文件加载到内存时,一般以4KB为单位(介绍文件管理时讲过)

在这里插入图片描述
在32位及其下,虚拟内存使用32位表示,当CPU进行虚拟内存到物理内存的转化时,会将这32位划分为:32=10+10+12,分别进行映射:
在这里插入图片描述

当 CPU 将虚拟地址转换为物理地址时,首先依据虚拟地址的前 10 位确定页目录表中的下标,利用该下标获取二级页表的基地址。接着,通过虚拟地址中间的 10 位确定二级页表中的下标,二级页表项中包含权限位,CPU 借助这些权限位判断是否存在越界访问或触发缺页中断。若访问合法,从二级页表项中获取物理内存页框的起始地址,最后结合虚拟地址的末 12 位,精准定位到实际物理内存地址。
在这里插入图片描述

三 、线程VS进程

Cache(高速缓存):
Cache 是介于 CPU 与主存(DRAM)之间的高速缓冲存储器,通常由 SRAM(静态存储器)构成,虽容量较小但访问速度极快。其核心功能是基于局部性原理,临时存储 CPU 近期可能频繁访问的数据,从而大幅提升数据访问效率。当 CPU 需读取数据时,会优先在 Cache 中查找:若命中目标数据,则直接从 Cache 读取,避免了对低速主存的访问;若未命中,则需从主存加载数据,并将其存入 Cache 以备后续使用。

从进程与线程的调度特性看:

  • 线程切换的缓存友好性:同一进程内的线程共享代码段、数据段和堆内存。当线程切换时,由于新线程所需访问的代码和数据仍属于原进程的地址空间范围,其数据可能依然驻留在 Cache 中,因此无需重新加载基础资源,有效降低了 Cache 失效的概率。
  • 进程切换的缓存冷启动:进程拥有独立的地址空间,当发生进程切换时,新进程的地址空间与原进程无重叠,导致 Cache 中缓存的旧进程数据无法被新进程复用。此时,CPU 需重新从主存加载新进程的代码和数据到 Cache,这一过程被称为「缓存冷启动」,会引入较高的访问延迟。

这种差异使得线程切换在性能上通常优于进程切换,尤其在需要频繁调度的场景中,线程的缓存利用率优势更为显著。

在创建进程时,操作系统需要为其分配独立的资源载体:

  • 构建专属的 task_struct 结构体(记录进程状态、优先级等核心信息);
  • 分配独立的页表与进程地址空间(包含代码段、数据段等内存区域);
  • 从磁盘加载进程的代码和数据到内存,并初始化进程上下文(如程序计数器、通用寄存器值等)。

而在进程中创建新线程时,由于线程共享所属进程的地址空间、页表及已加载的代码数据,操作系统仅需:

  • 为新线程创建独立的 task_struct 结构体;
  • 初始化线程独有的上下文数据(如线程栈空间、寄存器现场等轻量级资源)。

这种「资源共享 + 轻量上下文创建」的机制,使得线程创建的开销远低于进程,成为操作系统实现高效并发的关键技术路径。

总的来说线程相较于进程来说更加轻量化:

  • 切换更加轻量化
  • 创建和释放更加轻量化

总结

有些性质我会放在下篇介绍,本篇主要介绍概念
线程的优点

  • 创建一个新线程的代价要比创建一个新进程小得多
  • 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多线程占用的资源要比进程少很多
  • 能充分利用多处理器的可并行数量在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
  • 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
  • I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作

线程的缺点
性能损失

  • 一个很少被外部事件阻塞的计算密集型线程往往无法与其它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。
    健壮性降低
  • 编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。
    缺乏访问控制
  • 进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。
    编程难度提高
  • 编写与调试一个多线程程序比单线程程序困难得多
    线程异常
  • 单个线程如果出现除零,野指针问题导致线程崩溃,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2343790.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

科学养生,开启健康生活新方式

在快节奏的现代生活中,健康养生已成为人们关注的焦点。科学的养生方式不仅能增强体质,还能有效预防疾病,提升生活质量。​ 合理饮食是健康养生的基础。日常饮食应遵循均衡原则,保证蛋白质、碳水化合物、脂肪、维生素和矿物质的合…

外贸图片翻译软件推荐用哪些?不损原图画质的跨境图片翻译器,收藏!

在跨境电商的 “江湖” 里,卖家们怀揣着全球 “捞金” 的梦想扬帆起航,可谁能想到,一个看似不起眼的 “小怪兽”—— 图片翻译难题,却常常让大家在 “出海” 途中 “栽跟头”。 电商跨境图片翻译全能王——风车AI翻译 [fengchef…

3.1/Q1,Charls最新文章解读

文章题目:The impact of chronic diseases and lifestyle on sarcopenia risk in older adults: a population-based longitudinal study DOI:10.3389/fmed.2025.1500915 中文标题:慢性病和生活方式对老年人肌肉减少症风险的影响:…

简单几步,开启 Intel VT-x 让电脑“解开CPU封印”

#vmware #虚拟机 #cpu虚拟化 # Intel VT-x 前言 你是不是也遇到过这种情况:在尝试运行虚拟机(VM)、安卓模拟器,或者使用 Windows 沙盒、WSL2 等功能时,遇到了类似“此主机支持 Intel VT-x,但 Intel VT-x …

flutter 插件收集

2025年 1月10号Flutter插件手机 声音转文字 speech_to_text | Flutter package 文字转声音 flutter_tts | Flutter package 堆栈信息 stack_trace | Dart package 跳转到app设置里面 app_settings | Flutter package 轻松的动画 animations | Flutter package 日志打印 t…

pyenv-virtualenv(python 版本管理工具)

推荐参考(本人实测有用) 参考文章pyenv 和 pyenv-virtualenv 的安装、配置和使用(仅供参考) 参考文章 pyenvpyenv-virtualenv(仅供参考) pyenv (windows)安装 手动安装 git clone https://github.com/pye…

DocsGPT remote接口RCE(CVE-2025-0868)

免责声明 本文档所述漏洞详情及复现方法仅限用于合法授权的安全研究和学术教育用途。任何个人或组织不得利用本文内容从事未经许可的渗透测试、网络攻击或其他违法行为。使用者应确保其行为符合相关法律法规,并取得目标系统的明确授权。 对于因不当使用本文信息而造成的任何直…

消息中间件RabbitMQ-01:简要介绍及其Windows安装流程

一、简要介绍 定义:RabbitMQ 是一个开源消息中间件,用于实现消息队列和异步通信。 场景:适用于分布式系统、异步任务处理、消息解耦、高并发访问等场景。 比喻:RabbitMQ 就像是邮政公司,负责在不同系统间安全快速地传…

(二)读写分离架构、冷热分离架构

文章目录 读写分离架构什么是读写分离结构架构模型优缺点优点缺点 技术案例写情况读情况 冷热分离架构什么是冷热分离架构?架构模型优缺点优点 缺点技术案例读数据写数据 读写分离架构 什么是读写分离结构 读写分离架构针对于数据库。数据库原本负责读写两个功能。 读写分离架…

TS-300B浊度传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 三、程序设计 main文件 ts.h文件 ts.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 TS-300B浊度传感器介绍: 浊度是指溶液对光线通过时所产生的阻碍程度,它包括悬浮物对光的散射和…

Unity Paint In 3D 入门

插件版本4.1.8 快速开始 这是一个强大的,可自由涂鸦的Unity插件. 步骤1 任何带有 MeshFilter MeshRenderer 或 SkinnedMeshRenderer 的 GameObject 均可被喷涂。​​ ​​方法1​​ 为 GameObject 添加 CwPaintableMesh 组件。 ​​方法2​​ 点击 MeshRenderer 或 Skinne…

PyMC+AI提示词贝叶斯项目反应IRT理论Rasch分析篮球比赛官方数据:球员能力与位置层级结构研究

全文链接:tecdat.cn/?p41666 在体育数据分析领域不断发展的当下,数据科学家们致力于挖掘数据背后的深层价值,为各行业提供更具洞察力的决策依据。近期,我们团队完成了一项极具意义的咨询项目,旨在通过先进的数据分析手…

⭐Unity_Demolition Media Hap (播放Hap格式视频 超16K大分辨率视频 流畅播放以及帧同步解决方案)

播放大分辨率视频以及实现局域网视频同步是许多开发者会遇到的需求,AVPro有一个 Ultra Edition版本,也能播放Hap格式视频,之外就是Demolition Media Hap插件啦,实测即使是 7208*3808 大分辨率的视频帧率还是能稳定在30帧,它能帮助我们轻松解决…

【数据可视化-22】脱发因素探索的可视化分析

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN人工智能领域的优质创作者,提供AI相关的技术咨询、项目开发和个…

kubernetes》》k8s》》Heml

Heml 资料 下载地址 安装 curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash# helm 添加 仓库 # helm repo add 仓库名称 仓库地址 helm repo add stable http://mirror.azure.cn/kubernetes/charts/ # 移除仓库 helm repo remove 仓库名…

MySQL表的操作 -- 表的增删改查

目录 1. 表的创建2. 表的查看3. 表的修改4. 表的删除5. 总结 1. 表的创建 1.查看字符集及效验规则 2. 表的创建 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎;创建用户表1 创建用…

GIS开发笔记(12)基于osg和osgearth实现三维地图上的轨迹线绘制

一、实现效果 二、实现原理 1.设置起点和终点,用函数模拟出轨迹点,如从武汉到长春; 2.将地理坐标点转换成为世界坐标点; 3.根据世界坐标点绘制轨迹线,并设置样式; 4.将轨迹节点挂接到根节点,并定位。 三、参考代码 void MainWindow::sltDrawTrajectory() {qDebug(

MTKAndroid13-Launcher3 屏蔽部分app不让显示

实现Launcher3 桌面屏蔽部分内容,不让显示 文章目录 修改文件路径-实现方式基础-源码模块配置Launcher3 源码位置编译模块配置配置如下参数 属性配置:默认的Launcher3 选项配置GMS的Launcher3 配置 第三方Launcher需要默认为Launcher时候-系统Launcher3 …

PostgreSQL 数据库备份与恢复全面指南20250424

PostgreSQL 数据库备份与恢复全面指南 在数据库管理中,备份与恢复操作对于确保数据安全性、可用性和完整性至关重要。PostgreSQL 作为一款开源关系型数据库系统,广泛应用于各行各业,尤其在现代 AI 和大数据应用中,作为数据存储的…

专家系统的知识获取、检测与组织管理——基于《人工智能原理与方法》的深度解析

前文我们已经了解了专家系统的基本概念和一般结构,系统中有专业的知识才是专家系统的关键,接下来对专家系统中的知识是如何获取、检测、组织和管理的进行探讨。 1.专家系统的基本概念:专家系统的基本概念解析——基于《人工智能原理与方法》…