[linux仓库]线程与进程的较量:资源划分与内核实现的全景解析[线程贰] - 指南

news/2025/11/26 12:51:19/文章来源:https://www.cnblogs.com/yangykaifa/p/19272322

 各位看官好,我是egoist2023!

Linux == Linux is not Unix !

 今天来学习Linux的指令知识,并学会灵活使用这些指令。

 如果觉得这篇文章有支援,欢迎您一键三连,分享更多人哦!

目录

Linux线程控制

多线程角度理解资源"划分"

可执行程序角度理解资源"划分"

进程 vs 线程

线程背景

Linux多线程的实现 -- 内核角度

pthread库

进程vs线程, 线程其他理论话题

面试题

线程优点

线程缺点

线程异常

线程用途

哪些资源共享,哪些独占

进程和线程

进程的多个线程共享

总结


Linux线程控制

为了方便理解资源划分的本质,这里直接通过编写代码从实践再到理论.

多线程角度理解资源"划分"

int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void *), void *restrict arg);
功能:创建一个新的的线程(注意:该函数是第三方库,不属于C/C++)

参数:

  • thread:返回线程ID(输出型参数)
  • attr:设置线程的属性(优先级,栈大小之类),attr为NULL表⽰使⽤默认属性
  • start_routine:回调函数(函数指针类型),线程启动后要执⾏的函数
  • arg:传给线程启动函数的参数

返回值:成功返回0;失败返回错误码

void *thread_routine(void *arg)
{std::string name = (const char *)(arg);// 第二个死循环while (true){std::cout << "我是新线程...,名字: " << name << ", pid: " << getpid() << std::endl;sleep(1);}
}
int main()
{fun();pthread_t tid;pthread_create(&tid, NULL, thread_routine, (void *)"thread-1");while (true){std::cout << "我是主线程..., pid: " << getpid() << std::endl;sleep(1);}return 0;
}

通过我们之前讲过若是是使用第三方库必须要指令库名称,而库路径是能够被放到特定路径下的.

g++ *.cc -pthread(指定库名称)

编译执行该可执行程序后:

疑惑一:一个单进程代码,可能让两个死循环跑起来??不可能!!这说明一个进程内部,现在已经有两个不同的执行流!!!

疑惑二:主线程和新线程的pid是一样的啊!和之前创建进程是不一样的,使用ps ajx查看也确实存在一个进程.

使用ldd指令查看该可执行程序所依赖的动态库:

疑惑三:我们不是说依赖第三方库吗?可是我怎么见到所谓的thread库呢?这是由于我是ubuntu24.04的OS,thread被集成进libc里了,而在ubuntu22.04确实能找到该库.

可执行程序角度理解资源"划分"

main函数和函数都有地址,一个函数所对应的地址难道就只有一个吗?

thread -->一个可执行程序 -->一个进程呀于 -->有几套页表?-->1套页表

反汇编观察该可执行程序:objdump -S thread > test.s

  1. 进程看到资源的”窗口!就是进程页表的本质是什么?如果没有页表,虚拟地址空间就没有意义,也不能找到对应的物理内存,
  2. 所以,谁拥有更多的虚拟地址,谁就拥有更多的物理内存资源!
  3. 虚拟地址的集合!就是对函数进行编址,让不同的执行流,执行不同的函数函数
  4. 让不同的线程,执行不同的函数本质是让不同的线程,依据拥有不同区域的虚拟地址拥有不同的资源!
  5. 通过函数编译的方式,进行了进程内部的"资源划分"

进程 vs 线程

  • 进程: 一个运行起来的执行流,一个加载到内存中的工具(教材),进程 = 内核数据结构 +自己的代码和数据
  • 线程:进程内部的一个执行流,轻量化

如何理解进程内部的一个执行流?

Linux中,一个线程,在进程内部运行?线程在进程的虚拟地址空间中运行!!!

如何理解轻量化?

让不同的"线程”访问虚拟地址空间钟的一部分资源!

如何做到?让不同的线程未来执行不同的入口函数!

  • 观点:进程是系统分配资源的基础单位(内核角度,给进程下的定义),线程是CPU调度的基本单位

