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

                                       

                                                                        给个三连再走嘛~  

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

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

相关文章

Vue3+vite打包后页面空白问题

vite.config.js vite.config.js 增加 base: ./ import { fileURLToPath, URL } from node:url import { defineConfig } from vite import vue from vitejs/plugin-vue// https://vitejs.dev/config/ export default defineConfig({base: ./,resolve: {alias: {: fileURLToPath…

解析短视频美颜SDK:美颜美型技术的深度剖析

美颜并非简单的滤镜叠加,而是依托着先进的图像处理和人工智能技术,才能够达到如此出色的效果。本文将深入探讨短视频美颜SDK背后的技术原理和实现方法,从而揭示其美颜美型技术的深度剖析。 一、美颜SDK的基本原理 美颜SDK的基本原理是通过对…

java 企业培训管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 企业培训管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…

UCWSC

feature fusion neural network based on a decomposition mechanism (FFDM) 辅助信息 作者未提供代码

学习大数据,所必需的java基础(6)

文章目录 集合Set集合介绍HashSet集合的介绍和使用LinkedHashSet的介绍以及使用哈希值哈希值的计算方式HashSet的存储去重的过程 Map集合Map的介绍HashMap的介绍以及使用HashMap的两种遍历方式方式1:获取key,然后再根据key获取value方式2:同时…

【Sql Server】Update中的From语句,以及常见更新操作方式

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对…

Docker技术概论(4):Docker CLI 基本用法解析

Docker技术概论(4) Docker CLI 基本用法解析 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:http…

Python实现PPT演示文稿中视频的添加、替换及提取

无论是在教室、会议室还是虚拟会议中,PowerPoint 演示文稿都已成为一种无处不在的工具,用于提供具有影响力的可视化内容。PowerPoint 提供了一系列增强演示的功能,在其中加入视频的功能可以大大提升整体体验。视频可以传达复杂的概念、演示产…

ArkTS中的路由跳转和HTTP数据请求

路由跳转 步骤1:找到箭头所指的文件,在其中添加已创建的页面 步骤2:导包 步骤3: HTTP数据请求 步骤1:导包 > import http from ohos.net.http; 步骤2:(如果需要在页面加载前请求&#xf…

TcpServer服务器管理模块(模块十)

目录 类功能 类定义 类实现 编译测试 server.cc gdb测试断点 忽略SIGPIPE信号 类功能 类定义 // TcpServer服务器管理模块(即全部模块的整合) class TcpServer { private:uint64_t _next_id; // 这是一个自动增长的连接IDint _port;i…

Linux学习-C语言-运算符

目录 算术运算符: - * /:不能除0 %:不能对浮点数操作 :自增与运算符 i:先用再加 i:先加再用 --:自减运算符 常量,表达式不可以,--,变量可以 赋值运算符 三目运算符 逗号表达式 size…

alpine创建lnmp环境alpine安装nginx+php5.6+mysql

前言 制作lnmp环境,你可以在alpine基础镜像中安装相关的服务,也可以直接使用Dockerfile创建自己需要的环境镜像。 注意:提前确认自己的alpine版本,本次创建基于alpine3.6进行创建,官方在一些版本中删除了php5 1、拉取…

JS正则02——js正则表达式中常用的方法、常见修饰符的使用详解以及各种方法使用情况示例

JS正则02——js正则表达式中常用的方法、常见修饰符的使用详解以及各种方法使用情况示例 1. 前言1.1 简介1.2 js正则特殊字符即使用示例 2. 创建正则表达式的方式2.1 两种创建正则表达式的方式2.2 关于修饰符 3. 正则表达式中常用的方法3.1 test() 方法——正则表达式对象的方法…

Vue之监测数据的原理(对象)

大家有没有想过,为什么vue可以监测到数据发生改变?其实底层借助了Object.defineProperty,底层有一个Observer的构造函数 让我为大家简单的介绍一下吧! 我用对象为大家演示一下 const vm new Vue({el: "#app",data: {ob…

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

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

【精品】集合list去重

示例一&#xff1a;对于简单类型&#xff0c;比如String public static void main(String[] args) {List<String> list new ArrayList< >();list.add("aaa");list.add("bbb");list.add("bbb");list.add("ccc");list.add(…

网络工程师必备的网络端口大全(建议收藏)

端口是一种数字标识&#xff0c;用于在计算机网络中进行通信&#xff0c;你完全可以把端口简单的理解为是计算机和外界通讯交流的出口。但在网络技术中&#xff0c;端口一般有两种含义&#xff1a; &#xff08;1&#xff09;硬件设备中的端口 如交换机、路由器中用于链接其他…

“金三银四”招聘季,大厂争招鸿蒙人才

在金三银四的招聘季中&#xff0c;各大知名互联网企业纷纷加入了对鸿蒙人才的争夺战。近日&#xff0c;包括淘宝、京东、得物等在内的知名APP均宣布启动鸿蒙星河版原生应用开发计划。这一举措不仅彰显了鸿蒙生态系统的迅猛发展&#xff0c;还催生了人才市场的繁荣景象。据数据显…

遥感影像处理(ENVI+ChatGPT+python+ GEE)处理高光谱及多光谱遥感数据

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。本文重点介绍ChatGPT在遥感中的应用&#xff0c;人工智能…

Vue——携带参数跳转路由

Vue学习之——跳转路由 前情回顾 当我们进行点击修改时&#xff0c;会进行跳转到修改页面&#xff0c;为了完成回显数据&#xff08;根据对应id查找&#xff09;&#xff0c;我们需要携带对应选择中的id跳转到修改页面&#xff0c;让其进行查找回显 学习useRoute和useRoute…