https://www.cnblogs.com/dyllove98/archive/2013/06/12/3132940.html

第一层理解

1.         每个进程都有自己独立的4G内存空间,各个进程的内存空间具有类似的结构

2.       一个新进程建立的时候,将会建立起自己的内存空间,此进程的数据,代码等从磁盘拷贝到自己的进程空间,哪些数据在哪里,都由进程控制表中的task_struct记录,task_struct中记录中一条链表,记录中内存空间的分配情况,哪些地址有数据,哪些地址无数据,哪些可读,哪些可写,都可以通过这个链表记录

3.       每个进程已经分配的内存空间,都与对应的磁盘空间映射

问题:

计算机明明没有那么多内存(n个进程的话就需要n*4G)内存

建立一个进程,就要把磁盘上的程序文件拷贝到进程对应的内存中去,对于一个程序对应的多个进程这种情况,浪费内存!

第二层理解

1.         每个进程的4G内存空间只是虚拟内存空间,每次访问内存空间的某个地址,都需要把地址翻译为实际物理内存地址

2.         所有进程共享同一物理内存,每个进程只把自己目前需要的虚拟内存空间映射并存储到物理内存上。

3.         进程要知道哪些内存地址上的数据在物理内存上,哪些不在,还有在物理内存上的哪里,需要用页表来记录

4.         页表的每一个表项分两部分,第一部分记录此页是否在物理内存上,第二部分记录物理内存页的地址(如果在的话)

5.         当进程访问某个虚拟地址,去看页表,如果发现对应的数据不在物理内存中,则缺页异常

6.         缺页异常的处理过程,就是把进程需要的数据从磁盘上拷贝到物理内存中,如果内存已经满了,没有空地方了,那就找一个页覆盖,当然如果被覆盖的页曾经被修改过,需要将此页写回磁盘

总结:

优点:

1.既然每个进程的内存空间都是一致而且固定的,所以链接器在链接可执行文件时,可以设定内存地址,而不用去管这些数据最终实际的内存地址,这是有独立内存空间的好处

2.当不同的进程使用同样的代码时,比如库文件中的代码,物理内存中可以只存储一份这样的代码,不同的进程只需要把自己的虚拟内存映射过去就可以了,节省内存

3.在程序需要分配连续的内存空间的时候,只需要在虚拟内存空间分配连续空间,而不需要实际物理内存的连续空间,可以利用碎片。

另外,事实上,在每个进程创建加载时,内核只是为进程“创建”了虚拟内存的布局,具体就是初始化进程控制表中内存相关的链表,实际上并不立即就把虚拟内存对应位置的程序数据和代码(比如.text .data段)拷贝到物理内存中,只是建立好虚拟内存和磁盘文件之间的映射就好(叫做存储器映射),等到运行到对应的程序时,才会通过缺页异常,来拷贝数据。还有进程运行过程中,要动态分配内存,比如malloc时,也只是分配了虚拟内存,即为这块虚拟内存对应的页表项做相应设置,当进程真正访问到此数据时,才引发缺页异常。

补充理解:

虚拟存储器涉及三个概念: 虚拟存储空间,磁盘空间,内存空间

可以认为虚拟空间都被映射到了磁盘空间中,(事实上也是按需要映射到磁盘空间上,通过mmap),并且由页表记录映射位置,当访问到某个地址的时候,通过页表中的有效位,可以得知此数据是否在内存中,如果不是,则通过缺页异常,将磁盘对应的数据拷贝到内存中,如果没有空闲内存,则选择牺牲页面,替换其他页面。

mmap是用来建立从虚拟空间到磁盘空间的映射的,可以将一个虚拟空间地址映射到一个磁盘文件上,当不设置这个地址时,则由系统自动设置,函数返回对应的内存地址(虚拟地址),当访问这个地址的时候,就需要把磁盘上的内容拷贝到内存了,然后就可以读或者写,最后通过manmap可以将内存上的数据换回到磁盘,也就是解除虚拟空间和内存空间的映射,这也是一种读写磁盘文件的方法,也是一种进程共享数据的方法 共享内存

转载于:https://www.cnblogs.com/qxxnxxFight/p/11127740.html