我认为单从上面的概念来看,我们是会一头雾水的,只有等讲解到底层完成时才能反过来更好理解以上的含义.

线程背景

线程的提出本质上是为了解决进程在并发场景下的效率挑战和资源浪费问题,是操作系统在 “并发能力” 和 “资源开销” 之间寻找平衡的产物。

既然已经提出了"线程"该场景的需求,自然也需要有各OS去实现对应的线程.而大家说一个进程中可能存在多个线程,线程也必须被调度,被切换等,因此也必须对线程进行管理,如何管理?

先描述,在组织 --> struct TCB --> 线程控制块

实现容器化管理线程TCB,也要有运行队列、等待队列、挂起,调度算法.

那么,大家真的有必要单独创建 “线程” 吗?它的行为模式看起来与进程颇为相似,这难道不是在做无用功吗?

实际上,不同操作系统对线程的搭建思路存在差异:在 Windows 系统中,确实明确实现了 “线程” 这一独立概念;而在 Linux 系统中,线程的构建方式更为巧妙 —— 它通过创建多个 PCB(进程控制块),让这些 PCB 共同指向同一个进程的虚拟地址空间。每个 PCB 会负责执行该进程代码区中的特定部分,且仅访问分配给自身的资源区域,这便是 Linux 系统中 “线程” 的本质实现形式

Linux多线程的构建 -- 内核角度

先描述,在组织-> struct TCB -> 线程控制块实现容器化管理线程TCB, 调度算法。

Linux系统,内核中,线程的实现,是用进程模拟的,复用了进程代码和结构!!!

我们之前提到,每个进程都需要分配一个 PCB;但从现在的视角来看,每个进程实际上至少需要一个 PCB。这些 PCB 会被放入 CPU 的运行队列,等待调度执行。

CPU看到的都叫做执行流: task struct 粒度<= 传统的进程(谈及执行流,CPU角度:不区分进程、线程,统一叫做,轻量级进程!!!)

此时我们再来理解进程和线程:

什么叫做进程?承担分配资源的基本实体 --> 如何理解我们以前讲的进程? --> 进程内部,只有一个执行流(线程)的进程

什么叫做线程?OS调度的基本单位 --> 一个 task_struct 叫做线程

今天的进程 --> 进程内部,可以有1个或者多个(执行流)的进程(只有一个执行流的进程是一种特殊情况)

但我认为仅靠上面这些并不能够支撑我们去更好地理解进程和线程,因此这里讲一个小故事:

在现实世界中,分配社会资源的核心单位是什么?家庭.

有多个家庭成员的.母亲负责每天早起做早餐,给家里人提供餐饭;父亲每天搭乘着地铁赶路,从早到晚都在上班,给家里人献出经济来源;孩子每天都要求去上学,每天好好学习,不让父母来操心.就是一个家庭内部,

,有没有发现大家都有一个相同的目的:过好日子.就是每一个家庭成员都各自在做着不同的事情.可

而这里的家庭就是所谓的进程,家庭成员就是一个个的线程,线程被创建出来做不同的事情,而他们被创建出来的目标是为了达成一个目标 -- 过好日子.

一个家庭内部,有多个成员 ---进程内具有多个执行流(线程);

一个家庭内部,只有一个成员!!

pthread库

有没有对应的指令可以查看一个进程内部有多少个轻量级进程呢?

ps -aL | head -1 && ps -aL | grep thread

