【Linux】线程概念

【Linux】线程Pthread的概念 | NPTL线程库函数 线程是操作系统能够进行调度和执行的最小单位。它是进程内执行的一个独立单元,与同一进程中的其他线程共享进程的地址空间和系统资源。 线程能减少程序在并发执行时所付出的时空开销,使操作系统具有更好的并发性。 二、线程和进程 一般情况下进程包含线程,线程比进程更轻量(体积更小,开销更小) 进程是最小的分配资源单位,线程是最小的调度单位 线程不分配内存,线程创建于进程中,与进程共享资源,访问进程的内存,完成特定任务 类 Unix 系统中,早期是没有“线程”概念的,80 年代才引入,借助进程机制实现出了线程的 阅读详情

       🔥🔥 欢迎来到小林的博客!!
      🛰️博客主页:✈️林 子
      🛰️博客专栏:✈️ Linux
      🛰️社区 :✈️ 进步学堂
      🛰️欢迎关注:👍点赞🙌收藏✍️留言

线程与进程

我们都知道,进程是操作系分配资源的基本实体。 每当操作系统创建一个新的进程时,都会为这个进程分配资源,例如 : 进程地址空间,页表…等。

在这里插入图片描述

那如何理解线程呢?

在Linux系统下,并没有真正意义上的线程。因为在Linux系统下,线程没有属于自己的数据结构。而windows操作系统是为线程设定了指定的数据结构。而在Linux系统下,线程复用了进程的PCB。也就是说,描述线程和进程的结构体都是task_struct。 而这些PCB都共享同一块进程地址空间,共享同一块页表…以及其他的资源。

在这里插入图片描述

而这个时候,进程就不仅仅是一个PCB了,而是多个PCB + 当前进程的资源 = 进程。而每一个PCB都是一个执行流,无论是线程还是进程,CPU都不关心。因为CPU只负责调度PCB。而通过一定的技术手段,可以将进程的"资源"以一定的方式分配给不同的task_struct。

所以可以得出结论:

进程是承担操作系统分配资源的基本实体。

线程是在进程的内部执行。因为它们共享同一块进程地址空间以及其他资源。

线程是CPU调度的基本单元

重新认识进程

在之前的认知中,我们都认为一个进程就是一个PCB + 程序的代码和数据。 但是现在我们要重新认识进程了。当进程内部只有一个执行流的时候, 进程 = PCB + 程序的代码和数据。 当进程内部有多个执行流的时候 ,那么 进程 = 多个PCB + 程序的代码和数据。

在CPU的视角中,CPU其实根本不关心当前调用的是进程还是线程,因为它只认PCB,也就是task_struct。所以在linux系统下, PCB <= 其他OS内的PCB。因为当Linux下的进程包含多个执行流的时候,那么多个PCB其实共享了大部分资源,那么此时的PCB就会小于其他OS内的PCB。因为其他的OS,进程和线程都有属于各自的数据结构。

在Linux下,Linux是用进程来模拟线程的!

这也就意味着Linux并不能直接给我们提供线程相关的接口,只能提供轻量级进程接口!不过好在有一位Linux系统工程师在用户层实现了一套多线程方案,以库的方式提供给了用户进行使用,那就是 pthread线程库,也叫原生线程库。

创建线程

在初步了解线程之后,那么我们可以来创建一个线程,见见线程是什么样子的。

我们先认识一下创建线程的函数。

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                   void *(*start_routine) (void *), void *arg);
第一个参数为线程的tid
第二个参数为线程的属性
第三个参数是一个函数指针,为线程的执行函数
第四个参数为执行函数的参数

测试代码:

#include<iostream> 
#include<pthread.h> 
#include<unistd.h> 

void* ThreadRun(void* name)
{
  while(1)
  {
    std::cout << "this is " << (char*)name << ", pid = " << getpid() << std::endl;
    sleep(1);
  }
}
int main()
{
  pthread_t tids[5]; 
  char name[64];
  for(int i = 0 ; i < 5 ; i++)
  {
    snprintf(name,sizeof name,"%s:%d","Thread ",i);
    pthread_create(tids+i,nullptr,ThreadRun,(void*)name);
    sleep(1);
  }
  while(1)
  {
    std::cout << "this is main thread , pid = " << getpid() << std::endl;
    sleep(3);
  }
}

记得在编译的时候加上一个-lpthread选项,否则无法编译通过,因为 -lphtread原生线程库并不属于C/C++库。

在这里插入图片描述

然后运行后我们发现。5个线程+一个主线程,它们打印出来的进程pid都是一样的。

在这里插入图片描述

