【Linux】线程概念

       🔥🔥 欢迎来到小林的博客!!
      🛰️博客主页:✈️林 子
      🛰️博客专栏:✈️ 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内部的缓冲区不用重新缓存。

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

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

相关文章

常见加密和解密方法介绍。

介绍常见的加密和解密方法。 加密是利用数学方法将明文转化为密文&#xff0c;从而达到保护数据的目的。 通过加密可保证数据的机密性、完整性、鉴别性。 机密性&#xff1a;通过数据加密实现。只允许特定用户访问和阅读信息。 完整性&#xff1a;通过数字加密、散列、数字签名…

《Vue.js+Spring Boot全栈开发实战》简介

大家好&#xff0c;我是老卫。 恰逢中秋国庆双节&#xff0c;不想出门看人山&#xff0c;惟愿宅家阅书海&#xff01; 今天开箱的这本书是《Vue.jsSpring Boot全栈开发实战》。 外观 从书名故名思议&#xff0c;就是基于Vue.jsSpring Boot来实现企业级应用全栈开发。 该书由…

LabVIEW工业虚拟仪器的标准化实施

LabVIEW工业虚拟仪器的标准化实施 创建计算机化的测试和测量系统&#xff0c;从计算机桌面控制外部测量硬件设备&#xff0c;以及在计算机屏幕上显示的类似仪器的面板上查看来自外部设备的测试或测量数据&#xff0c;所有这些都需要虚拟仪器系统软件。该软件允许用户执行所有这…

Axios post请求出现500错误

笔者在编写前端form表单传后端数据的时候&#xff0c;出现了以下问题 一、问题场景 当我用axios发送post请求的时候&#xff0c;出现了500错误 笔者找了很长时间错误&#xff0c;代码没问题&#xff0c;后端接口也没问题&#xff0c;后来发现问题出在实体类上了 当前端post请…

BGP服务器租用价格表_腾讯云PK阿里云

BGP云服务器像阿里云和腾讯云均是BGP多线网络&#xff0c;速度更快延迟更低&#xff0c;阿里云BGP服务器2核2G3M带宽优惠价格108元一年起&#xff0c;腾讯云BGP服务器2核2G3M带宽95元一年起&#xff0c;阿腾云分享更多云服务器配置如2核4G、4核8G、8核16G等配置价格表如下&…

list(链表)

文章目录 功能迭代器的分类sort函数&#xff08;排序&#xff09;merage&#xff08;归并&#xff09;unique(去重&#xff09;removesplice&#xff08;转移&#xff09; 功能 这里没有“[]"的实现&#xff1b;原因&#xff1a;实现较麻烦&#xff1b;这里使用迭代器来实…

《数据结构、算法与应用C++语言描述》-栈的应用-迷宫老鼠问题

迷宫老鼠 问题描述 迷宫&#xff08;如图 8-9 所示&#xff09;是一个矩形区域&#xff0c;有一个入口和一个出口。迷宫内部包含不能穿越的墙壁或障碍物。这些障碍物沿着行和列放置&#xff0c;与迷宫的边界平行。迷宫的入口在左上角&#xff0c;出口在右下角。 假定用 nxm 的…

正则表达式 Regular Expression学习

该文章内容为以下视频的学习笔记&#xff1a; 10分钟快速掌握正则表达式_哔哩哔哩_bilibili正则表达式在线测试工具&#xff1a;https://regex101.com/, 视频播放量 441829、弹幕量 1076、点赞数 19330、投硬币枚数 13662、收藏人数 26242、转发人数 2768, 视频作者 奇乐编程学…

【iptables 实战】07 iptables NAT实验

在上一节中&#xff0c;我们将两个网段的机器&#xff0c;通过中间机器的网络转发&#xff0c;能达到互通。再来回顾一下这个网络连接的图 上一节我们在防火墙实验中&#xff0c;设置了主机B的的转发规则&#xff0c;我们先清空主机B的转发规则 [rootlocalhost ~]# iptables…

飞桨EasyDL-Mac本地部署离线SDK-Linux集成Python

前言&#xff1a;本文对使用飞桨EasyDL桌面版实现本地部署物体检测做一下说明 一、训练模型 如何使用飞桨EasyDL桌面版这里就不再赘述&#xff0c;直接参照官方文档进行物体检测模型训练。 飞桨EasyDL桌面版-用零代码开发实现物体检测https://ai.baidu.com/ai-doc/EASYDL/Tl2…

基于监督学习的多模态MRI脑肿瘤分割,使用来自超体素的纹理特征(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

国庆作业 day1

C语言基础考题&#xff08;40&#xff09; 选择题 20分每题2分 1、已知字母A的ASCII码为十进制数值65&#xff0c;且S为字符型&#xff0c;则执行语句SA6-3&#xff1b;后S中的值为 ( ) A.D B.68 C.不确定的值 D.C 2、若有定义语句&#xff1a;int a12;&#xff0c;则执…

Linux配置命令

一&#xff1a;HCSA-VM-Linux安装虚拟机后的基础命令 1.代码命令 1.查看本机IP地址&#xff1a; ip addr 或者 ip a [foxbogon ~]$ ip addre [foxbogon ~]$ ip a 1&#xff1a;<Loopback,U,LOWER-UP> 为环回2网卡 2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP&g…

10个与AI相关的技术领域

**10个与AI相关的技术领域** 除了与各个科学领域相关的具体挑战之外&#xff0c;AI在科学领域还存在一些共同的技术挑战。特别是&#xff0c;我们确定了以下四个共同的技术挑战&#xff1a;超出分布的泛化、可解释性、由自监督学习提供支持的基础模型和不确定性量化。尽管这些…

28385-2012 印刷机械 锁线机 学习笔记

声明 本文是学习GB-T 28385-2012 印刷机械 锁线机. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了锁线机的型式、基本参数、要求、试验方法、检验规则、标志、包装、运输与贮存。 本标准适用于用线将书帖装订成书芯的锁线机。 …

K-Means(上):数据分析 | 数据挖掘 | 十大算法之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

计算机毕业设计 基于微信小程序的学习资料销售平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Nginx之动静分离解读

目录 基本概念 基本入门 location匹配顺序 补充&#xff1a;URLRewrite 基本概念 动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来&#xff0c;动静资源做好了拆分以后&#xff0c;我们就可以根据静态资源的特点将其做缓存操作&#x…

计算机组成与结构

目录 一、计算机硬件组成 二、中央处理单元 1、功能 2、CPU的组成 三、校验码 四、体系结构的分类 1、按处理机数量分类 2、Flynn分类 五、指令系统 1、指令 2、寻址方式 3、指令系统 #CISC&#xff08;复杂指令集计算机&#xff09; RISC&#xff08;精简指令集…

JavaSE学习之--抽象类,接口,内部类

&#x1f495;"没有眼泪我们就会迷路&#xff0c;彻底变成石头&#xff0c;我们的心会变成冰凌&#xff0c;吻会变成冰块。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;JavaSE学习之--抽象类&#xff0c;接口&#xff0c;内部类 目录 一.抽象…