【转】Linux 虚拟内存相关推荐

  1. [转]十问 Linux 虚拟内存管理 (glibc)

    最近在做 MySQL 版本升级时( 5.1->5.5 ) , 发现了 mysqld 疑似"内存泄露"现象,但通过 valgrind 等工具检测后,并没发现类似的问题.因此,需 ...

  2. linux虚拟内存 ppt,Linux虚拟内存管理基础v2研究报告.ppt

    Linux虚拟内存管理基础v2研究报告.ppt Linux虚拟内存管理基础篇 4 用户地址空间与内核地址空间 Linux将每个进程的4GB的独立地址空间又划分为用户地址空间(0~ 0xBFFFFFFF ...

  3. 操作系统:Linux虚拟内存知识介绍

    今天给大家分享Linux虚拟内存相关的知识,希望的对大家能有所帮助! 1.虚拟内存 毋庸置疑,虚拟内存是操作系统中最重要的概念之一.我想主要是由于内存的重要"战略地位".CPU太快 ...

  4. linux虚拟内存api,Linux虚拟内存空间分布-Go语言中文社区

    平常总说cpu的位数,其实说的是cpu一次能运算的最长整数的宽度,既ALU(算术逻辑单元)的宽度. cpu的位数也是数据总线的条数 数据总线:数据线的总和,数据线就是cpu与内存进行数据传递的通道,一 ...

  5. Linux虚拟内存管理 | 虚拟地址与物理地址映射、段错误SIGSEGV

    目录 x86 内存寻址 x86 分页机制 虚拟内存地址管理 虚拟地址与物理地址映射 - do_page_fault() 推荐阅读 Linux的内存管理分为 虚拟内存管理 和 物理内存管理,本文主要介绍 ...

  6. virtual memory exhausted: Cannot allocate memory Linux虚拟内存不足,扩展虚拟内存的解决办法

    Linux虚拟内存不足,扩展虚拟内存的解决办法 virtual memory exhausted: Cannot allocate memory 在编译软件的时候,出现了这个错误: virtual m ...

  7. 操作系统——Linux 虚拟内存和物理内存的理解

    虚拟内存: 第一层理解 1..每个进程都有自己独立的4G内存空间,各个进程的内存空间具有类似的结构: 2.一个新进程建立的时候,将会建立起自己的内存空间,此进程的数据,代码等从磁盘拷贝到自己的进程空间 ...

  8. 一步一图带你深入理解 Linux 虚拟内存管理

    从本文开始我们就正式开启了 Linux 内核内存管理子系统源码解析系列,笔者还是会秉承之前系列文章的风格,采用一步一图的方式先是详细介绍相关原理,在保证大家清晰理解原理的基础上,我们再来一步一步的解析 ...

  9. 深入理解Linux虚拟内存管理(二)

    系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核(一) 深入理解 Linux 内核(二) Linux 设备驱动程序(一) Linux 设备驱动程序(二) Linux 设备驱动程序( ...

  10. LINUX系统编程 LINUX 虚拟内存

    LINUX 虚拟内存 以32位操作系统为例子,因为64位系统虚拟地址过大为2^64,32位仅仅为2^32=4G更利于描述,但是原理东西都一样 这首先要从程序和进程之间的关系开始,我们一般写好一段C\C ...

最新文章

  1. 让Squid 显示本地时间
  2. Open vSwitch相关字段详解之L3:IPv4IPv6
  3. .net IL 指令速查
  4. yii2的Console定时任务创建
  5. c 语言五子棋游戏代码,C语言案例:控制台版本的五子棋游戏【代码】
  6. 安装fusionPBX
  7. 加密电子邮件是最安全高效的工作通信方式
  8. 【SAS NOTES】数据输出-proc export
  9. java batik 字体文件_java使用batik转换svg文件-Go语言中文社区
  10. Sqlyog安装包下载
  11. axure8.0注册码
  12. 英文学术论文写作基础课程
  13. 运算放大器(OPA)超详细参数讲解-运放---以及8个型号的运算放大器分析对比
  14. 解决java.sql.SQLException: Access denied for user ‘***‘@‘localhost‘ (using password: YES)
  15. 流程控制语句-------条件判断语句(if ,if-else ,if-elif-else)
  16. Connext DDS开发指南(5)基本QoS策略
  17. 源码 | 为金融场景而生的数据类型:Numeric
  18. springboot美容院预约管理系统mybatis java
  19. 智慧校园综合解决方案
  20. SEER数据库复现-扁桃体鳞状细胞癌危险因素分析

热门文章

  1. QQ浏览器怎样选择IE8兼容模式
  2. 终身学习 思维导图
  3. Mac OS QQ的截屏快捷键设置
  4. 将手机3.5mm耳机作为电脑麦克风
  5. ETL开发过程中遇到的问题
  6. 基于java的电子病历管理系统ssh框架
  7. Robocup 仿真2D 学习笔记(三)最初的改进1
  8. 张正友棋盘法定标--Matlab【Camera Calibration Toolbox】
  9. win10分屏设置一边竖屏_win10系统电脑屏幕竖屏改为横屏的详细办法
  10. MATLAB的交互式界面 简易设计