一文搞懂Linux多线程【上】

?引言

今天,我们开始学习linux中的线程部分。linux线程和进程同等重要。接下来,我们将从什么是线程,线程的实现原理,为社么会有线程这个概念,线程和进程之间的关系等等方面来学习。我想告诉大家的是线程内容比较困难,希望大家克服困难。那么我们就开始吧!

一文搞懂Linux多线程【上】

?再次理解页表

在Linux中,我们对页表的概念日益丰富。从一开始的认为页表仅仅负责物理内存和虚拟内存地址之间的转化,然后又知道了不仅仅有用户级页表,也有内核级页表。但是,我们始终不知道页表是如何实现虚拟内存到物理内存之间的地址的转化的。今天,我们就把页表给研究透彻。

在磁盘中,代码被编译时,是按4KB空间大小为单位进行编译的,然后划分出了一个个单位大小的页帧。当代码和数据被加载到内存时,同样也是按照4KB为单位进行加载的。物理内存就划分出了若干个4KB大小的子空间,叫做页框。

这些页框也需要被操作系统给管理起来,管理方法为先描述,再组织。这块内容我就不详细阐述了,大家有兴趣的可以上网查一查。

我们以32位环境为例讲解。

在32位环境下,一个地址是32个比特位,这32个比特位从高权重开始被划分成了10,10,12的三组。

为什么要划分开呢?为什么要这么划分呢?我知道此时的大家心里一定有很多的疑惑,没关系,我们接着往下看。我想告诉大家:世界上的所有东西,都有它存在的理由。

一文搞懂Linux多线程【上】

我们先看第一组的10个比特位。这10个比特位表示的十进制数据范围为0—-1023,共1014个数据。 这10个比特位对应的是页目录。

一文搞懂Linux多线程【上】

这个页目录有1024个空间,把上面的10个比特位的十进制数据当作偏移量,由高到低在页目录中查找。每个空间后面都对应着一张页表。

然后再看第二组的10个比特位,全排列的个数位1024个。我们可以把页表当作一个有1024个元素的数组,里边存放的是物理内存指定页框的起始地址。我们根据偏移量找到起始地址。然后就直接找到了物理内存。

然后到了最后的一组的12个比特位,12个比特位正好对应的是4KB页框的空间呀。我们根据这12个比特位的为地址,就在指定的页框中找到了我们要的数据。

总结一下,过程就是划分虚拟地址的比特位采用多级页表的方式进行查找的。

一文搞懂Linux多线程【上】

?初识线程

我们先回忆一下进程的概念

我们知道:进程=内核数据结构+进程对应的代码和数据,一个进程的创建必然伴随着大量的数据结构来维护该进程,线程是不是也是这样呢?我们一会儿再谈。

此时的我们应如何看待虚拟内存呢?虚拟内存决定了进程看到的资源。

接下来,我们正式开始介绍我们的线程

如下图:

一文搞懂Linux多线程【上】

这就是一个进程的完整的结构。

此时,如果仅创建若干个task_struct结果体,让该结构体指向同一个虚拟内存空间,就形成了若干个执行流,每个执行流就是一个线程。所以,线程是进程内的一个执行流 。原来的一个进程的资源可以按照某种方式划分成若干份,每个线程获得其中的一小份资源。

因为我们采用虚拟内存空间+页表的方式对资源进行划分。所以单个“进程”一定要比之前的进程执行力度更细。

为了方便大家理解,我举个小例子:

一个人被锁到了一件屋子里,这个人仅可以通过窗户看到外边的风景。有一天,又有几个人被关了进来。他们就平分这个窗户,每个人获得其中的一小部分,只可以通过这一小块窗户看到外边。人就是线程,窗户就是页表,外表的风景就是物理内存空间也就是资源。

一文搞懂Linux多线程【上】

操作系统作为软硬件资源的管理者,要不要对这些线程进行有效的管理呢?当然需要,管理的方式就是先描述,再组织。

线程之间的关系如何表示,如何表示线程。操作系统如何选择线程进行执行。一切的一切都需要重新构建,其构建过程相当之复杂。所以有的操作系统对线程重新构建了一套数据结构。这样做的操作系统典型的是windows

但是仔细观察我们不难知道:进程和线程的大多数属性是一样的,为了减少开发的成本和维护成本,我们为何不复用进程的相关数据结构呢?所以操作系统就基于进程的PCB结构体创建了线程的TCB(thread control block)。这样做的操作系统典型的就是Linux。所以对一个进程内的线程的管理就变成了对TCB的管理。

