从0开始linux(38)——线程(1)线程概念
欢迎来到博主专栏:从0开始linux
博主ID:代码小豪
文章目录
- 进程与线程
- 线程概念
- 线程的优点
- 线程的独立数据
进程与线程
如果要理解线程,那么进程将会时绕不开的点。首先我们回顾一下我们之前在进程章节当中是如何描述进程的?
进程=内核数据结构+代码和数据
代码和数据很好理解,我们在c/c++文件当中写的代码和数据,经过编译后形成的二进制可执行程序中,数据和指令都已二进制的形式保存在文件中。而内核数据结构指的是PCB(task_struct),mm_struct,vm_area_struct(进程地址空间),还有页表等等。这些存在于内核当中,描述与管理进程的相关数据结构。
那么线程是什么呢?
这里博主先从其中一个概念开始展开:线程是进程中的一个执行流,是进程的执行分支。
那么问题来了,什么是执行流呢?
我们可以将流看做是进程中连续的cpu指令,cpu在执行这些指令流,就叫做执行流。而根据进程地址空间,我们的cpu执行的指令、数据的地址,都是保存在进程地址空间当中的,而线程相当于是将这个进程地址空间的一部分切割开来,作为自己的地址空间,让cpu从中处理。那么此时进程就分为了两个执行流,继续执行主程序的,叫做主线程,而执行分支程序的,就是分支线程。
多说无益,我们尝试创建一个线程,创建线程用到的是C语言posix库中的函数pthread_create
,关于这posix库是什么,我们在下一篇章节再说,pthread_create的函数原型如下:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
这些参数博主先不多介绍,首先start_routine是一个函数指针,即分支线程开始的函数地址(我们可以看成是线程的main函数)。pthread_t是线程号,线程号我们后面再说。我们只需要传入一个pthread_t的参数的地址即可。
那么程序如下:
void* Thread1Run(void* addr)//分支线程的入口函数
{while(true){std::cout<<"hello 我是线程1"<<std::endl;sleep(1);}
}int main()
{pthread_t tid;//创建分支线程pthread_create(&tid,nullptr,Thread1Run,(void*)"thread-1");while(true){std::cout<<"hello 我是主线程"<<std::endl;sleep(1);}return 0;
}
这段程序的逻辑如下:当进程运行时,此时内部没有分支线程,当执行pthread_create后,创建出一个分支线程。该线程执行Thread1Run函数的逻辑。此时进程1内部就出现了两个执行流,主执行流继续执行主函数的代码,而分支线程执行Thread1Run的代码。
运行结果如下:
从这里可以看出,主线程和分支线程是并行的,如果不是并行的,那么主线程压根不会执行pthread_create中的代码。
线程概念
如果线程可以并行,那么一定是需要linux系统对线程进行调度的,就像进程调度那样。那么既然linux要对线程管理起来,linux是如何管理线程的呢?老生常谈,linux管理进程,是通过创建内核数据结构,描述进程,接着通过内核数据结构来进行管理,我们将这个操作称为:先描述,再组织
。
那么线程又要如何描述呢?我们先来思考这么一个问题:我们需要线程有什么?首先,线程要有描述符,这样操作系统才能通过描述符找到要操作的线程;接着,线程要有执行的代码和数据,因此要有自己的地址空间;线程也可以通信、因此还要有文件描述符表fd_array。线程还要能接收到信号,因此要有pending表、block表、handler表。咦,这么看下来线程的内核数据结构好像和进程的内核数据结构一模一样啊?
没错,线程和进程用的内核数据都是一样的,即task_struct!!!!
这么一搞、我们就要对一个问题进行思考了。线程是什么?进程又是什么?
首先博主为进程和线程先下一个定义:线程是操作系统调度的最小单位、进程是承载分配资源的基本实体。
在我们上一个例子中已经看到,cpu会在线程之间进行切换调度,其原理和进程之间的切换调度类似。那么如何理解进程时承载分配资源的基本实体呢?首先我们来思考,一个进程需要什么资源?
首先进程要有地址空间吧,代码、数据、堆区、栈区,这些都是实打实存在于内存当中的,第二个,进程会打开文件吧,这些文件都也是要加载到内存当中的。这些就叫做资源。
那么线程有没有这些呢?答案是有!但是为什么说进程承载资源,而不是线程承载资源呢?这是因为,由线程申请的资源,都是放到进程名下的!如何理解这句话呢?我们在前面不是说了吗?将进程空间的一部分代码、数据分割给分支线程,线程就创建出来了,那么我们逆推一下:进程=主线程+分支线程
!
我们之前所见过的进程,是不是没有线程呢?非也,而是这些进程当中只有一个主线程,因此,我们在前面所说的进程调度,本质上也是线程调度,只是这个线程只存在一个而已。那么现在我们知道了,线程申请的一切资源都是放在进程名下的,这也意味着,线程之间使用的资源都是共享的即,同一进程下的线程使用的地址空间是相同的,使用的文件描述表也是相同的!!那么理解了这个,对于线程和进程的关系就很明了了。
我们可以以现实举个例子,比如我们从寝室走到教室,那么我们这个人就是一个进程,执行的任务就是到达教室,而我们的左脚、右脚、左腿、右腿则是进程下的线程,各自执行自己的程序,但是目的都是为了完成一个进程的任务。这些线程所使用的资源是共享的,即人体身上的能量,你总不能说你的左腿运动和右腿运动消耗的能量不属于同一个人吧?
在linux中,线程和进程其实并没有太大的区别,因此在linux当中,线程被称为轻量级进程,又称LWP(light weight process)。所谓的cpu对进程的调度,无论是进程还是轻量级进程,它们的权重没有任何区别。而且我们还能查到轻量级进程的属性,通过指令:ps -aL
可以查看,但是考虑到让轻量级进程与进程之间有所区别,因此后面还是叫线程和进程。
线程的优点
- 创建⼀个新线程的代价要比创建⼀个新进程小得多
我们fork出一个新进程,由于进程之前具有独立性,因此新进程要有自己的地址空间,要有自己的内核数据结构。而线程之间都是共享进程的资源的,因此创建一个新线程,只需要创建一个新的内核数据结构来描述轻量级进程就行。
- 线程之间切换比进程之间切换的速度快
为什么呢?因为进程之间具有独立性,不同的进程,其代码数据不同,使用的进程地址空间也不同,页表不同,打开的文件也不同,这些东西都是要实打实加载到内存的。要加载,就是要让磁盘与内存之间做慢速I/O,因此速度变慢。
而且在CPU当中也有体现,不同的进程,其上下文也是不一样的,并不是说线程的上下文就相同,而是进程的上下文更复杂。因为在CPU当中存在两个东西,一个叫做TLB,一个叫做cache。这两个硬件都是用来做缓存的。TLB负责的是页表缓存,不同的进程拥有不同的页表,因此TLB肯定不能复用,因此切换进程的时候,TLB要重新作缓存,而线程之间由于使用的是相同的进程空间,因此在切换线程的时候,TLB就不用更新。
而cache我们还没认识过,现在我们就来讲讲。当一个进程运行时,我们要将进程中的数据和代码加载到内存当中,因为cpu与内存之间做交互的速度远快于cpu与磁盘做交互,但是cpu和内存之间的交互是最快的吗?当然不是,而是cpu与cache之间的交互才是最快的,因此,当cpu执行一个代码时,会将代码附近的所有数据都加载到cache当中,我们可以输入指令cat /proc/cpuinfo
可以查看到cpu信息,其中就包括cache的大小
我们可以看到,一个cached可以缓存40M左右的数据,因此当cpu执行一个指令时,首先会查该指令的地址是否在cache当中,如果没有,再去内存当中找,顺便在将cache当中缓存的数据更新成,新执行的指令附近40M的数据。
那么为什么说cache能提高效率呢?这其实是一个概率性的问题,因为当计算机执行完一个代码后,其第二条代码,大概率在该代码的下一条。因此将代码附近的数据加载到cache中,可以大大减少cpu访问内存的次数。但是如果你能写出让cpu访问的代码不停跳转的程序,那么这个cache就相当于是负优化了,因为cache不仅没有让你减少cpu访问内存的频率,还要不停地加载内存中的数据到cache当中,这个时间只会更长。因此,这个基于cache缓存以提高cpu效率的方法,我们称为局部性原理。因此我们所写的代码和数据,要尽可能的减少不必要的跳转,以提升程序的运行速度。
那么我们回到进程,由于进程使用的内存空间是不同的,因此cache缓存的数据,是基本不可能让两个进程一起用的。因此切换进程的时候,cache当中的数据也要更新一下,这不也导致了cpu效率变慢了吗?而线程之间由于使用的资源都是在一个进程当中的,因此cache缓存大概率不用更新,因此切换线程所需要的时间开销也会变小。
但是线程并非完全没有缺点。
• 性能损失
◦ ⼀个很少被外部事件阻塞的计算密集型线程往往⽆法与其它线程共享同⼀个处理器。如果计
算密集型线程的数量⽐可⽤的处理器多,那么可能会有较⼤的性能损失,这⾥的性能损失指
的是增加了额外的同步和调度开销,⽽可⽤的资源不变。
• 健壮性降低
◦ 编写多线程需要更全⾯更深⼊的考虑,在⼀个多线程程序⾥,因时间分配上的细微偏差或者
因共享了不该共享的变量⽽造成不良影响的可能性是很⼤的,换句话说线程之间是缺乏保护
的。
• 缺乏访问控制
◦ 进程是访问控制的基本粒度,在⼀个线程中调⽤某些OS函数会对整个进程造成影响。
这里我们做简单的了解,博主在后面的章节当中还会继续说明
线程的独立数据
进程当中有哪些资源是线程之间共享的?而线程之间又有什么资源是不互通的?
共享的资源有:
- 进程地址空间
- 信号:所有线程对于信号的处理方式,都是一致的
- 异常:如果一个线程出现了异常,那么整个进程都会崩溃
其实这也很好理解,比如广西周某偷了电瓶,总不能说是我的手偷的,而不是总体偷的,进而免除惩罚吧?由于线程作为进程的一部分,所有的线程的目的,都是为了让进程完成某个任务,因此如果一个线程出现了异常,那么进程的任务还能完成吗?因此将进程中所有线程一起处理,才是正确的处理方法。 - 文件描述符
不共享的资源有:
- LWP:线程ID
- 信号屏蔽字:即block表,虽然线程之间对待信号的处理方法一致,但是线程可以选择屏蔽掉啊
- 线程的上下文数据:虽然使用的资源是相同的,但是它们具体执行的指令可不同,因此cpu在切换线程时,它们的上下文数据也要进行切换(只是切换线程的复杂度远低于切换进程。)
- 栈
- errno
- 调度优先级
相关文章:
从0开始linux(38)——线程(1)线程概念
欢迎来到博主专栏:从0开始linux 博主ID:代码小豪 文章目录 进程与线程线程概念线程的优点线程的独立数据 进程与线程 如果要理解线程,那么进程将会时绕不开的点。首先我们回顾一下我们之前在进程章节当中是如何描述进程的? 进程&…...
Ubuntu源码安装gitlab13.7集群多前端《二》
Ubuntu源码安装gitlab13.7《一》 gitaly需要调整的服务 redis socket->ipbind ....* # 0.0.0.0pg vim /etc/postgresql/14/main/pg_hba.confhost all all ..../32 md5gitaly vim /home/git/gitaly/config.tomlbin_dir "/home/gi…...
身份证OCR 识别 API 接口的发展前景
随着信息时代的到来,大量的身份证数据需要进行整理、存储和管理,OCR 识别技术可以将身份证信息转化为结构化的电子文本,方便后续的数据管理和分析,提高工作效率。 未来,随着人工智能和深度学习等技术的不断发展&#…...
Spring boot之BeanDefinition介绍
在spring框架中IOC容器进行bean的创建和管理。Bean的创建是一个比较复杂的过程,它并不像我们创建对象一样只是直接new一下就行,虽然有些bean确实就是New一下。但在Spring中可以通过一些途径对bean进行增强扩展。在这个过程中,BeanDefinition作…...
30分钟学会正则表达式
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。 作用 匹配 查看一个字符串是否符合正则表达式的语法 搜索 正…...
Python 自动化办公的 10 大脚本
大家好,我是你们的 Python 讲师!今天我们将讨论 10 个实用的 Python 自动化办公脚本。这些脚本可以帮助你简化日常工作,提高效率。无论是处理 Excel 文件、发送邮件,还是自动化网页操作,Python 都能派上用场。 1. 批量…...
Python蒙特卡罗MCMC:优化Metropolis-Hastings采样策略Fisher矩阵计算参数推断应用—模拟与真实数据...
全文链接:https://tecdat.cn/?p38397 本文介绍了其在过去几年中的最新开发成果,特别阐述了两种有助于提升 Metropolis - Hastings 采样性能的新要素:跳跃因子的自适应算法以及逆 Fisher 矩阵的计算,该逆 Fisher 矩阵可用作提议密…...
成绩排序
成绩排序 C语言代码C 代码Java代码Python代码 💐The Begin💐点点关注,收藏不迷路💐 给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前。 输入 第一行为…...
MySQL底层概述—7.优化原则及慢查询
大纲 1.Explain概述 2.Explain详解 3.索引优化数据准备 4.索引优化原则详解 5.慢查询设置与测试 6.慢查询SQL优化思路 1.Explain概述 使用Explain关键字可以模拟查询优化器来执行SQL查询语句,从而知道MySQL是如何处理SQL语句的,从而分析出查询语句…...
R““有什么作用在C++中,举例说明
在C中,R""(双引号前加R)表示一个原始字符串字面量(Raw String Literal),其主要作用是让字符串中的反斜杠\和其他特殊字符不被当作转义字符处理,而是保留其原始字面意义。这在处理包含…...
linux中top 命令返回数据解释
当您在 Linux 终端中运行 top 命令时,它会显示一个动态更新的系统状态视图,其中包括许多有关系统性能的数据。下面是对 top 命令返回数据的详细解释: 标题栏 top - 22:46:12 up 2 days, 3:14, 1 user, load average: 0.05, 0.07, 0.09 22:46:12:当前时间。up 2 days, 3:14…...
深入理解二叉树及其变体:平衡二叉树、红黑树、B-树和B+树
一、二叉树简介 二叉树是一种非常常见的数据结构,它具有以下特点: 每个节点最多有两个子节点,分别称为左子节点和右子节点。每个节点的左子树和右子树都是二叉树。 二叉树的常见操作包括:创建、插入、删除、查找、遍历等。下面…...
C++ 编程技巧之StrongType(1)
最近看到一个NamedType的开源库,被里面的Strong Type这个概念和里面的模版实现给秀了一脸,特此总结学习一下 GitHub - joboccara/NamedType: Implementation of strong types in C C本身是一种强类型语言,类型包括int、double等这些build i…...
芯片测试-smith圆图
smith圆图 💢smith圆图的故事💢💢smith圆图中的各部分来历💢💢公式推导💢💢等电阻圆特点💢💢等电抗圆💢💢等电抗圆特点💢 Ὂ…...
HTML技术深度解析:构建现代网页的基石
引言 HTML(HyperText Markup Language,超文本标记语言)是构建网页和网上应用的标准标记语言。随着互联网技术的飞速发展,HTML已经成为前端开发中不可或缺的核心技术之一。本文将深入探讨HTML的基本概念、核心元素、最新发展以及在…...
Leecode刷题C语言之判断是否可以赢得数字游戏
执行结果:通过 执行用时和内存消耗如下: bool canAliceWin(int* nums, int numsSize) {int single_digit_sum 0;int double_digit_sum 0;for (int i 0; i < numsSize; i) {if (nums[i] < 10) {single_digit_sum nums[i];} else {double_digit_sum nums[…...
Ubuntu 关机命令
在 Ubuntu 系统中,有几种方法可以关机。以下是常用的关机命令及其说明: 1. 使用 shutdown 命令 shutdown 命令是最常用和最灵活的关机方式。它可以设置定时关机,并且可以发送警告消息给所有登录用户。 立即关机 sudo shutdown now定时关机…...
数据采集中,除了IP池的IP被封,还有哪些常见问题?
在数据采集的过程中,代理IP池的使用无疑为我们打开了一扇通往信息宝库的大门。然而,除了IP被封禁这一常见问题外,还有许多其他问题可能影响数据采集的效果。本文将探讨在数据采集中,除了IP被封之外,还可能遇到的一些常…...
【Anaconda】 创建环境报错:CondaHTTPError: HTTP 000 CONNECTION FAILED for url
问题描述 使用 Anaconda 创建环境时报错: CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/free/noarch/repodata.json.bz2> Elapsed: -An HTTP error occurred when trying to retrieve this URL. HTTP errors are o…...
社交电商破局之“2+1 链动模式 O2O 商城小程序源码”赋能流量困境突围
摘要:本文聚焦于当下商家在流量困境中挣扎的现状,剖析传统电商高流量成本、平台流量获取难等痛点,阐述私域流量池兴起的缘由与价值。重点探究“21 链动模式 O2O 商城小程序源码”如何融入社交电商架构,通过创新机制与线上线下融合…...
【ArcGIS Pro微课1000例】0062:ArcGIS Pro3.3.1中文版安装教程(附安装包下载)
本文讲述ArcGIS Pro3.3.1中文版安装教程(附安装包下载)。 文章目录 一、ArcGIS Pro3.3.1中文版下载二、ArcGIS Pro3.3.1中文版安装一、ArcGIS Pro3.3.1中文版下载 【订阅专栏】,获取完整安装包及专栏配套实验数据。下载后解压,如下图所示: 二、ArcGIS Pro3.3.1中文版安装…...
Linux - web服务器
四、web服务器 1、基础知识 URL:Uniform Resource Locator,统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。 网址格式:<协议>://<主机或主机名&g…...
设计模式-适配器模式-注册器模式
设计模式-适配器模式-注册器模式 适配器模式 如果开发一个搜索中台,需要适配或接入不同的数据源,可能提供的方法参数和平台调用的方法参数不一致,可以使用适配器模式 适配器模式通过封装对象将复杂的转换过程隐藏于幕后。 被封装的对象甚至…...
减速机润滑油更换的最佳周期是多久?
减速机是工业设备中的重要组成部分,润滑油的使用对于其正常运转和寿命具有至关重要的作用。那么,减速机多久更换一次润滑油呢?实际上,减速机润滑油的更换周期受多种因素影响,以下是一些具体的更换周期建议:…...
程序执行堆栈执行模拟
所有的文件都是在硬盘(磁盘)上,调用时先调用javac指令的jdk编译成.class然后被java指令的jre送到内存中,java在内存中有自己的一片区域叫JVM,编译进来的文件首先进入方法区。 staitc的属性就是在进入内存的时候开辟了一…...
《Python基础》之数据加密模块hashlib的用法
目录 一、简介 二、用法 步骤一、导入hashlib库 步骤二、创建哈希对象 步骤三、往哈希对象中传值 1、可以在创建对象的时候传值 2、使用updata传值 步骤四、获取经过哈希对象加密后的值 三、注意事项 1、编码问题 2、安全性 3、多次传值 四、总结 一、简介 hashli…...
安装Fcitx5输入框架和输入法自动部署脚本(来自Mark24)-Ubuntu通用
在Ubuntu22.04上安装rime中文输入法的基本教程 上述文章接近废弃。 使用新逻辑配置基本的Fcitx5的输入法。 安装 第一步,下载相关组件 sudo nala install vim sudo nala install ruby sudo nala install fcitx5-rime第二步,设置语言为Fcitx5 而非 默认…...
【IMF靶场渗透】
文章目录 一、基础信息 二、信息收集 三、flag1 四、flag2 五、flag3 六、flag4 七、flag5 八、flag6 一、基础信息 Kali IP:192.168.20.146 靶机IP:192.168.20.147 二、信息收集 Nmap -sP 192.168.20.0/24 Arp-scan -l nmap -sS -sV -p- -…...
Zookeeper选举算法与提案处理概览
共识算法(Consensus Algorithm) 共识算法即在分布式系统中节点达成共识的算法,提高系统在分布式环境下的容错性。 依据系统对故障组件的容错能力可分为: 崩溃容错协议(Crash Fault Tolerant, CFT) : 无恶意行为,如进程崩溃,只要…...
深入了解 Adam 优化器对显存的需求:以 LLaMA-2 7B 模型为例 (中英双语)
中文版 深入了解 Adam 优化器对显存的额外需求:模型参数与优化器状态的显存开销分析 在深度学习模型的训练过程中,显存是一个关键的资源,尤其在处理大型语言模型或深度神经网络时。训练时的显存需求不仅包括模型参数本身,还涉及…...
广西城乡建设委员会的网站/怎么联系百度客服
原文:https://jingyan.baidu.com/article/5bbb5a1b634cca53eba179ce.html 首先说一下密码必须是6~18位之间的数字,正则表达式为"^[0-9]{6,18}$",其中[0-9]表示必须是数字,{6,18}表示必须在6到18位之间,代码如…...
社区平安建设基层网站/上海seo培训中心
ES安装及head插件安装1.官网下载2.windows下安装3.如果内存小 修改配置文件jvm.options启动参数4.启动 双击elasticsearch.bat5.访问 127.0.0.1:92006.安装可视化界面 以及启动7.解决跨域问题8.再次启动elasticsearch-head-master 访问http://localhost:9100/总结JDK1.8 &#…...
有域名了怎么做网站/百度信息流推广技巧
目录一、RequestMapping1.作用范围:2.属性二、请求参数的绑定三、请求参数乱码问题四、自定义类型转换器1.定义一个转换类实现Converter接口2.在springmvc的配置文件中配置类型转换器3.在springmvc配置文件中引用配置的类型转换五、使用Servlet原生API六、一些常用注…...
深圳网站建设推广平台/黑龙江新闻头条最新消息
数据类型介绍MySQL 数据类型分类整型浮点型字符类型(char与varchar)日期类型枚举与集合具体数据类型见这篇博客MySQL表操作中的约束primary key 主键约束 非空唯一unique key 唯一约束not null 非空约束foreign key 外键约束创建表的的语法CREATE TABLE[IF NOT EXISTS] tbl_nam…...
烟台做外贸网站建设/杭州seo 云优化科技
在网上找的比较好的总结,总结的很详细,转自下面的连接,只用于自己和网友的学习,不用于商业! https://blog.csdn.net/wuqingshan2010/article/details/71056292转载于:https://www.cnblogs.com/andingding-blog/p/10005…...
本地wordpress 外网访问不了/百度收录网址
前言从智能单品到全屋智能,随着消费者对生活品质追求的提升,智能化产品逐渐走入大众家庭,从而推动智能家居市场蓬勃发展。从 2017 年开始,智能家居设备已经应用于日常生活各项任务。2017 年其市场规模约为 4.3 亿美元。据 IDC 预测…...