当前位置: 首页 > news >正文

深入理解Linux线程(LWP):概念、结构与实现机制(2)

                                               🎬慕斯主页:修仙—别有洞天

                                              ♈️今日夜电波:会いたい—Naomile

                                                                1:12━━━━━━️💟──────── 4:59
                                                                    🔄   ◀️   ⏸   ▶️    ☰  

                                      💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍


目录

再谈地址空间及物理内存

再谈页表

缺页中断

再次理解线程

线程的优缺点

线程的优点

线程的缺点

面试常问


 再谈地址空间及物理内存

        前面我们谈到,一个可执行程序或者文件中无论他的属性还是数据块都是以4kb为单位进行储存在磁盘上的(当然这个4kb这个基本单位是可以修改的!但是,这属于特殊情况,大多数还是基本单位还是4kb),如果我们要执行某可执行程序,需要以4kb为基本单位映射到物理内存当中,再通过页表映射到地址空间上对应的进程进行控制。现在,我们进一步的进行理解:对此,我们将可执行程序中一个形成为4kb的大小称为页帧,而物理内存中也需要像exe中以4kb为基本单位来进行存储,磁盘将exe中的页帧映射到物理内存中,而物理内存对应的映射块称为页框exe将多少个页帧映射到物理内存上,则物理内存就需要有多少个页框进行承装!如果我们要对某个文件进行修改,那么也是按这个基本单位将物理空间上以一个一个的页框为io的基本单位刷新到磁盘上的!如下图所示:

        我们都知道inode是128b的,则一个基本单位4kb可以存储32个inode,如果我们要访问一个文件,我们加载inode时,可能会一次性加载多个inode。

        前面谈到了文件缓冲区的概念,这里进一步阐述,文件缓冲区实际上就是对内存当中属于这个文件的一个个内存页中对应的数据结构以及数据对象进行关联。如下图所示:

        当然,我们的页框的使用情况操作系统也是需要知道的,因此操作系统需要管理全部页框,因此要先描述,在组织。操作系统会维护一个数据结构struct_page,这个数据结构实际上不大,大概只有10几kb。如下:

struct page
{//描述一个page的使用情况 int flag; //用比特位来表示如正在被使用,//是否准备被释放等等使用情况,可以用一个整数+宏来表示。//page的属性}

        当然,我们上面的是一个page的情况,也就是先描述,后续我们可以定义一个大的数组来组织:struct page pages[page总数] 。当然,上述只是简化的情况,实际的数据结构会更复杂!会有内存管理的算法,比如LRU等等。对物理内存的管理,现在就变成了对于数组的增删查改。

        在理解了page的相关知识后,我们再次理解缓冲区的概念,我们的缓冲区真的是直接指向物理内存吗?实际上他是指向了相关的struct page的地址或者数组下标即可。如下:

 

再谈页表

        页表实际上的结构是怎么样的呢?虚拟地址到物理地址的转换实际上是怎么样的呢?CPU中有个组件MMU可以将寄存器中的虚拟地址转换为物理地址虚拟地址到物理地址的转换实际上只是在CPU内部进行的。在此前我们只知道虚拟地址只是有32个比特位。如:1111 1111 1000 0000 1000 0000 0001 0001实际上会将虚拟地址按照10、10、12来划分为三个部分。分别为页目录、页表、偏移量。可以看到对应的大小为1024b、1024b、4kb。页目录是用于查找页表的,他会存储对应页表的地址(因为具体在什么位置操作系统也不知道),然后页表的内容会指向页框的起始地址,也就是说页表内存的是页框!因此,如果我们要将虚拟内存映射到物理内存只需要页目录+页表即可,也就是1024b*1024b大小,也就是2的20次方项地址。而后面的12位是可以看到是刚刚好4kb!那么我们要找到对应的物理内存只需要将页表内的页框地址加上对应的偏移量即可!具体的图示如下:

缺页中断

        通过上面对于页表的理解,我们也理解到了通过页目录以及页表就可找到对应的物理地址。但是,当我们根据局部性原理集中的访问一段区域,后面的页表并没有访问过,那么我们可以不急着创建对应的页表,只有当要使用的时候,我们再去创建!

再次理解线程

        再次理解了虚拟地址到物理地址的转换后,我们在理解一个线程要划分对应的资源时(如:代码和数据),本质上就是在划分页表!

