[linux#39][线程] 详解线程的概念

线程:是进程内的一个执行分支。线程的执行粒度比进程要细

什么是线程?

• 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程 是“一个进程内部的控制序列”

• 一切进程至少都有一个执行线程

线程在进程内部运行,本质是在进程地址空间内运行

• 在 Linux 系统中,在 CPU 眼中,看到的 PCB 都要比传统的进程更加轻量化

• 透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给 每个执行流,就形成了线程执行流

1. Linux 中线程该如何理解

地址空间是进程访问的资源窗口,下图当中的绿色部分就是线程

Linux 实现方案:

  1. 在 LInux 中,线程在进程“内部”执行,线程在进程的地址空间内运行(为什么?任何执行流要执行,都要有资源!地址空间是进程的资源窗口)
  2. 线程的执行粒度比进程要细?线程执行进程代码的一部分

CPU 是否知道执行的是进程还是线程?不关心,CPU 只有调度执行流的概念


2. 重新定义线程 和 进程

  • 什么叫做线程?我们认为,线程是操作系统调度的基本单位

V1 时:进程==内核数据结构(PCB)+代码和数据

进阶版图:三块(PCB + 地址空间 +页表)

  • 重新理解进程?内核观点:进程是承担分配系统资源的基本实体

进程掰一块空间给线程,线程是我进程内部的执行流资源!

如何理解我们以前的进程??

操作系统以进程为单位,给我们分享资源,理解为我们当前的进程内部,只有一个执行流~(进程的特殊情况)

进程中还存在对 线程先描述在组织 的队列,进程中套线程,太复杂啦(例如某 windows)

Linux 设计者直接让线程复用进程数据结构和管理算法(多的不调度就行), 维护成本大大降低,非常卓越!

struct task_struct--模拟线程,Linux 没有真正意义上的线程,是指没有为它创建真正的 pcb, 而是用“进程的内核数据结构”模拟的线程,进程是那三块,最左边的都叫执行流

CPU 中

线程<= 执行流<=进程 Linux 中的执行流,轻量级进程

例如:家庭等同于进程,每一个成员的任务叫做线程


3. 重谈地址空间--第四讲

深入理解页表

虚拟地址是如何转化为物理地址的?以 32 位虚拟地址为例

虚拟地址是多少位的?32 位,将地址进行了拆分

  • 32=10+10+12 页表是拆开分级作用
  • 虚拟地址,查一级,查二级,找到页框

  • 二级页表大部分情况的使用是不全的,用不完的大富翁~
  • 任何一个进程都必须要有页目录,二级页表可以残缺

⭕如果MMU发现请求的虚拟页面不在物理内存中,则触发缺页中断(页面加载到内存)。操作系统内核响应这个中断,将所需的页面从磁盘或其他存储设备加载到物理内存中,并更新相应的页面表条目。

  • 例如:起始地址 +虚拟地址的最后 12 位(即页框中的偏移量)=物理地址
  • 任何一个类型取地址,都只有一个地址,多字节就取开辟空间的第一个字节的地址

虽然努力轻量化了进程,但创建一个进程任然是一个很”重“的工作

寻址:起始地址+类型 =起始地址+偏移量(X86 的特点)

CR2:记录引起缺页中断或者异常的地址

如何理解资源分配给每个执行流?

线程目前分配资源,本质就是分配地址空间范围

怎么让每个线程执行不同的代码?代码有地址,代码的地址是虚拟地址

4.Linux 线程周边概念

线程 VS 进程 切换

线程比进程要更轻量化为什么?(整个生命周期)

  1. 创建和释放更加轻量化(生死)
  2. 切换更加轻量化(运行),对应的页表,地址空间都不需要切换

调度线程那还要调度进程吗?

线程的执行本质上就是进程在执行,线程是进程的一个分支,线程在执行,线程内的切换不需要重新 cache 数据

线程完成之后要实现进程的切换,就需要 cache 缓存数据的切换

  • 对于时间片在处理。主线程记录

线程的优点

• 创建一个新线程的代价要比创建一个新进程小得多

• 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多

• 线程占用的资源要比进程少很多

• 能充分利用多处理器的可并行数量

• 在等待慢速 I/O 操作结束的同时,程序可执行其他的计算任务

• 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现

• I/O 密集型应用,为了提高性能,将 I/O 操作重叠。线程可以同时等待不同的 I/O 操作。

线程的缺点

• 性能损失

  • ○ 一个很少被外部事件阻塞的计算密集型线程往往无法与其它线程共享同一 个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大 的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的 资源不变。

• 健壮性降低

  • ○ 编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配 上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大 的,换句话说线程之间是缺乏保护的。

缺乏访问控制

  • ○ 进程是访问控制的基本粒度,在一个线程中调用某些 OS 函数会对整个进 程造成影响。

• 编程难度提高

  • ○ 编写与调试一个多线程程序比单线程程序困难得多

线程异常

单个线程如果出现除零,野指针问题导致线程崩溃,进程也会随着崩溃

• 线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机 制,终止进程,进程终止,该进程内的所有线程也就随即退出

线程用途

• 合理的使用多线程,能提高 CPU 密集型程序的执行效率

• 合理的使用多线程,能提高 IO 密集型程序的用户体验(例如视频可以边下边看)


2. Linux 进程 VS 线程

进程和线程

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

• 线程是调度的基本单位

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

  • ○ 线程 ID
  • 一组寄存器 (独立的上下文)
  • 栈 (执行流不会错乱)
  • ○ errno
  • ○ 信号屏蔽字
  • ○ 调度优先级

线程上下文和栈确保了独立性

进程的多个线程共享

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

• 文件描述符表

• 每种信号的处理方式(SIG_ IGN、SIG_ DFL 或者自定义的信号处理函数)

• 当前工作目录

• 用户 id 和组 id

小测试

#include <iostream>
#include <pthread.h>
#include <unistd.h>void *threadRun(void* args)
{while(1){std::cout << "new thread: " << getpid() << std::endl;sleep(1);}return nullptr;
}int main()
{pthread_t tid;pthread_create(&tid, nullptr, threadRun, nullptr);while(1){std::cout << "main thread: " << getpid() << std::endl;sleep(1);}
}

打印分析:

  • 同一 pid
  • 两个函数同时进行

本篇文章主要讲解了理论,下篇文章将进行实操~

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

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

相关文章

BF算法,KMP算法

前言&#xff1a;今天我们来学习两种算法&#xff0c;BF算法和KMP算法。相信会让许多小伙伴们打开新世界的大门。 1 BF算法 实践是检验真理的唯一标准。举一个例子说明BF算法。现在我们要在一个主串中找子串的位置。那我们该如何解决这个问题呢&#xff1f;最简单的办法自然是…

Repeat方法:取模运算教材与Unity控制台输出数值不同的原因

学习该知识点的参考教材&#xff1a;Unity API解析/陈宏泉编著.——北京&#xff1a;人民邮电出版社&#xff0c;2014.9 编辑脚本的环境&#xff1a;Visual Studio 2022 在学习该本教材的第五章Mathf类的内容&#xff0c;通过跟随教材上的代码了解不同UnityAPI的具体用法时&a…

【机器学习】线性回归与逻辑回归的极致解析:从数学理论到实战案例

文章目录 1. 引言Python 代码示例 2. 线性回归2.1 线性回归的基本概念线性回归的定义数学表达式及模型假设 2.2 线性回归的工作原理最小二乘法&#xff08;Ordinary Least Squares, OLS&#xff09;梯度下降法在线性回归中的应用多元线性回归与一元线性回归的区别与联系 2.3 线…

什么是AR、VR、MR、XR?

时代背景 近年来随着计算机图形学、显示技术等的发展&#xff0c;视觉虚拟化技术得到了广泛的发展&#xff0c;并且越来越普及化&#xff0c;慢慢的也走入人们的视野。目前市场上视觉虚拟化技术的主流分为这几种 VR、AR、MR、XR。这几项技术并不是最近才出现的&#xff0c;VR的…

机器学习笔记 第十二章计算学习理论

12.1 基础知识 计算学习理论就是关于机器学习的理论基础&#xff0c;其作用就是分析学习任务的困难实质&#xff0c;通过分析结果来知道算法设计&#xff0c;并为学习算法提供理论保证。 给定样例集&#xff0c;&#xff0c;假设为二分类问题&#xff0c;一般。假定中的所有样…

GoMail发送邮件的性能优化策略有哪些方法?

GoMail发送邮件如何配置服务器&#xff1f;GoMail发信功能如何&#xff1f; GoMail是一款广受欢迎的Go语言邮件发送库&#xff0c;具备高效、易用等优点&#xff0c;但在高并发场景下&#xff0c;GoMail发送邮件的性能优化显得尤为重要。AokSend将探讨几种有效的GoMail发送邮件…

PDF Shaper Ultimate v14.4 中文授权版

如今对PDF处理的软件很多都是只是单一的功能。PDF Shaper给你完全不同的体验&#xff0c;因为PDF Shaper是一款PDF工具集合的软件。有了PDF Shaper&#xff0c;你以后再也不用下载其他处理PDF的软件了。PDF Shaper的功能有&#xff1a;合并&#xff0c;分割&#xff0c;加密和解…

贪吃蛇(C语言详解)

贪吃蛇游戏运行画面-CSDN直播 目录 贪吃蛇游戏运行画面-CSDN直播 1. 实验目标 2. Win32 API介绍 2.1 Win32 API 2.2 控制台程序&#xff08;Console&#xff09; 2.3 控制台屏幕上的坐标COORD 2.4 GetStdHandle 2.5 GetConsoleCursorlnfo 2.5.1 CONSOLE_CURSOR_INFO …

ant design pro access.ts 是如何控制多角色的权限的

ant design pro 如何去保存颜色ant design pro v6 如何做好角色管理ant design 的 tree 如何作为角色中的权限选择之一ant design 的 tree 如何作为角色中的权限选择之二 看上面的图片&#xff0c;在前端中如何控制这些权限&#xff0c;比如控制按钮的显示&#xff0c;还有菜单…

【Linux操作系统】进程控制

目录 一、进程创建1.1 认识fork1.2 写时拷贝 二、进程终止2.1 进程退出2.2 函数退出2.3 exit 三、进程等待四、程序替换 一、进程创建 1.1 认识fork fork函数是系统调用接口&#xff0c;用来创建子进程的 根据进程的pid&#xff0c;可以看出父进程fork后分为父进程和子进程…

找到你的任务管理伙伴:待办事项软件终极指南

国内外主流的10款待办事项管理软件对比&#xff1a;PingCode、WorktileTodoist、TickTick、Teambition、 Microsoft To Do、. Asana、Tower、番茄ToDo、飞书。 在面对日益复杂的工作和个人任务时&#xff0c;找到一款能够有效帮助你管理日常待办事项的软件&#xff0c;变得越来…

[RCTF2015]EasySQL1

打开题目 点进去看看 注册个admin账户&#xff0c;登陆进去 一个个点开看&#xff0c;没发现flag 我们也可以由此得出结论&#xff0c;页面存在二次注入的漏洞&#xff0c;并可以大胆猜测修改密码的源代码 resoponse为invalid string的关键字是被过滤的关键字&#xff0c;Le…

blender内置树木的UV

之前听说用这个内置插件可以创建树木 我这边的默认配置出来的树木长这样&#xff0c;不得不想一下&#xff0c;他的uv怎么展&#xff0c;看起来好多树 我尝试看了一眼默认的UV 结果如下 好像每个树枝都已经是平铺的样子了&#xff0c;那么如果需要改的话&#xff0c;就根据…

大模型预训练与微调之间的关系

1. 引言 大语言模型的兴起与训练范式 在过去的十年中&#xff0c;随着计算能力和数据规模的显著提升&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;在自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;领域掀起了一场革命…

基于Python的火车票售票系统/基于django的火车购票系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

stripe Element 如何使用

这里要准备好几个东西&#xff1a; 一个支付成功过后的回调 还有一个下单的接口 一旦进入这个下单界面&#xff0c;就要去调下单的接口的&#xff0c;用 post, 这个 接口你自己写&#xff0c;可以写在后端中&#xff0c;也可以放到 nextjs 的 api 中。 首先说的是这个下单…

算法【Java】—— 双指针算法

双指针算法 常见的双指针有对撞指针&#xff0c;快慢指针以及前后指针&#xff08;这个前后指针是指两个指针都是从从一个方向出发&#xff0c;去往另一个方法&#xff0c;也可以认为是小学学习过的两车并行&#xff0c;我也会叫做同向指针&#xff09;&#xff0c;在前后指针…

vscode中使用官方推荐的编程字体Cascadia Code字体

字体样式 > 和 有特殊效果 很多字体都支持使用连字&#xff0c;Cascadia Code 、Jetbrains Mono 、Fira Code 等 安装Cascadia Code 下载完成后解压安装 选中右键安装&#xff0c;static文件里也一样安装 VS Code 中配置设置字体和连字设置 Cascadia Code, Consolas, Couri…

计算机的错误计算(六十七)

摘要 计算机的错误计算&#xff08;五十六&#xff09;与&#xff08;六十六&#xff09;分别探讨了大数与 附近数的正切函数值的错误计算。本节讨论第三种类型数值&#xff1a; 附近数 的正切函数的计算精度问题。 例1. 已知 计算 先用 Go语言计算&#xff1a; packag…

STL介绍以及string类

什么是STL 是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 STL的六大组件 为什么要学习string类 C语言中的字符串 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&am…