这个结构体,我们先见一见就可以了,里边的东西我们会陆续知道的。

学到现在,懵了。我们有必要再重新认识一下进程

现在的进程应该包括:若干个PCB和一个虚拟内存空间,若干个页表和物理内存中相关的代码和数据。创建这些结构对象极度依赖系统资源。

所以进程:在内核角度,是承担分配系统资源的基本实体

LimeSurvey在线问卷管理系统 LimeSurvey在线问卷管理系统

LimeSurvey是一款在线问卷管理系统,具有问卷的设计、修改、发布、回收和统计等多项功能。同时它也是一个开源软件,其最新版本的软件包可以完全免费获取和使用。它集成了调查程序开发、调查问卷的发布以及数据收集等功能,使用它,用户不必了解这些功能的编程细节。 网上收集的调查数据可以导出多种文件格式以便分析,例如 spss数据格式 *.dat文件。

LimeSurvey在线问卷管理系统 198 查看详情 LimeSurvey在线问卷管理系统

线程就是CPU调度的基本单位,一个线程就是一个执行流。

毫不冲突。谁规定了一个进程内部必须有多个线程了?一个进程内部有一个执行流(一个执行流就是一个线程)依旧可以。所以我们可以把之前讲的进程认为是单线程的进程。 今天我们认为一个进程包括多个线程,一个进程只有一个线程当然也是可以的。所以之前的进程概念是今天我们学习的进程概念的子集,一个特例。

CPU在调度时,不关系调度的是进程中的哪一个执行流。它所关心的就是让我顺利调度就ok了。

别人给它哪个,它就执行哪个执行流。至于给哪个线程来执行,这是进程应该考虑的问题。

接下来,我们对如上的知识再次总结一下:

Linux内核中并没有真正意义上的线程,Linux是使用进程PCB来模拟线程的,是一种完全属于Linux自己的线程方案。站在CPU的视角,每一个PCB,都是一个轻量级进程。Linux线程是CPU调度的基本单位,而进程是承担分配系统资源的基本单位。进程是用来整体申请资源的,线程是用来伸手向进程要资源的。Linux中没有真正意义上的线程。但是操作系统只认线程,用户和程序员只认线程。Linux无法提供创建线程的接口,只能提供创建轻量级进程的接口。所以诞生了线程库的概念Linux的这种设计方案好处是什么?一个系统越复杂,也就意味着出问题的概率越高,维护成本也就越高。Linux的设计方案简单,维护成本大大降低,可靠性高。便于长期对外提供服务。

举个小例子:

在我们国家,承担分配社会资源的基本单位就是家庭。一般每个家庭的组成为:子女,父母,爷爷奶奶。子女学习,父母工作。爷爷奶奶可能退休了,他们要管好自己的身体,但是所有人都有一个共同目标,那就是把家里的生活变得越来越好。

国家就像操作系统,家庭像是进程,而每个家庭成员就是线程。但有的人就比较惨了,既无父母,也无子女,这样的家庭既是进程也是线程。

?线程和pthread库

pthread是任何Linux的操作系统都必须要有的。

我们提到,在Linux内核中并没有线程这样的概念,自然不会有创建线程的相关系统调用。但是程序员只认线程,所以程序员就自己编写了一个用户级线程库:pthread库

?线程创建

在Linux系统中,通过pthread库提供的pthread_create函数可以创建新的线程。该函数的原型如下:

代码语言:javascript代码运行次数:0运行复制

       #include        int pthread_create(pthread_t *thread, const pthread_attr_t *attr,                          void *(*start_routine) (void *), void *arg);

thread : 输出型参数,用于获取创建成功线程的ID,该参数是一个输出型参数attr(attribute 属性) : 用于设置创建线程的属性,传入NULL设置默认属性start_routine(routine 常规) : 该参数是一个函数指针,即线程启动后需要执行的函数arg (argument 参数) : 传给线程的参数

当一个程序启动时,一个进程被操作系统进行创建,与此同时一个线程也立刻运行,这个第一个被创建的线程就是主线程。

即主线程就是产生其它子线程的线程,通常主线程必须最后完成某些执行操作,比如各种关闭动作

接下来,我们做一个小实验

代码语言:javascript代码运行次数:0运行复制