进程vs线程, 线程其他理论话题

    面试题

    与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多!少体现在哪些地方呢?

    • 线程切换不需要切换CR3寄存器,因为CR3保存页表基地址,只要CR3不切就是线程间切换,切了就叫进程间切换;
    • TLB->缓存虚拟到物理地址 ---线程间切换,TLB不需要更新(进程间切换,TLB要重新缓存)
    • 进程内的多线程切换,cache缓存,不用更新 ; 但是进程间切换,就要重新把cache缓冲区“热起来
    • 进程间切换,虚拟地址空间就切了,所付出的成本更大;
    • CPU也是要统计每个线程的时间片,怎么知道?线程的pid是相等的,进程的所有线程的时间片被花完了,那么当前进程pid找到所有线程创建新线程,时间片会被均分.(OS怕被偷时间片)
    • 线程切换仍需保存和恢复硬件上下文,但进程间切换不也需要么;

    cat /proc/cpuinfo

    /proc/cpuinfo由内核动态生成,存储了当前系统中 CPU 的详细信息。其中就记录了cache缓存.

    线程优点

    • 创建⼀个新线程的代价要⽐创建⼀个新进程小得多
    • 与进程之间的切换相比,线程之间的切换需要操作系统做的⼯作要少很多
    1. 最主要的区别是线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的。这两种上下⽂切换的处理都是通过操作系统内核来完成的。内核的这种切换过程伴随的最显著的性能损耗是将寄存器中的内容切换出。
    2. 另外⼀个隐藏的损耗是上下⽂的切换会扰乱处理器的缓存机制。简单的说,⼀旦去切换上下⽂,处理器中所有已经缓存的内存地址⼀瞬间都作废了。还有⼀个显著的区别是当你改变虚拟内存空间的时候,处理的⻚表缓冲 TLB (快表)会被全部刷新,这将导致内存的访问在⼀段时间内相当的低效。但是在线程的切换中,不会出现该问题,当然还有硬件cache。
    • 线程占⽤的资源要⽐进程少很
    • 能充分利用多处理器的可并⾏数量
    • 在等待慢速I/O操作结束的同时,脚本可执⾏其他的计算任务
    • 计算密集型应⽤,为了能在多处理器平台上运⾏,将计算分解到多个线程中实现(不要太多)
    • 通过I/O密集型应用,为了提⾼性能,将I/O运行重叠。线程能够同时等待不同的I/O操作(许可多一些)。
    • 建议是cpu个数*核数,大部分操作都是内存级操作,假如创建太多了,额外的增加OS调度线程时切换线程的成本

    线程缺点

    • 增加了额外的同步和调度开销,⽽可⽤的资源不变。就是性能损失:⼀个很少被外部事件阻塞的计算密集型线程往往⽆法与其它线程共享同⼀个处理器。若是计算密集型线程的数量⽐可⽤的处理器多,那么可能会有较⼤的性能损失,这⾥的性能损失指的
    • 健壮性降低:编写多线程得更全⾯更深⼊的考虑,在⼀个多线程脚本⾥,因时间分配上的细微偏差或者因共享了不该共享的变量⽽造成不良影响的可能性是很⼤的,换句话说线程之间是缺乏保护的。
    • 缺乏访问控制:进程是访问控制的基本粒度,在⼀个线程中调⽤某些OS函数会对整个进程造成影响。
    • 编程难度提⾼:编写与调试⼀个多线程程序⽐单线程程序困难得多

    线程异常

    • 单个线程如果出现除零,野指针问题导致线程崩溃,进程也会随着崩溃
    • 线程是进程的执⾏分支,线程出异常,就类似进程出异常,进⽽触发信号机制,终⽌进程,进程终⽌,该进程内的所有线程也就随即退出

    线程用途

    • 合理的使⽤多线程,能提⾼CPU密集型程序的执行效率
    • 合理的使⽤多线程,能提⾼IO密集型程序的用户体验(如⽣活中我们⼀边写代码⼀边下载开发⼯具,就是多线程运行的⼀种表现)

    如今我们终于可能理解,一个线程出现异常,整个进程为何会崩溃?

    1. 线程是代表一个进程;
    2. 线程出现异常,OS就会给进程发送信号,就会被杀掉,而进程的资源就会被释放,而线程用的资源是进程给予的,没有生存空间.

    哪些资源共享,哪些独占

    • 进程间具有独立性(进程更强调独占,偶尔要有共享)
    • 线程共享地址空间,也就共享进程资源(线程更强调共享,偶尔要有独占)

    进程和线程

    进程是资源分配的基本单位

    线程是调度的核心单位

    必答的,只有调度,,才需要切换上下文;除了被调用,还会产生各种临时数据,也要有函数调用,栈帧结构:就是线程共享进程数据,但也拥有⾃⼰的⼀部分资料,对于前3点

    • 线程ID
    • ⼀组寄存器
    • errno
    • 信号屏蔽字
    • 调度优先级

    进程的多个线程共享

    通过共享的,如果定义⼀个函数,在各线程中都能够调用,假设定义⼀个全局变量,在各线程中都能够访问到,除此之外,各线程还共享以下进程资源和环境:就是同⼀地址空间,因此Text Segment、Data Segment都

    • ⽂件描述符表
    • 每种信号的处理⽅式(SIG_ IGN、SIG_ DFL或者⾃定义的信号处理函数)
    • 当前⼯作⽬录
    • 用户id和组id

    进程和线程的关系如下图:

    总结

    本文介绍了Linux系统中线程控制的核心概念与实现原理。主要内容包括:

    1. 借助pthread_create函数创建线程的实践方法;
    2. Linux内核采用进程模拟线程的独特完成方式(轻量级进程);
    3. 进程与线程的区别与联系,强调进程是资源分配单位而线程是调度单位;
    4. 线程切换相比进程切换的性能优势(如无需切换页表、TLB等);
    5. 线程的应用场景与优缺点分析。文章借助代码示例和家庭比喻生动阐释了多线程工作机制,并指出线程异常会导致整个进程终止的原因。末了总结了线程共享的进程资源和独有的线程特性,支援读者深入理解Linux多线程编程的本质。

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

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

    相关文章

    2025年靠谱的阻尼一字铰链高评价厂家推荐榜

    2025年靠谱的阻尼一字铰链高评价厂家推荐榜行业背景与市场趋势五金配件作为建筑装饰和家具制造的核心组成部分,近年来随着消费升级和品质需求的提升,行业正经历着从传统制造向智能化、精密化方向的转型。根据中国五金…

    2025年评价高的三防漆胶水TOP品牌厂家排行榜

    2025年评价高的三防漆胶水TOP品牌厂家排行榜 行业背景与市场趋势 随着电子制造、汽车、新能源等行业的快速发展,三防漆胶水的市场需求持续增长。三防漆(防潮、防盐雾、防霉)作为电子元器件保护的关键材料,其性能…

    2025年靠谱的含油轴承厂家最新推荐排行榜

    2025年靠谱的含油轴承厂家最新推荐排行榜行业背景与市场趋势含油轴承作为机械传动系统中的关键部件,近年来随着全球制造业的持续发展,市场规模不断扩大。根据《2024-2029年中国滑动轴承行业市场调研与投资前景预测报…

    DevPod 如何重塑 AI 模型工程化:DeepSeek-OCR 从开发到生产的完整工作流解析

    开发调试到生产上线,全流程仅需一个工作区——DevPod 重新定义 AI 工程化标准,当开发与部署不再割裂,模型价值才真正释放。作者:西流开发调试到生产上线,全流程仅需一个工作区——DevPod 重新定义 AI 工程化标准,…

    2025年评价高的球磨机陶瓷衬板厂家推荐及选择指南

    2025年评价高的球磨机陶瓷衬板厂家推荐及选择指南行业背景与市场趋势球磨机作为矿山、水泥、冶金等行业的关键设备,其衬板质量直接影响设备运行效率和使用寿命。近年来,随着陶瓷材料技术的突破,陶瓷衬板因其优异的耐…

    2025年比较好的刮板机铸石板行业内口碑厂家排行榜

    2025年比较好的刮板机铸石板行业内口碑厂家排行榜行业背景与市场趋势刮板机铸石板作为工业输送设备的关键部件,近年来随着矿山、电力、冶金等行业的快速发展,市场需求持续增长。据中国建材工业协会最新数据显示,202…

    阿里云的DashScope详解

    阿里云的DashScope详解Posted on 2025-11-26 12:42 Java后端的Ai之路 阅读(0) 评论(0) 收藏 举报🌟 DashScope 大白话:阿里云的“AI点菜平台”✅ 一句话说清:DashScope = 阿里云的“AI外卖平台”你不用自己养…

    iOS - RunLoop 相关知识点

    为什么要有 RunLoop?背景:线程执行完任务就会退出,但主线程(或者一些后台线程等)我们希望它能够一直存在、持续等待事件(触摸、定时器、网络回调等)。原始的解决方案:如果写成 while(1) {} 类似的死循环,会出…

    2025年质量好的机制砂选粉机行业内知名厂家排行榜

    2025年质量好的机制砂选粉机行业内知名厂家排行榜行业背景与市场趋势随着我国基础设施建设的持续投入和环保要求的不断提高,机制砂行业迎来了快速发展期。据中国砂石协会最新统计数据显示,2024年我国机制砂市场规模已…

    2025年热门的单轴芯导轨行业内口碑厂家排行榜

    2025年热门的单轴芯导轨行业内口碑厂家排行榜行业背景与市场趋势单轴芯导轨作为工业自动化领域的关键零部件,近年来随着智能制造、新能源等产业的快速发展,市场需求持续增长。据《2024-2025中国线性传动部件行业白皮…

    2025年评价高的护颈AB枕芯厂家最新推荐排行榜

    2025年评价高的护颈AB枕芯厂家最新推荐排行榜 行业背景与市场趋势 随着现代人健康意识的提升,护颈枕芯市场近年来呈现快速增长态势。据《2024-2025年中国寝具行业白皮书》数据显示,2024年国内护颈枕芯市场规模已达…

    如何安装snac

    如何安装snac内容参考:https://www.bandwagonhost.net/12445.html https://blog.example_user.moe/posts/selfhost-snac-activitypub-on-debian-with-nginx/添加一个新账户 使用 adduser 命令创建一个新用户帐户。为新…

    2025年质量好的称重包装机厂家推荐及采购参考

    2025年质量好的称重包装机厂家推荐及采购参考行业背景与市场趋势随着全球制造业的智能化升级和包装行业的快速发展,称重包装机作为自动化生产线上的关键设备,其市场需求持续增长。据《2024-2029全球包装机械行业市场…

    2025年质量好的干选系统选煤设备厂家最新实力排行

    2025年质量好的干选系统选煤设备厂家最新实力排行行业背景与市场趋势随着全球能源结构调整和环保要求日益严格,煤炭行业正经历着深刻的转型升级。据中国煤炭工业协会最新数据显示,2024年我国煤炭洗选率已达到78.5%,…

    2025年口碑好的污水处理设备热门厂家推荐榜单

    2025年口碑好的污水处理设备热门厂家推荐榜单行业背景与市场趋势随着我国环保政策的持续加码和"双碳"目标的深入推进,污水处理设备行业迎来了前所未有的发展机遇。据中国环保产业协会最新数据显示,2024年我…

    【日记】第一次听这么多内幕消息哈哈哈(1243 字)

    正文培训讲了一天安装麒麟系统,敲 ls, cp, mv, sudo 这种命令…… 真的没问题吗…… 我感觉每次培训都要从很白痴的地方开始讲起。算是玩了一天手机吧。昨天开了中泰的户,总觉得还是有点亏,于是又开始找其他渠道。最…

    2025年知名的气相硅橡胶厂家推荐及选择参考

    2025年知名的气相硅橡胶厂家推荐及选择参考行业背景与市场趋势气相硅橡胶作为一种高性能有机硅材料,近年来在电子电器、汽车制造、医疗器械、新能源等领域的应用持续扩大。根据《2024-2029年中国有机硅行业市场调研与…

    2025年热门的水处理环保设备品牌厂家排行榜

    2025年热门的水处理环保设备品牌厂家排行榜行业背景与市场趋势随着全球环保意识的不断提升和各国环保法规的日益严格,水处理环保设备行业迎来了前所未有的发展机遇。根据最新发布的《2024-2029年中国水处理设备行业市…

    2025年知名的蜗轮蜗杆升降机最新TOP厂家排名

    2025年知名的蜗轮蜗杆升降机最新TOP厂家排名行业背景与市场趋势蜗轮蜗杆升降机作为工业传动领域的关键设备,近年来随着制造业自动化升级和智能制造的推进,市场需求持续增长。据《2024-2025年中国传动设备行业白皮书》…

    2025年评价高的抗风工业门厂家最新TOP排行榜

    2025年评价高的抗风工业门厂家最新TOP排行榜行业背景与市场趋势随着工业4.0的深入推进和智能制造需求的持续增长,抗风工业门作为工业建筑安全防护的重要设施,其市场需求呈现稳定上升态势。据中国工业门行业协会最新数…