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. 和php区别_PHP中global与$GLOBALS的区别
  2. mysql用户权限管理的问题
  3. PostgreSQL9.5:pg_rewind 快速恢复备节点
  4. 美国最大警用摄像头厂商对人脸识别说No,称其会带来严重偏见
  5. Eclipse IDE for Java EE Developers 与Eclipse Classic 区别
  6. 一次绕过360+诺顿的提权过程
  7. 【数据挖掘实例】构建Xgboost模型,在电力用户的95598工单数据中的电费敏感用户预测(高敏用户模型)
  8. 1365. How Many Numbers Are Smaller Than the Current Number 有多少小于当前数字的数字
  9. Linux系统管理(六)
  10. 机器学习笔试面试超详细总结(一)
  11. 【书摘】三毛最深情的二十句话
  12. .NET Core 管道
  13. It's a beautiful world!
  14. 2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版)_1-3课程要求与收益...
  15. php去除空格和换行
  16. 个人修改机智云apk之出现couldn‘t find “libSDKLog.so“错误导致机智云apk在真机上调试出现keeps stopping错误解决方法
  17. 关于H5请求数据报跨域问题记录
  18. 【情人节表白神器:送她一个HTML动态表白网站 带源码】
  19. ESP8266+0.96OLED驱动显示(I2C)
  20. 转 全国高校信息数据库,全国高校排序数据库

热门文章

  1. android 仿微信录音,Android 模仿微信长按录音功能
  2. 图片绘制适应屏幕处理的一些思路
  3. C盘清理及可清理文件详解(Windows 7)-简单易操作_让你的C盘彻底解放
  4. K-means clustering using random matrix sparsification(ICML2018)
  5. 博弈对抗游戏AI的技术方法的一些总结和思考
  6. C/C++入门级小游戏——开发备忘录
  7. java中方法的细分(普通方法,静态方法,构造方法)
  8. 用python语言解一元二次方程
  9. diyer 电脑_每个DIYer应该拥有的基本工具
  10. Python数据分析辅助审计工作