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

news2024/9/20 5:45:22

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

                                              ♈️今日夜电波:会いたい—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! 

                                       

                                                                        给个三连再走嘛~  

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

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

相关文章

详解Java中的protected修饰的访问权限

前言:在Java中,类成员访问权限修饰词有四类:private,缺省(说白了就是空)着)protected 和 public,private,缺省,和 public的访问权限都很好理解,但是protected的访问权限却…

文献速递:帕金森的疾病分享--多模态机器学习预测帕金森病

文献速递:帕金森的疾病分享–多模态机器学习预测帕金森病 Title 题目 Multi-modality machine learning predicting Parkinson’s disease 多模态机器学习预测帕金森病 01 文献速递介绍 对于渐进性神经退行性疾病,早期和准确的诊断是有效开发和使…

Stable Diffusion 模型分享:GalaxyTimeMachines GTM ForYou-Fantasy(幻想)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 作者述:这个“幻想”模型比这个系列的照片模型有更多的风格和颜色。如果推动的…

云渲染的使用:效果图渲染要多久!

随着技术的不断进步,云渲染服务已经成为效果图制作过程中划时代的解决方案。通过该服务,3D艺术家和渲染师现在可以在云端完成资源密集型的渲染任务,这大大节省了本地计算资源。但许多人可能会好奇,使用云渲染服务渲染一张效果图究…

RTE 开源|小红书 REDPlayer 正式发布!快来 get 同款播放器~

本项目由 RTE 开发者社区 x 小红书 联合运营 播放器最初出现在 19 世纪,当时主要用于播放音频,例如通过留声机播放唱片。 随着技术的进步,音频播放器不断改进,品质越来越好,体积也越来越小。到了今天,通过…

投标中excel表格常用功能梳理

投标中excel表格常用功能梳理: 1.投标报价调整报价的办法: 目的调整报价,把“红框”的报价增加30%,50% 增加30%的步骤: 步骤1:选择1.3 复制(ctrlc) 步骤2:选择性黏贴 …

React之数据绑定以及表单处理

一、表单元素 像<input>、<textarea>、<option>这样的表单元素不同于其他元素&#xff0c;因为他们可以通过用户交互发生变化。这些元素提供的界面使响应用户交互的表单数据处理更加容易 交互属性&#xff0c;用户对一下元素交互时通过onChange回调函数来监听…

SpringBoot底层原理

SpringBoot底层原理 一 配置优先级 1.配置方式 Springboot中支持三种配置方式&#xff0c;分别为&#xff1a; application.propertiesapplication.ymlapplication.yaml 2.配置优先级 当存在多份配置文件时&#xff0c;配置文件会按照它们的优先级生效。 优先级从高到底…

一文带你了解MySQL之B+树索引的原理

前言 学完前面我们讲解了InnoDB数据页的7个组成部分&#xff0c;知道了各个数据页可以组成一个双向链表&#xff0c;而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表&#xff0c;每个数据页都会为存储在它里边儿的记录生成一个页目录&#xff0c;在通过主键查…

docker mysql主从复制

新建主服务器容器实例3301 mysql 主 3301 docker run -p 3301:3306 --name mysql-master \ -v /mydata/mysql-master/log:/var/log/mysql \ -v /mydata/mysql-master/data:/var/lib/mysql \ -v /mydata/mysql-master/conf:/etc/mysql \ -v /home/mysql/mysql-files:/var/lib/…

什么是前端框架中的数据绑定(data binding)?有哪些类型的数据绑定?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:边框设置)

设置组件边框样式。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 border border(value: BorderOptions) 设置边框样式。 卡片能力&#xff1a; 从API version 9开始&#xff0c;该接口支持在ArkTS卡…

怎样选择一家可靠的代理IP服务?

在数字化时代&#xff0c;随着网络安全和数据隐私的日益重要&#xff0c;代理IP服务已经成为个人用户和企业保护网络身份、实现数据加密和访问地理限制内容的重要工具。然而&#xff0c;面对市场上众多的代理IP服务提供商&#xff0c;如何选择一家可靠的代理IP服务提供商也成为…

【JavaScript 漫游】【026】进度事件简记

文章简介 本篇文章为【JavaScript 漫游】专栏第 025 篇文章&#xff0c;简单记录了进度事件的知识点。 进度事件的种类 进度事件用来描述资源加载的进度&#xff0c;主要由 AJAX 请求、<img>、<audio>、<video>、<style>、<link> 等外部资源的…

如何知道当前ubuntu的版本

查看版本&#xff1a; cat /etc/lsb-release 查看内核&#xff1a; uname -a

[AutoSar]BSW_Com07 CAN报文接收流程的函数调用

目录 关键词平台说明一、背景二、顺序总览三、函数说明3.1 Com_RxIndication&#xff08;&#xff09; 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c;芯片厂商TI 英飞凌编程语言C&#xff0c;C编译器HighTec (GCC)…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:布局约束)

通过组件的宽高比和显示优先级约束组件显示效果。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 aspectRatio aspectRatio(value: number) 指定当前组件的宽高比。 卡片能力&#xff1a; 从API vers…

本地navicate连接vm虚拟机中的mysql5.7docker容器

一&#xff0c;配置 前提是我已经启动的mysql5.7容器 使用 docker ps -a 查看所有的容器 使用 docker exec -it c4f9 bash 进入mysql命令行&#xff0c;注意这个c4f9是容器唯一id&#xff0c;不用写全连接mysql mysql -uroot -p123456&#xff0c;连接成功后 输入 show datab…

JOSEF约瑟 FHP-33Q/4跳位、合位、电源监视综合控制继电器 凸出式板前接线 0.1-10S

FHP-33系列跳位、合位、电源监视综合控制继电器系列型号&#xff1a;FHP-33A/1跳位、合位、电源监视综合控制继电器&#xff1b;FHP-33A/2跳位、合位、电源监视综合控制继电器&#xff1b;FHP-33A/3跳位、合位、电源监视综合控制继电器&#xff1b;FHP-33A/4跳位、合位、电源监…

3/1作业

1.用fwrite和fread将任意bmp图片&#xff0c;修改成德国的国旗 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> int main(int argc, const char *argv[]) { FILE* fp fopen("1.bmp","r")…