深入理解内存(3):内存交换技术,虚拟内存

2013-01-15 21:14 1560人阅读 评论(0) 收藏 举报
分类:
3) C++(59) 1)IT Related(21)

版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[-]

  1. 页式存储管理
  2. 段式存储管理
  3. 分页与分段结合
  4. 虚拟内存

我们知道当多进程在内存中共存时,如果内存足够大都够用,大家相安无事自然是最理想的事了.不过现实往往没那么美好.有些时候内存会满了,不够用了.此时必须将进程从内存移到硬盘中去.有空间时可能又会被移回内存来.专业点的说法叫 滚出(roll-out),滚进(roll-in).或者叫换出,换入.

在进行换出,换入时你可能会想到两种方法

(1)以进程为单位换出换进,这是最简单最容易想到的.但是显然不够灵活,因为一个进程所需的内存空间较大.所以这种交换技术现在用的不多

(2)只交换进程的一部分. 通过页式或段式内存管理先把进程的虚拟地址空间划分为若干页面或段,这样交换时就可就交换页或段.

页式存储管理

所谓分页就是把进程的虚拟地址空间划分成大小均匀的一页页的(实际上就是一块块的,把进程切成几小块罢了),比如一页是1K,然后把物理内存也划分成一页页的.然后再把两者映射起来.如下图.哎发现有时说一堆话学不如一个图顶用,下面的图都是我们从别处拷来的,图片原地址http://www.doc88.com/p-982340562158.html

当然这个映射关系的信息肯定要保存在哪.都保存在寄存器中.然后通过逻辑地址找物理地址的流程如下图

段式存储管理

分页时,就是不管三七二十一,都一刀切,把程序切成均匀的一页页的.但我们知道程序实际运转时是成为很多模块的,比如一个函数可能是一个模块.如果按程序的逻辑结构来分成更小的组成部分可能更合理.因为程序执行时也可以那样分成一个个小的单位去执行的嘛.这里我们把程序的更小单位叫作业

不过分段存储管理其实跟分页管理大的思想理念是一样的,都是把程序分成更小的单位嘛,便于交换而已.只不过分段不是均匀分成固定大小的页,而是根据实际情况分在大小不均的段.此时由于段大小不一,所以除了知道每个段的开始地址还必须要有段表长度的信息.

逻辑地址与物理地址转换如下图

分页与分段结合

分页与分段自然是各有好处.分段如果每段太大了自然不太好,那还不如干脆把整个程序交换出去得了,不用整得这么麻烦

于是有人想着把这两种方法结合起来,叫段页式存储管理.你要以在一段内再使用分页技术

虚拟内存

我们以前讲了在32的windows上,每个程序运行时都会分配2G的虚拟地址空间.就算你调大的话也最多就3G.从这句话里我们可以延伸出这样一些结论.

1.由于32的系统寻址空间只有4G,所以你整个大于4G的内存完全是浪费资源.系统只会用到其中的4G,多出来的根本不会去用.

2.你可能想着每个进程都是2G的虚拟地址空间,那一个进程加载进内存岂不是会把内存塞满了啊.实际上不会的,因为一来嘛分配给你2G地址空间.你不一定用这么多,可能只用10M,这样加载到内存的时候只加载你实际用的.另外就是不会一次把所有进程需要的内存分配下来然后把程序加载进来,而只是加载暂时需要的程序代码或数据

3.因为每个进程地址空间最大也只能整个3G出来.所以如果你的进程一跑时需要4G的地址空间才够用.那你的电脑肯定没法支持的.所以如果一些大型游戏需要内存特别多,你32的系统不管怎么整就玩不了.

另外你就肯定会有疑问. 过去个几年我们买电脑时貌似内存很多都512M,1G就算多了.然后嘛基本是32的系统.那如果某个程序实际有用到1G内存咋整? 因为虽然说程序中分配时是用的虚拟地址空间,但如果你在那2G的虚拟地址空间中实际有用到1G,最后就要映射到实际内存中去的啊.而且你1G的内存地址可是不能出现重复.这样那512内存肯定不够用的.

后面就出现了个虚拟内存的概念.就是划出一部分硬盘来当作内存用.当在虚拟内存空间中实际用到的内存大于物理内存时需要用到虚拟内存.在windows中可以在Advanced system settings那里面去设置虚拟内存的大小.不管如果是32位的话虚拟内存加上实际内存肯定也不能大于4G,不然多出来的那部分也是没有用处的.

假如还是上面的例子,512M内存,然后有1G的进程.你于是可以弄个1G的虚拟内存.然后映射的时候,先在实际的内存中映射,可能除开系统需要的一部分外就剩下300了.于是就先映射这300的内存,剩下的再去虚拟内存中映射.

反正你的用的时候只要发个逻辑地址过去.剩下的事就不用管,操作系统有个MMU(memory management unit),里面会有个页表.反正你输入逻辑地址它最终给你转换成物理内存地址或硬盘地址.

至于具体细节比较麻烦的.大概思路是,进程一般会采取分页技术,分成大小一样的很多页,每页有编号.然后页表里面会把你每页对应内存中具体的一块内存.当超过那300的实际上就对应于虚拟内存中去了.(实际上就是硬盘上的一个swp文件),肯定也有标志信息表明这部分是在硬盘上. 于是当进程运行起来时,需要用到某个地址时就映射到虚拟内存中时就会出现所谓的缺页,那页不在内存中嘛,于是就需要去硬盘上把数据读进内存来,如果内存满了就需要置换出去一些页. 所以你设置了虚拟内存,最后如果真的会有用到,那你会看到硬盘转的很快,然后程序运行速度会变慢.硬盘的操作比内存慢很多