#include#include#include#includeusing namespace std;void* pthread_routine(void *args){    while(1)    {         cout<<"我是新进程,我正在运行"<<endl;         sleep(1);    }   }int main(){    pthread_t tid;    int n=pthread_create(&tid,nullptr,pthread_routine,(void *)"thread one");    assert(n==0);    (void)n;    while(1)    {        cout<<"我是主进程,我正在运行"<<endl;        sleep(1);    }    return 0;}
一文搞懂Linux多线程【上】

注意。由于pthread是第三方库,所以我们在编译时,必须指明要链接的库名称。

一文搞懂Linux多线程【上】

在查询轻量级进程的查询项中有一个LWP(light weight pthread) 表示轻量级进程的ID。

其中进程的PID和轻量级进程ID相等的线程为主线程,另一个为新线程。它们为两个不同的执行流。

?线程的资源共享问题

我们上面谈了,一个线程被创建,被分配得到相应的代码,然后运行。那么数据呢?一个进程内的若干线程的数据是如何保存的呢?我们做个实验

代码语言:javascript代码运行次数:0运行复制

#include#include#include#includeusing namespace std;int g_val=0;void* pthread_routine(void *args){    while(1)    {         cout<<"我是新进程,我正在运行,g_val:"<< g_val++<<"  &g_val: "<<&g_val<<endl;         sleep(1);    }   }int main(){    pthread_t tid;    int n=pthread_create(&tid,nullptr,pthread_routine,(void *)"thread one");    assert(n==0);    (void)n;    while(1)    {        cout<<"我是主进程,我正在运行,g_val:"<<g_val<<"   &g_val:"<<&g_val<<endl;        sleep(1);    }    return 0;}

我们定义一个全局变量,然后由新线程对该全局变量进行++操作。从主线程端读取数据。

一文搞懂Linux多线程【上】

从中,我们发现新线程将数据一改,主线程立刻就可以读取改过的数据。且主线程和新线程读取的地址是同一个。说明这个变量是被所有进程所共享的。

在家庭中,一般我们家庭的资源都是被所有家庭成员所共享的。例如:电视机,交通工具等等。

但是,也肯定存在成员见私有的东西,比如日记本,老年人吃的补品等等。

PCB属性私有,例如状态优先级。要有一定私有的上下文数据每一个线程都要有独立的栈结构

对于第三点,我有问题,虚拟地址空间中只有一个栈结构,怎样实现独立的呢?我们后边说。

进程切换需要切换:上下文数据&&PCB&&虚拟内存&&切换页表线程切换需要切换:上下文数据&&PCB其主要的差异体现在cache上。线程切换时cache不用太更新,数据依旧可以使用;但是进程在切换时,数据需要全部更新。

一文搞懂Linux多线程【上】

其实,CPU是CPU内部的一个硬件级缓存,这个缓存速度比内存要快,但是比CPU运算的速度要慢。从内存中读取的数据要先经过cache,然后寄存器再从cache中读取数据。

一个运行正常的进程,cache中一定存在着大量的热点数据,线程在切换时,同属于一个进程,我们知道一个进程的大部分数据是被所有线程所共享的。所以线程在切换极有可能会继续使用cache中的热点数据。进程在切换时,这些热点数据一点用就没有了,需要全部加载。这些热点数据的形成是需要时间的,这段时间内cpu只能写透式的访问内存,所以操作系统要做更多的工作。

?线程的优缺点

优点

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

缺点

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

到这,本博客内容就到这里了,我们下期再见!

以上就是一文搞懂Linux多线程【上】的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/812880.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月26日 23:31:27
下一篇 2025年11月26日 23:31:50

