深入理解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! 

                                       

                                                                        给个三连再走嘛~  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年经典【自动化面试题】附答案

一、请描述一下自动化测试流程? 自动化测试流程一般可以分为以下七步: 编写自动化测试计划; 设计自动化测试用例; 编写自动化测试框架和脚本; 调试并维护脚本; 无人值守测试; 后期脚本维…

LeetCode 2581.统计可能的树根数目:换根DP(树形DP)

【LetMeFly】2581.统计可能的树根数目:换根DP(树形DP) 力扣题目链接:https://leetcode.cn/problems/count-number-of-possible-root-nodes/ Alice 有一棵 n 个节点的树,节点编号为 0 到 n - 1 。树用一个长度为 n - 1 的二维整数数组 edges…

基于springboot实现图书馆管理系统项目【项目源码+论文说明】

基于springboot实现图书馆管理系统演示 摘要 电脑的出现是一个时代的进步,不仅仅帮助人们解决了一些数学上的难题,如今电脑的出现,更加方便了人们在工作和生活中对于一些事物的处理。应用的越来越广泛,通过互联网我们可以更方便地…

C++用临时对象构造新对象

C用临时对象构造新对象 //用临时对象构造同类型的新对象&#xff0c;该临时对象不产生&#xff1b; // 直接用生成临时对象的方法构造新对象&#xff0c;这是编译器对代码的优化&#xff0c;效率更高 #include<iostream> using namespace std; class MyClass { public:…

2024最新性能测试面试题(带答案)

一、性能测试开展过程&#xff1a; 答&#xff1a;第一步&#xff1a;找产品沟通哪些接口需要压测&#xff0c;需要达到什么样的预期值(TPS和响应时间) 第二步&#xff1a;编写测试计划&#xff0c;人员、时间周期、工具 第三步&#xff1a;环境搭建 第四步&#xff1a;造数…

若依前后端分离版本-自动生成代码

听说若依挺好用的&#xff0c;所以来学习一下。 1.下载项目&#xff0c;配置redis,配置mysql,安装npm&#xff08;版本一定要低于16&#xff09; 2.执行sql脚本数据库相关信息 3.启动后端ruoyi-admin的ruoyiApplication 4启动前端 选择terminal 进入ruoyi-ui&#xff0c;执…

数据结构从入门到精通——算法的时间复杂度和空间复杂度

算法的时间复杂度和空间复杂度 前言一、算法效率1.1 如何衡量一个算法的好坏1.2 算法的复杂度 二、时间复杂度2.1 时间复杂度的概念2.2 大O的渐进表示法2.3常见时间复杂度计算举例2.4等差数列计算公式2.5等比数列计算方法 三、空间复杂度四、 常见复杂度对比五、 复杂度的oj练习…

今日arXiv最热大模型论文:点击即可播放!港中文发布大模型写歌神器!

一首歌&#xff0c;包含作词作曲两个部分。擅长作词or作曲就已经很牛了。比如方文山是周杰伦的御用作词人&#xff0c;而周杰伦写过很多耳熟能详的曲子。而兼具作词作曲才华的全能创作人却是难得一见。 最近港中文发布了一款歌曲创作大模型SongComposer&#xff0c;作词作曲都…

R语言安装和简单入门HelloWorld用法

R语言安装和简单入门HelloWorld用法 #R语言安装地址 https://www.r-project.org/ click->CRAN mirror->选择China下列表&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/CRAN/ 选择Download R for Windows 选择base Download R-4.3.2 for Windows 下载文件R-4.3.2-…

SQL-Labs靶场“26-28”关通关教程

君衍. 一、二十六关 基于GET过滤空格以及注释报错注入1、源码分析2、绕过思路3、updatexml报错注入 二、二十六a关 基于GET过滤空格注释字符型注入1、源码分析2、绕过思路3、时间盲注 三、二十七关 基于union及select的过滤单引号注入1、源码分析2、绕过思路3、联合查询注入4、…

springcloud alibaba组件简介

一、Nacos 服务注册中心/统一配置中心 1、介绍 Nacos是一个配置中心&#xff0c;也是一个服务注册与发现中心。 1.1、配置中心的好处&#xff1a; &#xff08;1&#xff09;配置数据脱敏 &#xff08;2&#xff09;防止出错&#xff0c;方便管理 &#xff08;3&#xff…

精品ssm的社区团购系统购物商城小程序

《[含文档PPT源码等]精品基于ssm的社区团购系统[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; Java——涉及技术&#xff1a; 前端使用技术&#xff1a;HTML5,CSS3、Jav…

从前端JS逆向到发现后端越权漏洞的渗透测试之旅

前言 本篇文章首发先知社区&#xff0c;作者为本公众号。 前端分析 首先搜索请求接口&#xff0c;未发现关键加密点 根据请求参数进行搜索 在js文件中找到aes加密key、iv eval(function(p, a, c, k, e, r) { e function(c) { return c.toString(36) } ; if…

什么是MTU(Maximum Transmission Unit)?

热门IT课程【视频教程】-华为/思科/红帽/oraclehttps://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502 最大传输单元MTU&#xff08;Maximum Transmission Unit&#xff0c;MTU&#xff09;&#xff0c;是指网络能够传输的最大数据包大小&#x…

禁止涉密电脑插U盘

某国家机关在日常工作中发现&#xff0c;一台涉密电脑受到了不明攻击&#xff0c;大量机密文件被非法访问和复制。 经过调查&#xff0c;原来是一名工作人员在不知情的情况下&#xff0c;将感染病毒的U盘插入涉密电脑&#xff0c;导致机密数据被窃取。 事件发生后&#xff0c…

【软考】UML中的图之通信图

目录 1. 说明2. 图示3. 特性4. 例题4.1 例题1 1. 说明 1.通信图强调收发消息的对象的结构组织2.早期版本叫做协作图3.通信图强调参加交互的对象和组织4.首先将参加交互的对象作为图的顶点&#xff0c;然后把连接这些对象的链表示为图的弧&#xff0c;最后用对象发送和接收的消…

【Mars3d】进行水平测量measure.area({的时候,会被模型遮挡的处理方法

问题&#xff1a; 1.thing/analysis/measure 水平面积 measure.area({ 在模型上测量的时候会被遮挡 2. 通过 addHeight:10000,增加高度也不可以实现这种被遮挡的效果&#xff0c;都增加到10000了&#xff0c;还是会被遮挡 export function measureArea() { measure.area({ s…

动态规划(算法竞赛、蓝桥杯)--单调队列滑动窗口与连续子序列的最大和

1、B站视频链接&#xff1a;E11【模板】单调队列 滑动窗口最值_哔哩哔哩_bilibili 题目链接&#xff1a;滑动窗口 /【模板】单调队列 - 洛谷 #include <bits/stdc.h> using namespace std; const int N1000010; int a[N],q[N];//q存的是元素的下标 int main(){int n,k;…

数据结构题目①——数组

前言 本篇文章为博主进行代码随想录——数组练习后的总结会涉及到每一道题目的详细的思路整理&#xff0c;以及本人的易错点&#xff0c;希望对大家有所帮助 数组介绍&#xff1a; 数组在C语言中就已经有所涉及&#xff0c;它是一个最基础的数据结构&#xff0c;而在数据结构中…

从零学算法289

289.根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态&#xff1a; 1 即为 活细胞 …