然后我们再用ps ajx | head -1 && ps ajx | grep “你的可执行程序名称” 来查看当前运行的进程

在这里插入图片描述

我们发现只有一个进程,这是因为线程是进程内部执行的!所以我们无法看到线程,如果想看线程,我们可以用ps -aL | head -1 && ps -aL | grep "要查看的进程名称" 即可查看当前进程下的线程。

在这里插入图片描述

我们可以看到这个进程中有6个线程,一个主线程。剩下的5个创建的线程。 我们可以发现它们的PID都是一样的。但是LWP是不一样的! 所以,CPU调度看的是LWP还是PID 呢? 答案肯定是LWP,因为线程是CPU调度的基本单元。如果是根据PID进行调度,那么这么多线程的PID都一样,就会产生歧义。所以CPU调度实际是根据LWP字段调度的。

验证线程之间共享地址空间

很简单,我们只需要创建一个全集变量,并在主线程对该变量进行修改,然后让所有线程打印该变量。其他线程的值也发生了改变,那就说明线程之间共享了地址空间。

#include<iostream> 
#include<pthread.h> 
#include<unistd.h> 


int x = 0;

void* ThreadRun(void* name)
{
  while(1)
  {
    std::cout << "this is " << (char*)name << ", pid = " << getpid() << "  x = " << x  << std::endl;
    sleep(1);
  }
}

int main()
{
  pthread_t tid; 
  pthread_create(&tid,nullptr,ThreadRun,(void*)"new thread");
  while(1)
  {
    x++;
    std::cout << "this is main thread , pid = " << getpid() <<"  x = " << x << std::endl;
    sleep(1);
  }
}

运行结果:

在这里插入图片描述

我们发现,全局变量x被所有线程所共享。

线程中独立的资源

线程共享进程数据,但也拥有自己的一部分数据,比如:

  • 线程id
  • 一组寄存器(相当于上下文)
  • 栈(每个线程有独立的栈结构,让线程与线程之间独立)
  • errno
  • 信号屏蔽字
  • 调度优先级

为什么线程切换的成本更低?

1.因为进程地址空间和页表不需要切换

但是地址空间和页表切换并没有太大的消耗。线程切换成本更低的本质原因是因为CPU内部有L1~L3 cache。

我们都知道,CPU处理指令是一条一条处理的。但如果每次CPU都去内存读一条指令,那么速度是非常非常慢的。所以CPU内部有个缓冲区。会先把内存中的指令放进CPU内部缓冲区。也就是预读代码,这样CPU就不用频繁的去内存中读取指令。而是直接在内部缓冲区里读,这样子速度是非常快的。而线程切换,cache不会失效。但如果是进程切换,那么cache就会立马失效,只能重新缓冲。所以这才是线程切换更快的本质原因,因为线程切换,CPU内部的缓冲区不用重新缓存。

电影票购票小程序搭建(源码部署) 答:为用户提供便捷的购票方式,包括授权登录、个性化推荐、在线选座、订单管理等功能,同时在界面设计上注重用户友好性,简化用户的购票流程。答:通过展示电影院的优惠活动和票价信息,同时提供电影推荐功能,根据用户的历史购票记录和电影评分推荐个性化的电影列表,吸引用户购票。编写页面逻辑代码:使用JavaScript编写小程序页面的逻辑代码,实现电影列表的获取、电影详情的展示、座位选择的逻辑等。设计小程序界面:使用WXML和WXSS编写小程序的界面代码,实现电影列表的展示、电影详情的样式、座位选择页面的布局等。 阅读详情

相关推荐

OpenFoam实用技巧——starccm网格高效转换openfoam格式全解析

本文详细解析了如何利用OpenFOAM官方工具`ccm26toFoam`,将STAR-CCM+生成的高质量网格高效、稳定地转换为OpenFOAM格式。内容涵盖从STAR-CCM+正确导出网格、执行转换命令、解读转换日志,到转换后关键的边界条件修复与网格质量检查等全流程,旨在帮助用户规避常见错误,实现无缝工作流衔接。

weixin_28309571的博客 457

【Linux】线程概念篇

文章目录1、什么是线程1.1线程和进程的关系1.2分析曾经写的代码2、内核角度理解线程3、线程的共享与独有3.1共享的内容:3.2 独有的内容4、线程的优缺点 1、什么是线程 线程是一个进程内部的控制序列,也被称为执行流,因为在执行用户编写的代码。 1.1线程和进程的关系 形象举例:工厂与流水线的关系 流水线存在的前提是必须有工厂,一个工厂可以拥有多条流水线~ 将这样的关系映射到进程与线程中,可以得到如下结论: 结论1:线程是依附于进程才能存在的,如果没有进程,线程无法单独存在 结论2:多线程的存在是为了

