假设内存中运行三个程序,分别是程序A,B,和C,三个程序将内存瓜分如下图

上图表示内存一共有6个字节,A程序用了12两个字节,B用了34两个字节,C用了56两个字节,现在如果A和C两个程序运行完毕,那么系统会将1256这四块内存清空,此时可知:程序有4个字节空间,但是却被B程序隔开了,虽然程序有4个字节空间,但是无法运行4个字节的程序,这就是内存碎片,而内存分页机制,就是用来解决上述情况的

上述说的内容是在启用分页机制的情况下,80386新增的寄存器CR0中的第31位决定是否开启分页机制,这个位叫做PG,如果PG=0,则表示不启用分页

现在有一个程序D,D的大小为4个字节,那么在开启分页功能的情况下


上图可以看出,页将本来不连续的内存,通过线性地址的方式,变成了连续的

换入和换出:如果一个程序很大且内存很小,比如程序1G,内存4M,那么需要使用换入和换出的方式来运行这个程序,首先将1G的内存分割成固定大小的块,当前运行的块,放到内存中,而没运行的块,放到硬盘上,当内存中运行的块运行完毕之后,则将这块代码放回硬盘上,称作换出,而接下来需要运行的代码,需要从硬盘上挪到内存中,这叫做换入,由此可见,硬盘也会充当内存

虚拟内存:基于分页+硬盘充当内存,两个条件,产生的内存形态就叫做虚拟内存

页表:在内存中,有一段空间是用来存放虚拟内存和物理内存之间的对应关系的,这段空间叫做页表

MMU:MMU是挨着CPU的一个硬件,用来解析页表的,CPU发出一个虚拟的线性地址,MMU要去内存中查询一下对应的物理地址是多少,然后在将真实的物理地址放到地址总线上,这产生的问题就是,每次都要MMU额外查询一次物理内存,所以解决的方式应该是第一次查询页表的时候,MMU会将这个页表内容缓存起来(注:至少从MINIX操作系统来看是这样的,其他系统应该也一样,要不然那岂不是每次都要交互两次吗)

注:本文与20211027最后修改了一次,所以上述配图个人感觉应该需要重新替换,且文中话术应该重新组织,以便于他人更好理解,但是暂时没时间。。

计算机系统-理论-内存分页机制/线性地址/虚拟内存相关推荐

  1. 80386的内存分页机制

    80386的内存分页机制 转载于:https://www.cnblogs.com/LoveFishC/archive/2012/08/24/3845738.html

  2. 详解Windows内存分页机制

    昨天新买了两本书, 看到了 内存分页 部分, 特此记录下, 没什么技术含量, 错误之处还请大牛指点. 大多数现代的操作系统都支持虚存, 这使得系统上的每个程序都拥有自己的地址空间. 每当程序读取内存时 ...

  3. 天书夜读笔记——内存分页机制

    友链 现代操作系统中,都会用到分页机制 在32bit操作系统中,对于一个进程来说,他拥有4GB的内存空间 其中低2G属于进程自己的,高2G的空间属于内核空间,所有进程看到的内核空间中的值都是一样的,也 ...

  4. 计算机系统-理论-内存读取/大端法小端法

    8086是按照下面这个内存模型来看待内存的 8086在加电的时候,默认读取CS=F000,IP=0地址出的值,也就是上图中黄色部分,那里固化了开机时需要执行的指令,在ROM区 内存读取:在一块连续的内 ...

  5. Linux内存管理:分页机制

    <Linux内存管理:内存描述之内存节点node> <Linux内存管理:内存描述之内存区域zone> <Linux内存管理:内存描述之内存页面page> < ...

  6. 内存分段分页机制理解

    现代操作系统,计算机内存是按照先分段再分页的方式管理的. 注意: 以下描述都是基于32位计算机进行描述的. 1. 分段 1) 程序直接使用物理地址的问题 考虑最原始,最直接的情况,程序中访问的地址都直 ...

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

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

  8. 操作系统学习:内存分页与中断

    本文参考书籍 1.操作系统真相还原 2.Linux内核完全剖析:基于0.12内核 3.x86汇编语言 从实模式到保护模式 ps:基于x86硬件的pc系统 内存分页机制 内存信息的获取 在进行内存分页之 ...

  9. 从内存管理原理,窥探OS内存管理机制

    摘要:本文将从最简单的内存管理原理说起,带大家一起窥探OS的内存管理机制,由此熟悉底层的内存管理机制,写出高效的应用程序. 本文分享自华为云社区<探索OS的内存管理原理>,作者:元闰子 . ...

最新文章

  1. 独家 | 从全方位为你比较3种数据科学工具的比较:Python、R和SAS(附链接)
  2. LeetCode: 102. Binary Tree Level Order Traversal
  3. 【贪心】【P5078】Tweetuzki 爱军训
  4. phpstorm—下载安装配置教程
  5. Jmeter下载、安装、配置 和 使用(一)
  6. 【数据库原理及应用】经典题库附答案(14章全)——第十章:数据库完整性
  7. / ./ ../ 的区别
  8. leetcode21 合并两个链表
  9. import threading线程进程
  10. 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》...
  11. (C/C++) string / *char / int 基本轉換
  12. matlab2c基础使用教程(实矩阵、复矩阵)
  13. java脚本封号_java中如何踢人下线?封禁某个账号后使其会话立即掉线!
  14. Windows / VS下不同类型变量转换
  15. 虚拟机中标麒麟操作系统gcc安装
  16. c语言国二题库及答案2017,全国计算机二级《C语言》考试题库与答案
  17. 十三、PS 基本操作
  18. Zookeeper如何保证数据一致性
  19. Windows上CLion配置和使用教程
  20. spring:动态工厂,静态工厂

热门文章

  1. android动态调试防止,Android应用防止so注入防止动态调试参考代码
  2. Python 将输出内容保存在text文件中
  3. java tomcat 读取配置文件端口_跟我学Java编程—应用读写项目配置文件的Properties类...
  4. java 定时调度_怎么编写一个定时调度java程序
  5. mysql java 社工库_社工库源码
  6. Java统计文件行数
  7. Kafka常用命令之kafka-console-consumer.sh
  8. C# List的克隆
  9. C# List集合求交集
  10. Ubuntu 下解压tar.xz方法