热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

8g虚拟内存初始大小和最大值_深入浅出:操作系统之虚拟内存

1.虚拟内存1.内存存在的问题1.内存不足:如果是逻辑内存直接映射到物理内存,当逻辑内存超过物理内存的时候,计算机就会出现内存不足的情况&

1. 虚拟内存

1. 内存存在的问题

1. 内存不足:如果是逻辑内存直接映射到物理内存,当逻辑内存超过物理内存的时候,计算机就会出现内存不足的情况,导致程序崩溃。

2. 内存碎片化:如果程序频率启动或退出,会产生内存碎片,对于连续分配内存时,即使碎片内存数量比申请的内存大,但可能导致申请失败,因为没有足够的连续内存。

3. 程序间互相修改内存:如果程序切换时,不同的程序指向相同的内存时,会导致修改数据错乱。

4. 解决以上问题的方案:虚拟内存

2. 什么是虚拟内存?

3. 如何实现虚拟内存?

2. 内存的3个问题:如果所有程序可以直接访问相同的内存空间

1. 假如内存不足会怎么样?(对于一台32位系统来说,可以使用的内存有:2^32 bytes = 4GB);内存不足,超出内存空间会导致崩溃(crash)(例如32位系统,只有1GB RAM)

767e7e02133677bd91ef91486b27a6a2.png

2. 内存碎片化:如果连续分配内存,程序可能找不到合适的空间(run out of space),即使有空间,但是不连续

9409d5627ad5ba2e00098a9c674de9af.png

3. 多个程序指向相同的地址:不同程序间读写相同的内容,导致数据污染或崩溃

443b688ab9c4b385d64a803ddd1aca02.png

怎么解决?让每一个程序拥有自己的虚拟内存空间。把程序的内存空间映射到物理内存(物理内存不足时把暂时不用的swap到硬盘上)

3. 什么是虚拟内存(Any problem in computer science can be solved by adding indirection.)

1. 虚拟内存是一个间接容器

- 如果没有虚拟内存时,程序地址直接映射到物理内存。假如内存为1G,程序A运行时占用了1GB,此时再启动程序B时,发现没有内存空间可用,就导致崩溃。

- 虚拟内存:通过Map来查找程序地址对应的物理内存地址。

af26b33b04bc6a8eb47c8148c5d983ca.png

2. 虚拟内存是怎么解决3个问题:

- 内存不足时:当向系统申请内存但内存不足时,系统会把根据置换算法把暂进不用的内存置换到硬盘里,更新映射关系到硬盘上,再更新新申请的内存映射关系,让我们产生无限内存的错觉。(交换到硬盘后会导致性能下降,硬盘读取速度比内存慢太多了)。例如下面这个例子,程序0,1,2分别加载了物理地址的0,1,2。此时程序3进来,也需要申请内存。然后就根据算法先把内存腾出来,腾出来的放到磁盘上,再把腾出来的空间给程序3。这样就可以解决内存不足的问题而不会导致崩溃。

7938a82b3da49f8a9f971045bbaadb31.png

- 内存碎片:程序通过自身的映射表可以随意找到合适的物理内存,而不一定需要连续分配。

ec109c88343057fe4775dce56a0d6575.png

- 程序间相同的地址:即使程序的地址相同,但是每个程序通过自己的映射表映射到不同的物理内存而不会互相产生干扰。但是程序间相互独立一定是好的吗?并不是,因为有些内存是需要共享的。例如不同的程序会共享系统文件,系统选择框等。让程序间实现共享内存的方法是把地址指向相同的物理内存。

5a00dbe336ca5c3175cd6b04d9fa64fd.png

3. 内存映射主要由操作系统的内存管理单元(Memory Management Unit, MMU)管理操作的,一切都是同它来掌控。

4. 虚拟内存的原理

1. 核心方法:分离内存空间

1. 虚拟内存:程序操作的地址

2. 物理内存:计算机的物理内存

2. 逻辑地址(亦称虚拟地址:Virtual Address)

1. 程序使用的地址

2. 在MIPS架构上,32位操作系统的取址范围为:0~2^32-1

3. 物理地址(Physical Address)

1. 硬件和内存通信内容

2. 地址空间大小决定了有多少内存

4. 虚拟内存的原理

1. 程序是如何访问内存的:地址翻译

1. 程序指定加载一个逻辑地址

2. 计算机通过映射把逻辑地址转换成物理地址

3. 如果物理地址不在内存中,操作系统会把它从硬盘中加载到内存里,更新映射关系(原来是指向disk的,现在指向内存)

4. 计算机通过物理地址把内存内容读取出来并且返回给程序

5359b6c3c92febf99ace2c6430e67b52.png

5. 页表(page table)

1. 什么是页表

页表是一种数据结构,它用于计算机操作系统中的虚拟内存系统,其存储了虚拟地址到物理地址间的映射。--维基百科

2. 页表入口数量(Page Table Entry, PTE)

以32-bit系统为例,每个程序拥有的虚拟内存空间大小为2^32

= 4GB,每个地址所占的大小4个字节(Bytes),所以虚拟内存的逻辑地址数量为: 2^