Suk_god的博客 2266

SAP BASIS运维之三方SSL证书导入

事情的起因是我司SAP使用的SSL证书即将要到期了(上一个的SAP BASIS也辞职了),需要进行证书的更换。如上图所示,我司的证书有效期到2024年4月30日到期,需要提前预防并更换,防止过期后导致接口和访问出现问题。9.在弹出的框中,选择我们在第5个步骤中导出的转换结果存储地址,并选择导出的转换文件,点打开。12.最后一步也是关键的一步,不然就会无法更新证书,再点击左上角的个人安全环境,点另存为。10.在打开后的弹窗中,输入我们在第4个步骤中设置的密码。6.经过以上步骤后,我们获得了最终的证书文件。

fegda的专栏 1885

Linux线程

LWP是轻量级进程,在Linux下进程是资源分配的基本单位,线程是cpu调度的基本单位,而线程使用进程pcb描述实现,操作系统在创建线程时给每个线程都创建一个pcb结构体,并且同一个进程中的所有pcb共用同一个虚拟地址空间,因此相较于传统进程更加的轻量化有了更多执行流之后。

m0_47525528的博客 810

大疆OcuSync系统背后的黑科技:跳频扩频技术如何让你的无人机飞得更稳

本文深入解析了大疆OcuSync系统如何运用跳频扩频技术等先进无线通信方案,显著提升无人机在复杂环境下的飞行稳定性。系统通过跳频扩频与直接序列扩频技术协同工作,结合双频智能切换与多天线MIMO,有效对抗信号干扰与多径效应,确保控制指令与高清图传的可靠、低延迟传输,为用户带来更安心、更流畅的飞行体验。

ol7890123的博客 628

Oracle-如何修复undo坏快

undo出现坏快,导致数据库宕机,无法启动

qqqyyy0422的博客 570

【Linux】线程详解之线程概念

经过前边的学习,我们知道进程拥有一个PCB,在Linux中被称为task_struct,并且有一个进程地址空间,也有一个页表,通过页表指向物理内存,但是从今天开始,对进程的概念可能发生变化,这个我们后边来说,在Linux中,并没有真正的线程,而是使用进程的PCB来模拟线程,也就是说一个线程在创建时,只会去创建一个PCB,而这个PCB也指向主线程的虚拟地址空间,和其他线程一起共享内存的代码和数据。一个线程也被称为一个执行流,这是因为线程是被CPU调度的执行流,而一个进程就是分配系统资源的基本实体。

weixin_61654591的博客 1214

Cesium 实战 19 - 使用 gltf-vscode 查看、预览以及编辑 glTF 和 GLB 模型

Cesium 实战 - 使用 gltf-vscode 查看、预览以及编辑 glTF 和 GLB 模型。

非科班Java出身GISer的博客 6434

Linux线程篇(上)

今天为大家讲一讲Linux中的线程。这部分的知识细节比较多,篇幅可能较长,但我们一步一步将每一个知识点搞清楚,Linux线程对我们来说就小菜一碟啦!

m0_69005269的博客 308

Codex入门10-Goal自主任务(进阶必学:设定目标就不管了,AI自己干活到完成)

/goal 是Codex CLI最强大的进阶功能——设定一个目标,AI就会制定计划、分步执行、自我测试、持续迭代,即使你关掉终端也会继续。本文详解/goal的工作原理、配置启用方法、常用命令(pause/resume/status/clear),以及如何写出高质量的目标描述让AI高效自主完成任务。

yueyeguzhuo的专栏 455

STM32CubeIDE开发环境搭建与GPIO控制实战

嵌入式开发中,MCU开发环境构建是软硬件协同的起点,其核心在于工具链选型、外设抽象层级与调试可靠性。HAL库作为ST官方标准硬件抽象层,通过统一接口屏蔽芯片差异,显著提升工程可移植性;而STM32CubeIDE则以图形化配置+自动生成代码的方式,实现‘配置即代码’的确定性开发范式。该组合在教学验证、原型迭代和中小规模量产中具备高性价比技术价值,广泛应用于智能传感、工业HMI及IoT终端等场景。本文聚焦STM32CubeIDE 1.15.0环境部署、MyST账户与固件包管理、ST-LINK驱动校验,以及基于H

weixin_33531560的博客 81

【Linux】基础:线程的概念

摘要:本文介绍Linux下的线程概念,首先将会线程在系列教材中的定义进行抛出,从常规的操作系统进行理解线程的概念,在具体说明Linux下的进线程的管理与组织方式,以及由于该组织方式的差异,导致的接口和资源的特殊关系。并通过实验进行简单的验证。