        划分页表的本质:划分地址空间!

        划分地址空间的例子:线程创建的接口会传入一个函数,而这个函数经过汇编之后你会看到很多的虚拟地址,我们在申请对应的空间后会得到对应的虚拟地址,一个函数会有多行代码,也就是说有很多的地址。定义一个变量也会有对应的地址。划分地址空间实际上就是占有了虚拟地址上的一部分地址空间,划分了自己的势力范围!

        变量拓展:我们在定义某个类型的变量的时候互得到一个虚拟地址,但是按照对应的定义他会有几个字节的空间,但是我们取地址又只能得到一个地址。这是因为类型的本质就是偏移量!当我们定义好一个变量时就决定了内存和CPU之间用怎么样的寄存器来存取!

        在进程的视角:虚拟内存本身就是资源!

线程的优缺点

线程的优点

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

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

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

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

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

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

        I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。
        合理的使用多线程,能提高CPU密集型程序的执行效率

        合理的使用多线程,能提高IO密集型程序的用户体验(如生活中我们一边写代码一边下载开发工具,就是多线程运行的一种表现)

 

线程的缺点

性能损失

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

健壮性降低

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

缺乏访问控制

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

编程难度提高

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

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

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

 

面试常问

        线程哪部分资源是私有的?

        一定要答到线程是有独立的硬件上下文的(证明你是有动态切换的概念),每个线程要有自己的栈结构(证明你有动态运行的概念)。

        更加详细:

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

        线程ID、一组寄存器、栈、errno、信号屏蔽字、调度优先级

 


                       感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o! 

                                       

