linux 虚拟内存 mmap,虚拟内存和mmap
8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
虚拟内存虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如RAM)的使用也更有效率。
为什么要有虚拟内存内存使用效率在没有虚拟内存的时候,程序完全被装载进物理内存中,那么1G的存储空间永远只能执行固定个数的应用程序,一旦内存占满,就要触发swap和磁盘交换数据。而且每个应用程序大小不一,比如程序A占4M空间,程序B需要6M空间,即使A被释放了,B也无法使用这4M的空间。
而在虚拟内存中,首先并不是将程序所需所有数据一次性装载进内存,而是需要什么数据才会装载什么数据。其次,虚拟内存以页为单位(常规4KB)同物理内存最小单位一致,那么就可以减少碎片化的问题,可以给程序分配4KB为单位的非连续的物理空间,但是虚拟内存中却看起来是连续的。
直接操纵物理内存也很不安全,一旦修改了其他物理内存的数据,可能造成其他程序的崩溃。而虚拟内存可以有验证等权限控制。
其他,有待思考
如何分配
常规32位机器中,可以访问的内存最大为 2^32 = 4G,通常linux规定其中3G是用户空间,1G是内核空间。1G内核空间如何映射全部4G物理内存通常,内核空间中有128M的特殊空间称为高端内存,其作用就是去对其他内存空间进行映射。
剩余的896M空间是线性映射到内核空间去的,也就是说内核中所在的虚拟地址和真实的物理内存地址只是差了一个Offset,所以内核访问其物理地址速度很快,不需要访问页表。
那么意思是一次最多映射128M?超过了会怎么样???还是说这128M是页表空间??
虚拟地址4G,真实物理内存只有2G怎么办?
没看到什么文章详细介绍,如果我使用的内存已经超出2G,猜测是使用swap分区来和磁盘进行数据交换,那如果超出了真实内存和swap分区的总和呢?又会发生什么?
虚拟内存和物理内存如何转换
内核空间的一部分区域是和真实物理内存进行线性映射的,而用户空间就不一定了,虚拟地址转换为物理地址一般是MMU实现,是一个硬件。
但是,它也要不断访问进程页表才能转义出真实的物理地址。所以出现了TLB,用来根据程序访问内存的局部性机制来缓存已经转换过的虚拟页与实际页的对应关系,加快速度。什么是页表页表用于存放逻辑页与物理页帧的对应关系
页表的每一个表项分两部分,第一部分记录此页是否在物理内存上,第二部分记录物理内存页的地址(如果在的话)
当进程访问某个虚拟地址,去看页表,如果发现对应的数据不在物理内存中,则缺页异常,缺页异常的处理过程,就是把进程需要的数据从磁盘上拷贝到物理内存中,如果内存已经满了,没有空地方了,那就找一个页覆盖,当然如果被覆盖的页曾经被修改过,需要将此页写回磁盘。
每个进程有自己的页表,页表占用空间过大
一个页表项大小为4个字节,如果内存有4G,一个页大小为4K,那么就有2^20个页,那么一个进程要占用4MB空间存放自己的页表,显然浪费空间。所以还有多级页表的概念出现。
因为页表项有一部分记录了此页是否在物理页上,如果不存在,其下一级页表也不会存在,不开辟空间,从而节省了很大空间。
esp和ebp为什么会说到这里?
主要因为我们讨论虚拟内存的时候说到了64位机器,只用了48位寻址。为什么?
讨论了一下 感觉是48位虚拟地址空间已经足够大,而且随着虚拟地址空间增大维护的页表也会增大,而且tlb的命中率也会降低所以折中选择了48位吧。
为什么会牵扯到esp和ebp
比如说一个地址存着一个int32的值,那么这个值只有32位,但是存它的地址却是一个比他本身还大的空间,这就是一种浪费。组长是iOS的,它说在iOS里面会直接使用这个值,存上这个32位的值。
当时,我就觉得很奇怪,我们都知道访问所有的东西都是需要一个地址的。那这个int值没有了自己的地址,怎么找到它呢?
组长就说了esp和ebp,因为这些变量都是在栈上创建的,其实在我们代码运行时,可以认为有两个指针一直会指向栈空间。当我们定义了一些基本变量的时候,它的大小是定值,那么在代码编译的时候,可以认为每个变量都有相对于栈空间的一个偏移量,通过指针偏移量来访问栈上的所有内容。
变量创建在栈上一定要初始化
之后我们就引c出了另一个问题,类C的语言,比如基本变量开辟在栈上,一定要初始化。为什么?
因为栈空间没有人会帮你重置,那么当你在栈上定义了变量没有初始化,这个地址上也许已经存在内容了,那么此时变量的值就是错误的。
#include
void test1(){
int a = 0x12345678;
}
void test2(){
int a;
printf("%2xn",a);
}
int main(){
test1();
test2();
return 0;
}
这段代码打印出来的是什么?答案是0x12345678。
因为test1执行的时候将一片栈空间修改了,test2执行的时候重新从之前的位置开始执行,同时也是个int类型,读出来的值就是test1中的值。
mmap
mmap官方解释 map files or devices into memory
mmap会在虚拟内存中开辟一段新的空间,并不会真的分配物理空间,当访问到这段虚拟地址时,根据前面的虚拟内存知识,页表中表示该虚拟地址没有对应的物理地址,则会发生缺页中断,此时才会进行物理内存分配和读取相应内容进物理内存。
总之,Linux的一切都是一种懒加载的模式,只有真正用到,才会真的开辟真实空间。
那么mmap有什么作用?读取文件
mmap跟常规的read有区别,只有一次拷贝过程,效率更高(这里read的内容如果在页缓存中应该也差不多吧?),很多文章分析,并且有详细的函数调用过程。
跨进程通信
mmap有一种MAP_SHARED的flag,两个进程可以mmap同一个文件到自己的进程中,这样就可以通过这一个文件进行通信了。但是一个完善的跨进程通信有很多细节,比如这两个进程如何互相找到对方,数据传输等各种细节。
binder_mmap
android中的基石binder,就是用于跨进程通信,是一套完善的IPC机制,并且好像也合并入了新的Linux中。
具体的过程,未完待定~~
借鉴
linux 虚拟内存 mmap,虚拟内存和mmap相关推荐
- linux存储--共享内存机制mmap(十二)
mmap基础概念 mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系.实现这样的映射关系后,进程就可以采用指 ...
- Linux系统编程_用mmap+数组的方式修改数据文件
正文开始前,先聊点非技术的东西,推荐2本生动有趣的书: <经济学原理 宏观经济学>,曼昆,豆瓣评分9.3,4945人评价 <经济学原理 微观经济学>,曼昆,豆瓣评分9.6,18 ...
- 【Linux】设置虚拟内存
[Linux]设置虚拟内存 原文链接:https://blog.csdn.net/wr132/article/details/56837266 很多人的Linux是安装在虚拟机上,或者运行在一些嵌入式 ...
- linux tomcat 默认虚拟内存,tomcat 虚拟内存配置
windows 下 tomcat 虚拟内存配置 在tomcat的bin目录下,找到catalina.bat文件,打开,在最上面添加这样一句: set JAVA_OPTS=-Xms256m -Xmx51 ...
- Linux增加swap虚拟内存
Linux增加swap虚拟内存 0x00 背景 在我们管理的机器中,适当增加虚拟交换内存swap,可以一定程度提供机器的性能,尤其是机器(新建机器.新购买的云主机ECS)缺乏交换内存. 0x01 增加 ...
- 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 一 | mmap 函数简介 )
文章目录 一.mmap 简介 二.mmap 函数作用 一.mmap 简介 mmap 函数的作用是 将 文件 映射到 内存中 , 映射的单位必须是 PAGE_SIZE ; mmap 函数引入头文件 : ...
- 2020-09-05:虚拟内存知道么?什么时候使用虚拟内存?虚拟内存除了扩大内存还有什么用?
福哥答案2020-09-05: 答案来自此链接 我们平时使用的电脑中有一个虚拟内存,但是大家对虚拟内存的了解不是很多,今天小编就大家说一说这个虚拟内存,让大家明白什么是虚拟内存,虚拟内存有什么用,以及 ...
- 在win7中要修改计算机的虚拟内存,Win7虚拟内存要设置?
Win7虚拟内存要设置? Win7虚拟内存怎么设置最好 目前最流行的Win7与先前的XP系统相比,Win7的内存占用更加庞大一些.也许2G内存对于一台XP电脑已经足够,但对于Win7却只是平常而已,虚 ...
- 理解:虚拟内存,虚拟内存地址,物理内存,物理内存地址
在解释第一个问题之前,先说明一下计算机内存管理的中的四个名词:虚拟内存,虚拟内存地址,物理内存,物理内存地址. 先说说为什么会有虚拟内存和物理内存的区别.正在运行的一个进程,他所需的内存是有可能大于内 ...
最新文章
- 【Web安全】关于SQL Injection和盲注的探索(DVWA)
- 我们用4行代码节省了100万 记录与阿里云PCDN相遇全过程
- 2接口详解_TS入门笔记2——TS接口进阶详解
- 第03讲. 原理探究,了解爬虫的基本原理
- D3中数据与DOM element绑定之data() enter() exit()浅析
- win10中通过docker安装sqlserver服务器的操作说明
- 文本文件与0、1文件
- python 脚本编码_Python-我如何编码我的Python脚本
- 【硬件】串口422的DB9接法
- 华为数通笔记-DHCP
- 安装tomcat时出错:failed to install tomcat6 service问题的解决方法
- KAIOS软件下载-自己做的
- 如何给Word中的图片添加题注
- 安装dump1090
- 学习沟通技巧--- SOFTEN法则与SOLER法则
- 四川服务器磁盘阵列卡电池性能,内置磁盘阵列卡的不足之处
- python文件夹排序笔记
- SPFA与迪杰斯特拉
- 计算机开机检测dhcp,电脑开机显示dhcp是什么意思
- 【mcuclub】模数转换ADC0832