qq_66725576的博客 1355

【运动规划算法项目实战】如何使用Pure Pursuit算法进行路径跟踪(附ROS C++代码)

在自动驾驶和机器人导航领域,路径跟踪是一项关键技术,它使车辆或机器人能够按照预定的路径规划进行移动。路径跟踪算法的选择对于系统性能和安全性至关重要。本文将介绍一种常用且有效的路径跟踪算法——Pure Pursuit算法。我们将详细讨论Pure Pursuit算法的原理、实现步骤以及如何在自动驾驶和机器人系统中应用该算法进行路径跟踪。Pure Pursuit是一种用于路径跟踪的控制算法。它通过计算角速度控制机器人从当前位置移到机器人前方的某个预瞄点。假定线速度是恒定的,当然可以随意更改机器人的线速度。

xiewf的博客 1万+

【Linux】Linux线程概念和线程控制

本文介绍了Linux中线程的概念和线程控制--线程创建,终止,等待,分离

qq_67582098的博客 2602

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Linux线程概念

曾经学习的是进程 = 内核数据结构 + 进程的代码和数据但是当有了线程的概念就要改变一下这个说法进程是承担系统资源的基本实体。线程:在进程内部运行,是cpu调度的基本单位。即如果一个多核CPU,不同的核心可以同时执行不同进程的线程。初步理解:在下面,一个一个的task_struct就是一个一个的执行流,地址空间的正文代码也会被分为4部分,让每一个执行流去执行,这一个一个的执行流就是Linux中的线程,这是我们对线程的初步理解,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

Hungry_11的博客 1017

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Linux之线程概念

在语言中,我们知道,用户自己申请的空间是存在于地址空间的堆区上的。可是,堆区是一整块空间,我们每次申请只是申请了其中的一小块,并且我们只是说明了申请空间的大小,拿到的是空间的起始地址。如果,我们多次申请了空间,那么我们怎么知道第一次申请的空间是从堆区哪里到哪里呢,第二次申请的空间是从堆区哪里到哪里呢?于是os就必须对堆区进行更加精细的管理。

zdlynj的博客 2039

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Linux线程:线程的概念及定义

详细介绍了Linux中线程的概念以及其具体的实现方式,介绍了进程和线程的关系,详细剖析了页表的实现方式,线程的创建方式。

2201_75880188的博客 1566

Linux 线程概念

如上是是一个用户级页表,在我们学习进程的时候,我们知道进程=PCB+mm_struct+页表,进程通过用户级页表映射物理内存的方式来找到磁盘或内存中的数据。如果我们再创建一个进程,那么这个进程也有属于自己的PCB、地址空间、页表。

puppy_1mo的博客 754

Linux:线程的概念

本文是对于线程概念的知识总结以上就是我对于线程概念的理解和知识总结。

li209779的博客 1768

【Linux线程】Linux线程编程基础:概念、创建与管理

在当今的软件开发领域,多线程编程已经成为了一种不可或缺的技术。特别是在Linux操作系统环境下,多线程编程更是被广泛地应用于各种高性能、高并发的应用场景中。然而,多线程编程也是一项极具挑战性的任务,它要求开发者具备扎实的编程基础,对并发控制、资源管理等有深入的理解

EterNity_TiMe_的计算机学习之路 3625

【linux】线程概念与控制

详细讲解和实操了linux下线程概念与使用

You build it, you run it 3347

【Linux】多线程1——线程概念与线程控制

初步认识线程的概念,并熟悉线程控制接口

Pursue quality, not quantity. 1613

【Linux多线程】线程的概念

本篇博客将会介绍线程的基本概念,理解线程与进程的区别和联系,以及进程地址空间第四讲

m0_74215144的博客 1239

linux线程,线程控制与线程相关概念

线程概念 线程这个词或多或少大家都听过,今天我们正式的来谈一下线程; 在我一开始的概念中线程就是进程的一部分,一个进程中有很多个线程,这个想法基本是正确的,但细节部分呢我们需要细细讲解一下; 什么是线程 1.线程是进程执行流中的一部分,就是说线程是进程内部的一个控制序列; 2.线程是操作系统调度的基本单位; 3.在linux中没有真正意义上的线程,也就是操作系统中说的tcb(thread ctrl block),但是其他的操作系统是有的不同的操作系统实现不同(如windows就是在pcb下再

m0_75260318的博客 1229
上一篇: 在Linux下安装MySQL
下一篇: 【Linux】线程控制
林   子
博客等级 码龄4年 2671粉丝 64原创
评论 16
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林 子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值