| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> 【Linux】进程虚拟地址空间 -> 正文阅读 |
|
[系统运维]【Linux】进程虚拟地址空间 |
Linux 进程虚拟地址空间(Linux大山)一. 回顾我们在学C/C++的时候,老师给大家画过这样的空间布局图 那么这是内存吗?事实上它压根不是内存,我知道你很急,但你先别急🤞
🔥小实验我们先来看一段代码 —— 惊奇的发现:同一个地址,居然打出了不同的变量 怎么可能同一个地址,同时读取的时候,出现了不同的值? 注:
🔥验证地址空间排布上代码——
运行结果: 口诀:堆,栈相对而生 🔥语法小问题1?? 上面的代码,我们malloc了10个字节,可是打印出来的时候 却相隔了20个字节,其实是操作系统多申请了字节,其中多申请的字节放的是堆的属性信息( 2?? static修饰变量呢?
3??在32位下,一个进程的地址空间,取值范围是:0x00000000 ~ 0xFFFFFFFF
上面的验证代码,在windows下会跑出不一样的结果?
二. 进程地址空间🌈 地址空间是什么 (what?)所以之前所说的“程序地址空间”是不准确的,准确的说是“进程地址空间”,那么什么是进程地址空间呢?
1?? 我们直接访问物理内存,特别不安全(
每个进程都要有一个地址空间,操作系统为每一个进程画了一个大饼,它们都认为自己在独占物理内存 📌内核中的地址空间,本质也一定是一种数据结构,将来一定要和特定的进程关联起来
那么我们是如何用struct结构体进行划分区域?各个区域又是如何与物理内存建立关联的? 🌈 地址空间是如何设计(how?)🌊区域划分 & 页表映射💦地址空间是一种内核数据结构,它里面至少要有:各个区域的划分 其中堆栈增长会有范围的变化:
💦那么如何将虚拟地址和物理地址建立映射关系呢?通过页表 只要保证,每一个进程的页表,映射的是物理内存的不同区域,就能做到,进程之间不会互相干扰,保证了进程的独立性!! 页表+MMU进行映射
🌈 为什么要有地址空间(why?)1??保护物理内存添加一层软件层,完成有效的对进程操作内存的风险管理(权限管理),有效的保护了物理内存,本质是为了保护物理内存各个进程的
类似于过年的压岁钱妈妈帮你收着,等你要用的时候,再来问我要,防止你乱花钱。对应到这里,意味着凡是想使用地址空间和页表进行映射,一定要在 在语言层面上,我们知道,字符串存在字符常量区不能修改 ——
📌本质上是因为,这里str指针就是虚拟地址, 2??解耦合 与 延迟分配🔥 如果我们申请了物理空间,但是如果我不立马使用,是不是空间的浪费呢?
ps:好比你妈妈说明天要给你买玩具,但是今晚却把钱借给了二舅,二舅还的上还好,一旦还不上,也就不够钱了对应内存不足的情况 3??进程独立性?由于页表的存在,它可以将地址空间上的虚拟地址和物理地址进行映射,那么是不是在进程视角所以的内存分布都可以是有序的!
?进程要访问的物理内存中的数据和代码,可能目前并没有在物理内存中,同样的,也可以让不同的进程映射到不同的物理内存,也就实现了进程独立性的实现!!
操作系统(大富翁👨)给每个进程(私生子👶)都给的是全部的地址空间(10G),也就是私生子认为自己是独占的,体现出了独立性 三. 再次理解?写时拷贝1?? 我们回顾开头的小实验,为什么相同的地址会打印出不同的值? 我们知道子进程是以父进程为模板创建出来的 以至于父子进程的 为了维护进程的独立性,子进程在更改时发生写时拷贝,即为子进程重新开辟一段物理空间,把有必要的值拷贝过来,再重新建立虚拟地址到物理地址的映射关系 ? 这时我们的虚拟地址是不变的,物理内容通过映射被映射到物理内存不同的区域,所以我们看见的值是不一样的
之前说的,父子进程的代码一般是共享的,也就是通过映射到同一段物理空间实现的。 ?重新理解什么是挂起?经过上面的学习我们知道进程:是内核数据结构?代码和数据 加载本质就是创建进程,那么是不是必须非得立马把所有的程序的代码和数据加载到内存中,并且创建内核数据结构建立映射关系?
🌍理论上,可以实现对程序的分批加载(不然就是前面一行行的加载,后面的休闲瞧着二郎腿?),既然可以分批加载,也可以分批换出
所以遇到挂起时候:我们直接把内存空间释放掉,页表直接映射到磁盘,不用内存和磁盘直接数据互换。 阻塞:PCB放在某个队列中等待 四 . 深入探究(难难难)🎉零碎知识点1??当我们的程序,在编译的时候,形成可执行程序的时候,没有被加载到内存中的时候,请问:我们程序的内部,有地址吗?
上强度——(这个图估计只有我能看懂了) 2??理顺过程:(实现函数跳转)
理解了上面的流程,算是翻过这座大山了 📢写在最后
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 20:09:26- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |