进程是如何使用内存的?

程序运行概述

程序(我们这里只讨论单进程情况,存在多进程的程序如淘宝微信等不展开讨论)镜像存在磁盘中,运行时将镜像加载至内存RAM中,然后开始执行。

先来看一下CPU的多级存储结构,CPU通用寄存器访问速度最快,其次是Cache,再次是内存,磁盘访问速度最慢。

CPU的多级存储结构

对于进程而言,可使用的地址空间为2^32=4G,那么对于只有2G内存甚至只有256M内存的嵌入式设备怎么办?这个时候就需要MMU负责将进程的虚拟地址转换为内存的真实物理地址。如何管理这种映射关系呢?内核中为每个进程分配了进程页表。对应下图可以看到,只有正在使用的虚拟地址空间才会真正分配到物理页框;同时对于内核空间地址映射对于不同进程物理地址一样。

                                                 进程地址映射

TLB工作原理

上图中不同进程映射到物理内存使用到了TLB表(地址变换高速缓存),流程为:CPU获取数据或指令:获取进程页表,拿到物理地址;访问内存物理地址拿到真实数据。

每次执行指令,先从TLB表中获取,如果未命中,则从内存中获取,同时根据LRU方法更新TLB表。这里提一下,LRU更新方法在很多地方都用得到,像CDN页面缓存、CPU cache缓存等,如何消除cache颠簸的影响,是另一个话题。

局部性原理:时间及空间局部性,即CPU访问某个逻辑地址的数据时,大概率会继续访问该虚拟地址相邻的地址。因此为了保证cache的命中率,一般CPU采用多级流水线设计,将预取指令及相邻的地址空间存放至TLB表中。

每个核都有自己的TLB,由MMU内存管理单元模块执行,流程为:CPU发送执行进程的虚拟地址给MMU模块,MMU对应的硬件电路获取TLB表物理地址并访问数据。

如果进程使用了4G虚拟地址,那么所需要的页表项条目为:

4G/4K=1M

每个页表项为4Byte,因此进程页表占据了4M物理内存空间。这种状态下可以使用多级页表减少内存占用,且可以离散存储。

 

====

从malloc说起

使用malloc分配16k空间,这16k不会立即占用16k真实内存,而是采用写时复制的方式使用。如果物理内存已经写满数据怎么办(可能被多个进程占用)?这个时候就继续使用上面提到的LRU方式进行页表置换。置换过程中会将换出的页表真实写入磁盘中,一般由daemon守护进程完成。

前面使用malloc分配空间之后,linux内核并未真正给该进程分配物理页,如果对该地址进行写动作,会由MMU触发缺页中断,这时进入内核终端处理程序,将数据从磁盘加载至内存。

 

                                                    CPU寻址流程

下面总结一下CPU寻址流程:CPU将进程虚拟地址通过地址总线发送给MMU,由MMU硬件电路转换成物理地址,然后通过数据总线访问内存获取数据。

CPU获取物理地址流程如下:

1、CPU发送虚拟地址,MMU查询自身TLB表,如果命中:根据物理地址访问数据页;如果不命中,通过cr3寄存器取出进程页表物理地址访问进程页表。

2、这里访问进程页表先是从Cache中获取缓存页框,如果Cache命中:从Cache中获取得到物理地址,更新TLB表。如果不命中,直接访问内存页表。

3、进程页表保存了进程使用过程中所有的虚拟地址对应的表项,因此通过页表地址偏移可直接获取到页表项,并更新至Cache中。

4、继续第一步,MMU从Cache中获取页表项,并查看虚拟地址是否已分配物理页框。若分配,则使用LRU算法更新TLB表并通过内存物理地址访问数据;若没分配物理页框,则触发Page Fault缺页中断,进入并执行中断接管程序。

5、中断处理程序为发送的虚拟地址分配真实物理页框,如果内存数据已满,根据LRU算法淘汰最久未用的页面,置换磁盘的进程映像至物理页框,并更新进程页表。(用户空间的缺页中断还会判断是否非法访问等权限校验,这里不展开)

6、中断处理程序返回,CPU获取执行权,继续执行指令。

获取到了物理地址,根据物理地址获取实际数据流程为:MMU通过物理地址查询Cache,如果缓存命中,CPU直接获取Cache中数据并继续执行;如果不命中,那么根据物理地址获取内存中的数据,硬件电路将物理页框存入Cache中,CPU从Cache中获取数据。

 

CPU获取数据流程

理想状态下,当进程局部性较高时,如执行while循环,MMU获取TLB表命中拿到物理地址,通过物理地址访问Cache命中拿到真实数据。

 

具体示例代码分析代码数据流及执行流

char* ptr =malloc(1*1024*1024);  //1、分配内存
memcpy(ptr, 'a',10);     //2、写入数据
ptr[100] = 'b';    //3、赋值

第一行:char* ptr =malloc(1*1024*1024);

假定malloc分配的虚拟地址是0x00000040,表示【0x00000040-0x00100040】这1M进程虚拟空间被分配成功。接下来我们看一下进程页表情况。

0x00000040  ->  64

0x00100040  ->  1048640

也就是这段虚拟空间占了1048576块页表项。这里注意,如果是一级页表,不管有没有执行malloc,这些页表项都存在,但如果是多级页表,只有真实访问数据的时候这些页表才会占用物理内存空间。接下来计算页号和页内偏移:

起始地址虚拟页号:64/(4*1024)= 0,页内偏移为64%(4*1024)= 0x40;

结束地址虚拟页号:1048640/(4*1024)= 256,页内偏移为1048640%(4*1024)= 0x40;

第二行:memcpy (ptr,'g', 10);

根据ptr虚拟地址找到页表项,发现并没有分配物理页框,触发缺页中断后分配得到第100页框。然后CPU将ptr对应虚拟地址往后的10字节空间写为‘a’。这里说一下,虽然进程页号对应的物理页框序号不一定相同,因为页框大小为4k,所以虚拟地址在进程页号中的偏移等于映射的物理地址在物理页框中的偏移

CPU根据虚拟地址按照上一章的流程找到对应物理地址,将第100物理页框加载至Cache中,CPU将10字节’a’写入Cache。

第三行:ptr[100] = 'b';

根据局部性原理,这里访问的就是同一个虚拟地址附近的数据,因此TLB和Cache都命中。

可以看到,进程在执行malloc时是将物理页框直接分配给虚拟地址,里面的初始数据有内存的电气特性决定,是随机值,因此maoolc出来的空间使用前需要赋值或者执行初始化操作。


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

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

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

相关文章

如何用SQLDMO在ASP.NET页面下实现数据库的备份与恢复

我们知道&#xff0c;用SQLDMO可以实现对数据库的备份与恢复&#xff0c;下面给出简单的实现方法。首先需要添加对SQLDMO引用1.实现数据库的备份&#xff1a;1/**//// <summary> 2 /// 数据库备份 3 /// </summary> 4 /// <returns>备份…

TP4056 实现可编程锂电充电器+电量计

本文作者&#xff1a;t3486784401链接&#xff1a;https://www.mydigit.cn/forum.php?modviewthread&tid250916&extra手头有些容量非常小的软包锂电&#xff0c;直接使用市面上的大功率充电板&#xff08;500mA/1A&#xff09;倍率太大&#xff0c;容易损坏电池。索性…

电车防盗报警器电路原来是这样的!

前几天电路菌从电车上拆开了一个防盗报警器&#xff0c;今天来看看防盗报警器这内部的电路到底是怎样的&#xff01;上图就是防盗报警器的主机&#xff0c;引出来的这根黑线是天线。在防盗报警主机的侧面&#xff0c;可以看到印刷有文字“RP-48V-64V”&#xff0c;应该是指这主…

每日一题(14)—— 交换a,b的值(不使用中间变量)

如何将a,b的值进行交换&#xff0c;并且不使用任何中间变量&#xff1f; 推荐答案&#xff1a; a a ^ b; b a ^ b; a a ^ b; 下面的答案不好&#xff0c;可能会导致越界的问题 a a b; // 可能越界 b a - b; a a - b;

买到假芯片,血的教训!

关注星标公众号&#xff0c;不错过精彩内容作者 | 写代码的篮球球痴素材来源 | 云汉芯城2021年太难了&#xff0c;芯片涨价不说&#xff0c;涨价之后还买不到芯片&#xff0c;芯片交货周期已经超过一年了。嵌入式Linux1涨价、缺货 ——> 翻新、假货在芯片涨价、缺货的背景下…

Windows 7 :微软目前最好的操作系统

好消息&#xff0c;各位&#xff01;如果你是 PC 用户&#xff0c;如果你仍然在使用有 8 年历史的 Windows XP&#xff0c;或者令人讨厌的 Windows Vista &#xff0c;现在你终于可以解脱了&#xff1a;Windows 7 就在眼前。微软交付了一套设计巧妙、改进巨大的操作系统&#x…

[Robot Framework] 怎么做数学运算?

运用BuiltIn里面的Set Variable 转载于:https://www.cnblogs.com/MasterMonkInTemple/p/9020406.html

解剖几个有点难度的C笔试题

总结了几个比较经典的笔试题目&#xff0c;这些题目是在面试中遇到的&#xff0c;有难度&#xff0c;但是不是那种特别难的&#xff0c;比较有代表性&#xff0c;如果正在找工作的话&#xff0c;可以看看&#xff0c;丰富一下自己的知识库。1.题目一求下面代码输出&#xff1a;…

亲试白天使:华硕家用级无线路由RT-N11+