深入理解内存(3):内存交换技术,虚拟内存相关推荐

  1. 【学习笔记】第三章——内存 I(交换技术、进程七状态模型、动态分区分配、动态分区算法)

    文章目录 一. 交换状态.进程七状态模型 二. 内存的分配方式 三. 动态分配算法 一. 交换状态.进程七状态模型 交换技术:内存空间紧张,把某些进程暂时换出外存.(进程在内存与磁盘间动态调度) 进程 ...

  2. 操作系统原理,物理内存“扩充”技术,内存紧缩,覆盖,交换,虚拟内存思想

    操作系统原理,物理内存"扩充"技术,内存紧缩,覆盖,交换,虚拟内存 当内存空间不足以存放下进程是,需要使用到内存"扩充"技术,但不是真的扩充了内存. 截图来自b ...

  3. Linux 操作系统原理 — 内存 — 基于局部性原理实现的内/外存交换技术

    目录 文章目录 目录 前文列表 基于局部性原理实现的内-外存交换技术 局部性原理 Swap 交换分区 前文列表 <Linux 操作系统原理 - 内存 - 物理存储器与虚拟存储器> < ...

  4. Linux 内存管理 详解(虚拟内存、物理内存,进程地址空间)

    Linux -操作系统内存管理 存储系统 存储器的层次结构 Linux的内存管理 物理内存 物理内存管理 虚拟内存 虚拟地址空间 (写时拷贝) 和物理地址映射关系 页表 虚拟内存优缺点 「在 4GB ...

  5. 操作系统原理:覆盖技术、交换技术、虚拟内存概要

    随着时间的推移,程序不断地更新,规模不断增长,运行的时候可能会发现内存会越来越不够用.所以希望一个容量大,更快,更便宜,数据不易丢失的存储器. 首先想到的就是硬盘,所以在硬盘的基础上建立了覆盖技术,把 ...

  6. 好理解的Java内存虚假共享(False Sharing)性能损耗以及解决方案

    虚假共享(False Sharing)也有人翻译为伪共享 参考 https://en.wikipedia.org/wiki/False_sharing 在计算机科学中,虚假共享是一种性能降低的使用模式 ...

  7. linux 内存交换参数,Ubuntu Linux:处理交换内存和内存使用情况

    我的Ubuntu比任务管理器显示的内存更多: sudo ps -e --format rss | awk 'BEGIN{c=0} {c+=$1} END{print c/1024}' 2750.29 ...

  8. 【转】深入理解JVM—JVM内存模型

    原文链接 http://www.cnblogs.com/dingyingsi/p/3760447.html#top 深入理解JVM-JVM内存模型 我们知道,计算机CPU和内存的交互是最频繁的,内存是 ...

  9. 【C语言】深入浅出理解指针及内存与指针的关系(详细讲解+代码展示)

    目录 概述 内存 内存含义 内存作用: 物理存储器和存储地址空间 物理存储器:实际存在的具体存储器芯片. 存储地址空间:对存储器编码的范围. 内存地址 指针和指针变量 指针基础知识 指针变量的定义和使 ...

最新文章

  1. 全球首次!中国黑客通过安全漏洞远程攻破特斯拉,可在行驶中“帮”你刹车...
  2. 20120918-双向链表类定义《数据结构与算法分析》
  3. WPF 实现调用本机摄像头~
  4. nssl1454-最短路【并查集,贪心】
  5. linux系统报警怎么办,常见Linux系统故障和解决方法
  6. CyberArticle和Live Writer的比较
  7. 移动营销的魔力:让你的客户无处可逃(附赠2012移动营销百问百答手册)
  8. 【大数据实验2】hadoop配置、测试和实例
  9. 女士品茶 - 简单摘录
  10. Linux邮件自动转发,Postfix 利用用户别名自动转发邮件
  11. Cocos Creator入职学习日记——篇1(KeyWord:艺术字、渐变色、透明过渡特效)
  12. 我们该如何全面提高程序的可读性
  13. 分享45个Android实例源码
  14. LeetCode报错: “runtime error: member access within null pointer of type ‘struct ListNode”
  15. U-Boot命令使用
  16. zookeeper重零开始--------自学(借鉴一些视频,书籍等工具)
  17. VS Code 这么牛,再次印证了一句名言
  18. html页面加载有时没有网样式,页面css加载失败的原因有哪些?
  19. 2022年陕西高级工程师职称评审流程是什么呢?甘建二
  20. 【Android 获取本地视频+视频剪裁+视频录制】

热门文章

  1. 一个演示A星相关的寻路的网站
  2. C#抽象类与接口的区别【转】
  3. solaris 10 安装oracle 10g
  4. spring 的权限控制:security
  5. 如何让 zend studio 10 识别 Phalcon语法并且进行语法提示
  6. 【Windows8系统控制面板和电脑设置在哪个位置】
  7. Linux常用命令笔记---故障排除
  8. ASP.NET中上传下载文件
  9. blockhouses
  10. UVa 10844 (大数)