相关推荐

  • B安交易所正版地址 币安App官方v2.117.0推荐极速安装

    必须通过官方渠道下载安装币安App以保障账户与资产安全。1. 安卓用户应访问官网并核对网址真实性;2. 找到“下载”入口选择APK直接下载;3. 授权并完成安装流程。iOS用户则需1. 通过App Store搜索;2. 确认开发者信息选择官方应用;3. 获取并自动安装。始终确保来源可靠并定期检查更新…

    2025年12月8日
    000
  • 义乌商户开始收取稳定币是真的吗?

    关于浙江义乌部分商户开始接受usdt(泰达币)等稳定币作为贸易货款结算方式的传闻,引起了广泛关注。本文将深入探讨这一现象的真实性、规模,并介绍进行此类交易可能涉及的主要数字资产平台,为读者提供一个清晰的全局认知。 2025年稳定币交易所: 欧易okx官网: 币安binance官网: 火币htx官网:…

    2025年12月8日
    000
  • 为什么会有稳定币,普通人为什么要买稳定币

    数字货币领域因其价格剧烈波动而闻名。例如,比特币或以太坊的价格可能在一天甚至更短的时间内经历显著上涨或下跌。 这种不稳定性使得它们在作为日常支付工具或可靠的价值储存手段方面存在挑战。想象一下,如果你的薪水以比特币支付,其价值今天和明天可能完全不同。 市场的快速变化给用户带来了风险,尤其是那些不希望承…

    2025年12月8日
    000
  • 为什么稳定币成为加密货币市场的 “避风港”?

    稳定币能成为加密货币市场的“避风港”,1. 因其价格锚定机制隔绝剧烈波动,主流稳定币如USDT、USDC与美元1:1锚定,通过法币储备、加密资产抵押或算法调节维持稳定;2. 作为交易媒介保障流动性,在市场恐慌时稳定币交易对仍保持高流动性,成为资金撤离风险资产的“安全通道”;3. 跨场景适用性强化避险…

    2025年12月8日
    000
  • 稳定币是什么?为什么抖音热搜都在讨论?

    稳定币是一种与美元等资产挂钩、旨在保持价值稳定的加密货币,主要分为法币抵押、加密货币抵押和算法三种类型。1.法币抵押型如USDT、USCD由美元储备支持;2.加密货币抵押型如DAI需超额抵押其他币种;3.算法型依赖智能合约调节供应量但风险较高。其在抖音等平台热议的原因包括:作为加密市场下跌时的避险工…

    2025年12月8日
    000
  • NALA币属于什么链上的_NALA币是什么链上的币

    【权威推荐】2025主流数字货币交易平台合集 Binance币安 官网直达: 安卓安装包下载: 欧易OKX ️ 官网直达: 安卓安装包下载: Huobi火币️ 官网直达: 安卓安装包下载: NALA币属于什么链上的?NALA币是什么链上的币 NALA币是一种基于区块链技术发行的数字资产,明确归属于特…

    2025年12月8日
    000
  • Sogni AI(SOGNI)是什么?怎么样?SOGNI代币经济与未来前景分析

    目录 Sogni AI(SOGNI)是什么?Sogni AI解决什么问题?1. 创意人工智能中心化危机2. 基础设施无障碍障碍3. 创意网络中的经济不平等4. 隐私和所有权问题Sogni AI背后的故事Sogni AI 主要特点和优势1. 双层渲染架构2. 隐私至上的创作环境3. 全面的模型库4. …

    2025年12月8日 好文分享
    000
  • SKYAI币价格预测:SKYAI未来如何?会是下一个AI币黑马吗?

    目录 SkyAI是什么?SkyAI 的运作原理1、MCP(模型上下文协议)2、多链资料聚合3、MCP 市场与数据经济SKYAI币是什么?1、SKYAI 币用途2、SKYAI 代币经济学SkyAI 价格走势分析SkyAI币价格预测1、LiteFinance 的SKYAI 价格预测2、TradingBe…

    2025年12月8日
    000
  • 什么是Infinity Ground (AIN)?AIN未来价格如何?AIN价格预测2025至2032

    目录 加密货币:简要概述为什么Infinity Ground 价格预测的重要性如何分析Infinity Ground的未来价格解读Infinity Ground价格预测价格预测价格模式和趋势支撑位和阻力位指标和震荡指标交易量分析风险管理心理因素Infinity Ground 价格预测 2025 &#…

    2025年12月8日
    000
  • 区块链是什么?它是如何运作的?加密货币背后的技术完整指南

    目录 区块链是什么?定义、结构及其工作原理区块链在数字世界中为什么重要?什么是加密货币交易中的区块链?区块链的关键组成部分区块链网路的类型区块链的实际应用案例区块链真的安全吗?区块链技术的未来趋势区块链常见问题解答结论 区块链是什么?定义、结构及其工作原理 区块链是一种去中心化的数字帐本,数据以区块…

    2025年12月8日
    000
  • 什么是止损单和止盈单?比特币止损和止盈单设置指南

    止损单和止盈单是比特币交易者用于自动锁定利润和及时止损的重要风险管理工具,能够帮助应对全天候、高度波动的市场环境。 止损单和止盈单的应用早在比特币诞生前便已广泛存在于传统金融市场,作为控制风险和锁定利润的重要手段。 其核心作用是在资产价格触及设定区间时,自动执行买入或卖出操作,从而帮助投资者减少损失…

    2025年12月8日
    000
  • 币圈新手做不好合约止损的九大原因

    我们都知道止损很重要,没有止损会导致一个小错误变成大错误,无法自控,长期不可能有好的交易结果。 但是知易行难,为什么简简单单的“止损”,做起来却那么难。 本文整理下新手做不好合约止损的九大原因,大家对号入座,对症下药。 止损的原则: 1、必须有止损:必须开单时候就挂好止损,任何时候止损委托都要在,并…

    2025年12月8日
    000
  • HaasBot量化神器实战测评 深度解析套利策略

    本文将对HaasBot这款量化工具进行实战测评,并深入探讨其备受顶级交易平台青睐的原因。我们将通过解析其核心功能,特别是自动化套利策略的运作机制,来解答为什么Top10交易所都在用HaasOnline。文章会详细讲解套利策略的配置过程,并结合一个真实案例进行剖析,帮助用户理解其操作与盈利逻辑。 Ha…

    2025年12月8日
    000
  • 狗狗币交易平台app下载 狗狗币交易平台有哪些

    本文将围绕狗狗币交易平台的选择与官方应用下载展开说明。会详细讲解如何通过安全可靠的渠道寻找并下载交易平台的应用程序,这个过程会以分步教学的形式呈现。接着,会介绍几个当前市场上主流的狗狗币交易平台,并结合网络用户的普遍反馈,对它们的特点进行综合性阐述,以供参考。 2025狗狗币交易所官网注册地址推荐:…

    2025年12月8日
    000
  • ETH为什么大涨_ETH价格暴涨背后原因解析

    【权威推荐】2025主流数字货币交易平台合集 Binance币安 官网直达: 安卓安装包下载: 欧易OKX ️ 官网直达: 安卓安装包下载: Huobi火币️ 官网直达: 安卓安装包下载: ETH为什么大涨?以太坊价格暴涨背后原因解析 近期,以太坊(ETH)价格出现显著上涨,市场热度持续升温,引发投…

    2025年12月8日
    000
  • 虚拟货币的5大分类标准 交易所不会告诉你的选币技巧80%散户都买错了

    许多散户投资者在选择虚拟货币时感到困惑,导致做出不理想的决策。本文旨在解决这一问题,通过系统性地介绍虚拟货币的五大核心分类标准,帮助您理解交易所通常不会主动强调的选币逻辑。掌握这些分类方法,将有助于您建立一套独立的分析框架,从而更精准地评估项目价值,避免盲目投资。 2025主流加密货币交易所官网注册…

    2025年12月8日
    000
  • 为什么全球巨头都在布局比特币? 不仅是数字黄金,这5个用途将改变未来经济格局

    本文将深入探讨全球商业巨头纷纷将比特币纳入其战略布局的核心原因。我们将超越“数字黄金”这一普遍认知,通过分析比特币在未来经济中扮演的五个关键角色,来解答为何它被视为一项能够重塑未来的颠覆性技术。文章将逐一讲解这些用途,帮助理解其深远影响。 2025主流加密货币交易所官网注册地址推荐: 欧易OKX: …

    2025年12月8日
    000
  • 稳定币为什么稳定?稳定币真的不会跌吗?

    binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: 稳定币的设计宗旨是维持其市场价值与某一相对稳定的资产(如美元、黄金等)挂钩。人们期待稳定币能够提供加密货币的便利性,同时规避其价格的剧烈波动性。这种稳定性对于交易、…

    2025年12月8日
    000
  • 稳定币为什么稳定?稳定币真的安全吗?

    稳定币在加密货币领域扮演着独特的角色,它们旨在提供一种价值相对稳定的数字资产。与比特币或以太坊等波动性较大的加密货币不同,稳定币的核心目标是维持其市场价值与某种外部资产的价值保持一致。这种外部资产通常是主流的法币,例如美元、欧元,但也可能包括一篮子货币、大宗商品甚至其他加密资产的组合。建立并维持这种…

    2025年12月8日
    000
  • 交易平台不会告诉你的杠杆交易风控3大法则

    杠杆交易因其高收益潜力吸引了众多参与者,但其背后隐藏的巨大风险也常常被忽视。交易所虽然提供了交易工具,却很少深入讲解交易者赖以生存的核心风控逻辑。本文将详细阐述杠杆交易中三个至关重要的风控法则,通过具体的操作过程讲解,帮助您建立科学的交易风控体系,从而在市场中行稳致远。 2025主流加密货币交易所官…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信