拿到机子2个礼拜&#xff0c;说实话&#xff0c;对于我来说&#xff0c;家庭用ASUS RT-N11还是很够给力的。 华硕RT-N11产品资料 <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />无线网络 802.11n Draft 2.0 WAN接口 100Mbps1 L…

基于PHP实现一个简单的在线聊天功能(轮询ajax )

基于PHP实现一个简单的在线聊天功能&#xff08;轮询ajax &#xff09; 一、总结 1、用的轮询ajax 二、基于PHP实现一个简单的在线聊天功能 一直很想试着做一做这个有意思的功能,感觉复杂的不是数据交互和表结构,麻烦的是前端展..于是.. 需求分析 要实现功能,首先要做前端,经过…

C笔试题指针

解剖几个有点难度的C笔试题昨天写的那个面试题&#xff0c;今天在群里讨论&#xff0c;有个同学加工了下&#xff0c;变成了新的题目&#xff0c;写出来大家一起看看。#include <stdio.h> struct node {int a;int b;int c; }; int main() {struct node s {3,5,6};int*pt …

Web安全渗透测试之信息搜集篇(上)

通过使用搜索引擎、扫描器、发送简单的HTTP请求或者专门精心制作的请求&#xff0c;都有可能导致应用程序泄漏诸如错误信息、版本信息以及所使用的技术等信息。 一、测试robots.txt文件 现在&#xff0c;我们首先介绍如何测试robots.txt文件。Web蜘蛛/机器人/爬虫可以用来检索网…

数据结构之线性结构之堆栈

二&#xff0c;堆栈 中缀表达式&#xff1a;运算符位于两数之后&#xff1b; ab*c-d/e 后缀表达式&#xff1a;运算符位于两数之后&#xff1b; abc*de/-&#xff1b;计算机表示式求解时的读法&#xff1b;用堆栈实现计算 前缀表达式&#xff1a;运算符位于两数之前&#xff1b…

Qt 开源作品 | 小伙子,给你的 Linux 系统写个 Launcher 吧

今天给大家分享一下&#xff1a;如何用 Qt 实现一个 launcher (程序启动器)。运行效果&#xff1a;github 链接&#xff1a;https://github.com/alamminsalo/qml-launcher代码很少&#xff0c;C 部分大约 100行代码。下面是实现过程。1. 创建 QML 应用在 Qt Creator 依次点击&a…

Sourcetail 一款代码编辑神器,让看源码如丝般顺滑

大家好&#xff0c;我是小麦&#xff0c;上一次的文章《一个超级实用的源码阅读小技巧》&#xff0c;我简单提到通过gccegyptgraphviz(dot)这三个工具&#xff0c;快速生成函数调用图&#xff0c;总体来说也非常好用。众所周知VSCode&#xff0c;Sorceinsight非常好用&#xff…

CPU占用率是什么?

这是昨晚上在朋友圈发的一个讨论回答的问题很多因为这个问题&#xff0c;我晚上也没早睡&#xff0c;就想把这个讲清楚说这个问题之前我们先了解下时间片调度算法&#xff0c;因为用这个来讲比较清楚。CPU可以执行任务&#xff0c;CPU给哪个进程执行&#xff0c;哪个进程就可以…

长大了,也弄丢了很多东西

小明要回家处理父亲的头七&#xff0c;那天晚上跟他喝酒聊天&#xff0c;我们说对生活的一些计划&#xff0c;比如计划让小孩上哪所小学&#xff0c;比如上小学了上哪所初中&#xff0c;高中&#xff0c;报什么课外兴趣班等等。吃过苦的孩子心里都有一种执念&#xff0c;想让自…

我的爹,我的娘(2006-02-22 21:39:07)(新浪)

爸爸妈妈是农民&#xff08;我也是&#xff09;&#xff0c;都已年过半百。他们很忙碌&#xff0c;闲不下来.爸爸头发这几年越来越少了&#xff0c;头发也白了不少&#xff0c;但坚持经常染发&#xff0c;因为他说&#xff0c;怕我的小兄弟产生为什么别人爸爸这么年轻的想法。我…

200个模块,怎么用有线的方式进行组网通信

这是一个读者私聊我的问题&#xff0c;我觉得比较有意思&#xff0c;发出来大家一起讨论&#xff0c;我相信在讨论后&#xff0c;会有更加好的的方案。问题有200个模块&#xff0c;这200个模块需要和主CPU进行通信&#xff0c;每个模块的距离大概在30~50cm之间&#xff0c;用怎…

两招让陌生网络访问者现出原形

当我们关闭计算机时&#xff0c;经常出现“有一台计算机与你的电脑有连接,如果关闭将中断数据”的提示&#xff0c;尤其是在局域网中这种提示更是经常出现。其实这是因为别人通过网络正在访问自己电脑上的共享资源呢!面对如此恶劣的行动&#xff0c;难道只能任其胡作非为吗!当然…