                                                                        给个三连再走嘛~  

相关文章:

深入理解Linux线程(LWP):概念、结构与实现机制(2)

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:会いたい—Naomile 1:12━━━━━━️💟──────── 4:59 🔄 ◀️ ⏸ ▶️ ☰ &a…...

VBS脚本搞定,快速批量提取一堆Excel文件中的数据

1.需求诞生 小王就职于一家国有大型企业,工作业务十分繁忙,在处理企业某业务数据时,需要从上千个Excel文件中提取某一单元格位置的数据,并整理到另一个Excel文件。要说是这样的Excel文件仅有几个或者十几个也还好,手动…...

大数据分析案例-基于SVM支持向量机算法构建手机价格分类预测模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…...

WPF 滑动条样式

效果图&#xff1a; 浅色&#xff1a; 深色&#xff1a; 滑动条部分代码&#xff1a; <Style x:Key"RepeatButtonTransparent" TargetType"{x:Type RepeatButton}"><Setter Property"OverridesDefaultStyle" Value"true"/&g…...

论文设计任务书学习文档|基于Web的个性化简历职位推荐系统的设计与实现

文章目录 论文(设计)题目:基于Web的个性化简历职位推荐系统的设计与实现1、论文(设计)的主要任务及目标2、论文(设计)的主要内容3、论文(设计)的基本要求4、进度安排论文(设计)题目:基于Web的个性化简历职位推荐系统的设计与实现 1、论文(设计)的主要任务及目标…...

Win11系统安装安卓子系统教程

随着Win11系统的不断普及&#xff0c;以及硬件设备的更新换代&#xff0c;我相信很多同学都已经更新并使用到了最新的Win11系统。那么&#xff0c;Win11系统最受期待的功能“Windows Subsystem for Android”&#xff08;简称WSA&#xff09;&#xff0c;即《安卓子系统》。他可…...

Python实现双向链表:从基础到应用

一、引言 双向链表是一种比单向链表更复杂的数据结构&#xff0c;每个节点除了包含数据和指向下一个节点的指针外&#xff0c;还包含一个指向前一个节点的指针。这种结构使得我们可以从链表的任何节点开始&#xff0c;向前或向后遍历链表。 目录 一、引言 二、节点定义 三、…...

c# 读取DataGridView中的数据

/// <summary> /// 读取DataGridView中的数据 /// </summary> /// <param name"dgv">DataGridView对象</param> /// <returns>DataTable对象</returns> private DataTable GetDgvToTab…...

Stable Diffusion中的Clip模型

基础介绍 Stable Diffusion 是一个文本到图像的生成模型&#xff0c;它能够根据用户输入的文本提示&#xff08;prompt&#xff09;生成相应的图像。在这个模型中&#xff0c;CLIP&#xff08;Contrastive Language-Image Pre-training&#xff09;模型扮演了一个关键的角色&a…...

Python批量提取文件夹中图片的名称及路径到指定的.txt文件中

目录 一、代码二、提取效果 一、代码 import os# 定义要保存的文件名 file_name "TestImage/Image_Visible_Gray.txt"# 读取文件夹路径 folder_path "TestImage/Image_Visible_Gray"# 遍历文件夹中的所有文件 with open(file_name, "w") as f…...

微软开源 SBOM 生成工具:sbom-tool下载及使用详解

github地址 GitHub - microsoft/sbom-tool: The SBOM tool is a highly scalable and enterprise ready tool to create SPDX 2.2 compatible SBOMs for any variety of artifacts.The SBOM tool is a highly scalable and enterprise ready tool to create SPDX 2.2 compatib…...

【办公类-18-03】(Python)中班米罗可儿证书批量生成打印(班级、姓名)

作品展示——米罗可儿证书打印幼儿姓名 背景需求 2024年3月1日&#xff0c;中4班孩子一起整理美术操作材料《米罗可儿》的操作本——将每一页纸撕下来&#xff0c;分类摆放、确保纸张上下位置正确。每位孩子们都非常厉害&#xff0c;不仅完成了自己的一本&#xff0c;还将没有…...

js【详解】数据类型原理(含变量赋值详解-浅拷贝)

JavaScript 中的数据按存储方式的不同&#xff0c;分为值类型和引用类型。 值类型&#xff08;共 6 种&#xff09;&#xff1a;赋值的时候传值 —— 数字、字符串、布尔值、null 、undefined&#xff0c;Symbol引用类型&#xff08;仅 1 种&#xff09;&#xff1a;赋值的时候…...

SAM 影像分割——地理空间数据的分段模型的数据调参和自动分割分析

本笔记本展示了如何使用 Segment Anything Model (SAM) 从图像中分割对象,只需几行代码即可完成。 请确保在本笔记本中使用 GPU 运行时。对于 Google Colab,请转到运行时 -> 更改运行时类型,然后选择 GPU 作为硬件加速器。 地理空间数据的分段模型 Segment Anything M…...

Java底层自学大纲_设计模式篇

设计模式专题_自学大纲所属类别学习主题建议课时&#xff08;h&#xff09; A 深入理解设计模式001 SOLID设计原则和策略模式2.5 A 深入理解设计模式002 责任链模式2.5 A 深入理解设计模式003 工厂模式和模版方法模式2.5 A 深入理解设计模式004 装饰者模式2.5 A 深入理解设…...

详解字符串函数<string.h>(上)

1. strlen函数的使用和模拟实现 size_t strlen(const char* str); 1.1 函数功能以及用法 字符串长度 strlen函数的功能是计算字符串的长度。在使用时&#xff0c;要求用户传入需要计算长度的字符串的起始位置&#xff0c;并返回字符串的长度。 #include <stdio.h> #…...

1、docker入门

文章目录 1、tocker简介2、tocker的安装&环境配置2、配置阿里云镜像3、基本命令1、镜像命令2、docker基本命令3、镜像基本命令4、Docker 容器常用命令 1、tocker简介 新一代的虚拟化技术 2、tocker的安装&环境配置 uname -r1、首先查看liunx的内核 yum update -y2、更…...

Qt应用软件【测试篇】cppchecker静态代码检查

文章目录 cppcheker简介下载地址与安装检查项目QT Creator使用CPP Cheker开启检查常见错误总结错误信息说明cppcheker简介 Cppcheck 是一个用于 C/C++ 代码的分析工具。它提供独特的代码分析以检测错误,并专注于检测未定义的行为和危险的编码结构。其目标是仅检测代码中的真实…...

[递推与递归]数的计算

题目描述 给出正整数 n&#xff0c;要求按如下方式构造数列&#xff1a; 只有一个数字 n 的数列是一个合法的数列。在一个合法的数列的末尾加入一个正整数&#xff0c;但是这个正整数不能超过该数列最后一项的一半&#xff0c;可以得到一个新的合法数列。 请你求出&#xff…...

Cocos Creator 3.8.x 后效处理(前向渲染)

关于怎么开启后效效果我这里不再赘述&#xff0c;可以前往Cocos官方文档查看具体细节&#xff1a;后效处理官网 下面讲一下怎么自己定义一个后处理效果&#xff0c;想添加自己的后效处理的话只需要在postProcess节点下添加一个BlitScreen 组件即可&#xff0c;然后自己去添加自…...

番茄小说下载器:你的个人数字图书馆建造指南

番茄小说下载器&#xff1a;你的个人数字图书馆建造指南 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 你是否曾经遇到过这样的情况&#xff1a;深夜追更一本精彩的小说&#xff0c;网络突…...

C语言飞机大战核心架构与状态机设计,实战演练

C语言飞机大战&#xff1a;核心思路与高级技巧深度解析 本教程将深入探讨C语言开发“飞机大战”类2D射击游戏的核心设计思路、架构模式与高级优化技巧。我们将超越基础语法&#xff0c;聚焦于如何构建一个可维护、高性能、易扩展的游戏系统&#xff0c;涵盖从状态机设计、内存…...

DeepSeek+Kimi高阶降AI指令大全,附10款论文降AI工具红黑榜

各位深夜还在肝初稿、赶论文的脆皮大学生们&#xff0c;大家晚上好&#x1f319; 是不是每次一读起来自己用AI润色过一遍的文章都觉得尴尬到头皮发麻&#xff1f; 满屏的“首先、其次、总而言之”、“在这个瞬息万变的时代”……导师扫一眼就把你叫到办公室喝茶&#xff0c;顺…...

仅限首批200名AI工程师获取:多模态鲁棒性压力测试套件(含11类合成扰动+3D视觉-语音耦合故障注入)

第一章&#xff1a;多模态大模型鲁棒性提升方法 2026奇点智能技术大会(https://ml-summit.org) 多模态大模型在真实场景中常面临输入噪声、模态缺失、分布偏移与对抗扰动等挑战&#xff0c;鲁棒性不足将直接导致跨模态对齐失效、语义理解偏差甚至决策崩溃。提升鲁棒性需从数据…...

FinBERT金融情感分析:如何用AI模型洞察市场情绪变化

FinBERT金融情感分析&#xff1a;如何用AI模型洞察市场情绪变化 【免费下载链接】finbert 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/finbert FinBERT是一款专门为金融文本设计的预训练NLP模型&#xff0c;能够准确分析财经新闻、研报和社交媒体中的情感…...

N_m3u8DL-CLI-SimpleG:告别命令行!用这款免费GUI工具轻松下载M3U8视频

N_m3u8DL-CLI-SimpleG&#xff1a;告别命令行&#xff01;用这款免费GUI工具轻松下载M3U8视频 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG 还在为复杂的命令行操作而头疼吗&am…...

告别模拟传感器!用DS18B20和51单片机做个智能温度计(附完整代码)

从模拟到数字&#xff1a;基于DS18B20与51单片机的智能温度计实战指南 在电子设计与嵌入式开发领域&#xff0c;温度测量是最基础却又最常遇到的需求之一。传统模拟温度传感器如热敏电阻、LM35等&#xff0c;虽然成本低廉&#xff0c;但需要复杂的信号调理电路和模数转换模块&a…...

GIS小白必看:如何用GeoServer把普通图片变成可交互地图(附QGIS配准技巧)

GIS入门实战&#xff1a;从普通图片到可交互地图的完整指南 引言&#xff1a;为什么需要将图片转换为可交互地图&#xff1f; 在日常工作中&#xff0c;我们经常会遇到这样的场景&#xff1a;客户提供了一张手绘地图、历史航拍图或是扫描的规划图纸&#xff0c;但这些图片文件…...

LaserGRBL架构深度解析:开源激光雕刻控制软件的技术实现与性能优化

LaserGRBL架构深度解析&#xff1a;开源激光雕刻控制软件的技术实现与性能优化 【免费下载链接】LaserGRBL Laser optimized GUI for GRBL 项目地址: https://gitcode.com/gh_mirrors/la/LaserGRBL LaserGRBL作为一款专为激光雕刻优化的开源控制软件&#xff0c;通过深度…...

开源规则引擎选型指南:从轻量级到企业级的实战对比

1. 规则引擎入门&#xff1a;为什么你的项目需要它&#xff1f; 第一次接触规则引擎这个概念是在2015年&#xff0c;当时我在开发一个电商促销系统。每当运营同学提出"满300减50"、"会员日双倍积分"这类需求时&#xff0c;我们都要紧急修改代码、测试、上线…...