32/4=2^30个。

3. 如何管理页表

1. 连续页表入口

所有页表入口排成一个2^30

个连续地址空间,每个地址单独映射,一个逻辑地址对于页表一对一映射到物理地址。这样的问题是:映射的数量太多了:2^32

/4=2^30=1billion个。

2. 页表分块

把页表分块,每一块为4KB,每一块大小对应逻辑地址也是分块,索引到分块时通过偏移量(page offset)来找到准确位置。

解决了映射的数量多的问题,同时也覆盖了所有情况,但是没有原来方便,因为每一次查表都需要先找到页表入口再计算偏移量才能准确找到位置。

每个分块的大小为4KB,它的偏移量需要12位来示:2^12=4KB。这种情况下,页表入口数量为:2^32/4KB=1million个。

查找过程:

d59d97245e8788e3936f634c7e32c93a.png

6. 地址转换

1. 对于1台32-bit系统,256MB的内存和4KB页表块大小的计算器来说意味着什么?

1. 32-bit系统:代表逻辑地址大小为32-bit。

2. 256MB的内存:代表物理地址大小为256MB, 范围是:0 ~ 2^28-1,地址大小为28-bit。

3. 4KB页表块大小: 意味着偏移量为4KB,占12-bit。

4. 由于页表是根据页号和偏移量两大块组合的,此时逻辑地址和物理地址的构成如下:

a5e9305c4e43883e08d431c70dd6138c.png

7. 地址转换例子

https://www.youtube.com/watch?v=6neHHkI0Z0o

392d33627233601b58a27c93255c3e7e.png

在操作系统上,每个地址实际上是知道对应该地址的长度的,意思是说:通过逻辑地址找到了物理地址,加上长度,就可以找到逻辑地址实际的存储内容了。

8. 缺页异常(缺页中断)

e1f57e92504de965dee0cb67f37926dd.png

1. 首先,怎么判断是否在是否在内存中:页表映射是否指向硬盘(disk)

2. 如果物理页不在内存中怎么办?

1. CPU生成一个缺页异常(page fault exception)

2. CPU跳转到系统缺页处做清除置换

1. 系统选择某一页从内存中移除并写入硬盘中(这里涉及页面转换算法,如最优算法、先进先出算法、最近最久未使用算法、时钟算法、最不常用算法)

2. 如果被选中从内存中移除的页面是脏数据,必须把它先写到硬盘上

3. 从硬盘中读取缺页异常的页面并写到内存中

4. 更新页表的映射关系

3. 系统跳转回到引起缺页异常的指令处

9. 内存保护

1. 每一个程序都有自己的32-bit虚拟地址空间

2. 进程的地址划分:内核(所有程序共享),栈,库,堆,Data和Text

1. 1GB空间给内核

2. 静态数据在内存起始部分

3. 堆是向上增大的,意味着堆的地址会越来越大

4. 栈是向下递减的,意味着向栈里增加内容时,栈的地址会变小。(注意:有些网上说法甚至是大学老师画图时,都会把栈底画在下面,实际程序的话是栈底在顶部)

4ce3dfaaae44352062c326d054f6a56b.png

3. 在栈和堆的起始位置会增加一个随机偏移值(random offset),是为了增加安全性,不让外部知道。

96926644ba62d7803f4f7b67e46fa105.png

10. 加速虚拟内存访问(地址变换高速缓存,快表)

1. 增加一个特殊的缓存页表: TLB(Translation Lookaside Buffer)

1. 更快的访问:只需要一次计算(cycle)即可以得出物理地址(通过页表查询需要2步:先在页表上映射找到物理页号,再根据页号找到实际物理地址)

2. 类似一个缓存,如果命中就效率提升,否则回到慢查找过程。

2. TLB很小,但很快

1. TLB分为指令TLB和数据TLB

2. 64个缓存项

3. 查找过程

9b20e34cdaa43866d4af8e772037420c.png
f0b10e12cfb7caa22e747ade6fbb89c0.png
33021a72463a132bece4acc74e75970f.png
dd20482a07c773686cd380850d511ca7.png
fe62479f6ad1ea0fd6585804880498bd.png

11. 多级页表(分页)

1. 为什么要分页?

如果每个程序加载时直接分配2^32的页表,就会占用4MB的内存。倘若所有内存都用了,那就没问题。但是很多时间刚开始是用不上的,导致了浪费内存,毕竟内存还是蛮贵的。所以要想办法初始减少分配,提高利用率

2. 如何实现分页

把原来的一个Page Table分为多级页表。例如通过2级页表,1级页表是为了索引2级页表,2级页表索引物理地址。假设页表的大小为4KB,程序启动时所需要的内存为:4KB + 4KB = 8KB,比起4M来说,真的是少太多了。

0c5f09c0c41739f145b64ecea05959e9.png



推荐阅读
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 无损压缩算法专题——LZSS算法实现
    本文介绍了基于无损压缩算法专题的LZSS算法实现。通过Python和C两种语言的代码实现了对任意文件的压缩和解压功能。详细介绍了LZSS算法的原理和实现过程,以及代码中的注释。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
author-avatar
功民昌
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有