- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
看到这个问题问了很多遍。但是找不到合理的答案。虚拟内存的限制实际上是什么?
它是CPU的最大可寻址大小吗?例如,如果CPU是32位,则最大为4G?
也有一些文本将其与硬盘区域相关。但是我找不到很好的解释。有人说它是CPU生成的地址。
我们看到的所有地址都是虚拟地址吗?例如,使用GDB调试程序时看到的内存位置。
CPU生成虚拟地址背后的历史原因?一些文本可互换地使用虚拟地址和逻辑地址。有何不同?
最佳答案
不幸的是,答案是“取决于”。您没有提到操作系统,但是在提到GDB时暗指linux。我会尽量完全笼统地回答我。
基本上有三个不同的“地址空间”。
第一个是逻辑地址空间。这是指针的范围。现代(386或更高版本)具有内存管理单元,该内存管理单元允许操作系统使您的实际(物理)内存出现在任意地址处。对于典型的台式机,这需要4KB的块。当程序访问某个地址的内存时,CPU将查找与该逻辑地址对应的物理地址,并将其缓存在TLB(转换后备缓冲区)中。这允许三件事:首先,它允许操作系统为每个进程提供所需的尽可能多的地址空间(最多指针的整个范围-或如果存在允许程序映射/取消映射其地址空间部分的API,则超出此范围) )。其次,它允许通过切换到不同的内存映射来完全隔离不同的程序,从而使一个程序无法破坏另一个程序的内存。第三,它为开发人员提供了调试帮助-随机损坏的指针可能指向根本没有被映射的某个地址,从而导致“分段错误”或“无效页面错误”,或者术语因操作系统而异。
第二个地址空间是物理内存。它只是您的RAM-您的RAM数量有限。可能还有一些具有映射到内存的I / O的硬件-看起来像RAM的设备,但实际上是某些硬件设备,例如PCI卡,或者也许是视频卡上的内存等。
地址的第三种类型是虚拟地址空间。如果您的物理内存(RAM)少于程序所需的内存,则操作系统可以通过给程序一种幻想,即通过仅使一部分内存实际为RAM,而让其具有大量RAM的错觉来模拟在“交换文件”中。例如,假设您的计算机具有2MB的RAM。说一个分配了4MB的程序。操作系统将保留4MB的地址空间。操作系统将尝试将该4MB的最近/最常访问的块保留在实际RAM中。任何不经常/最近访问的节都将复制到“交换文件”中。现在,如果程序接触到的4MB实际不在内存中的一部分,CPU将生成“页面错误”。操作系统将找到一些最近未访问过的物理内存,并在该页面“内页”。它可能必须将该内存页面的内容写出到页面文件中,然后才能分页访问正在访问的数据。这就是为什么它被称为交换文件的原因-通常,当它从交换文件中读取某些内容时,它可能必须先写出一些内容,从而有效地将内存中的内容与磁盘上的内容进行交换。
典型的MMU(内存管理单元)硬件跟踪访问(即读取)和修改(即写入)哪些地址。典型的分页实现通常会在对数据进行分页时将其保留在磁盘上。这使它可以“丢弃”未修改的页面,从而避免在交换时写出该页面。典型的操作系统将定期扫描页表,并保留某种数据结构,使其能够智能,快速地选择未修改的物理内存,并随着时间的推移积累有关哪些内存部分经常更改以及哪些部分需要更改的信息别。
典型的操作系统通常会轻轻地调出不经常更改的页面(这是因为它们不想生成过多的磁盘I / O,而这会干扰您的实际工作)。这样,当交换操作需要内存时,它可以立即丢弃页面。
典型的操作系统将尝试使用所有“未使用”的内存空间来“缓存”(保留副本)被访问的文件。内存比磁盘快数千倍,因此,如果经常读取某些内容,则将其放入RAM的速度将大大提高。通常,虚拟内存的实现将与此“磁盘缓存”结合在一起,作为可以快速回收用于交换操作的内存源。
编写有效的虚拟内存管理器非常困难。它需要动态地适应不断变化的需求。
典型的虚拟内存实现感觉非常慢。当一台机器开始使用更多具有RAM的内存时,整体性能将变得非常非常差。
关于memory-management - 虚拟内存的最大可寻址空间是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7536587/
I have created a hybrid activation and then setup an ssm agent on my on-premise windows system.我创
我对 python/django 编程很陌生,因为我没有编程背景。我正在在线上课,我只想确切地知道 manage.py 文件的作用。我试过用谷歌搜索它,但除了在 django-admin.py 周围放
我的 DependancyInject 存在结构问题。 情况 我正在为基于体素的游戏创建服务器;它是完全调制的,但相关模块有以下3个。 NetworkModule(发送和接收数据包)WorldModu
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 5年前关闭。 Improve thi
上 Docker正在编写的网站: The MANAGER STATUS column shows node participation in the Raft consensus: No value
我正在尝试使用发布管理作为构建版本的工具,但我很难理解码件、工具和操作之间的真正区别。有人可以分解这三个概念之间的差异以及它们如何相互配合吗? 最佳答案 由于它适用于基于代理的版本: 工具旨在提供自定
当尝试在远程环境中在 pycharm 中执行“run manage.py Task...”时,出现以下错误: ssh://vagrant@127.0.0.1:2222/home/vagrant/.vi
在过去的 48 小时里,我一直在努力解决这个问题,这让我发疯了。 我的 SDK Manager.exe 闪烁一个 cmd 屏幕并在不到一秒内关闭。 经过多方搜索,我终于在调整android.bat并以
我在 this tutorial 之后创建了以下自定义管理命令. from django.core.management.base import BaseCommand, CommandError f
我在一家拥有 2,500 多名员工和同样多的 Android 智能手机的非营利组织工作。 近年来,我们测试了许多 EMM 产品。尽管我们只需要一些非常基本的功能,除了一两个特殊功能,但没有一个能真正赢
我已经在我的网站上安装了 Google 标签管理器,但自从新版本的 Google 标签管理器以来,我无法使用预览选项。每次我点击它时,我都会看到我的网站页面打开,但随后出现以下错误:“Tag Assi
我是 django 的新手,并创建了一个与教程中描述的民意调查网站没有太大区别的应用程序。 在网站上我得到: Exception Type: TemplateSyntaxError Exception
https://cloud.google.com/deployment-manager/docs/configuration/templates/create-basic-template 我可以像这
我们正在使用 Microsoft 的发布管理将我们的 Web 应用程序部署到我们的测试环境 (QA)。它是一个直接的 MVC.Net Web 应用程序。我们的构建生成一个 web 部署包,我们有一个命
我想将 python manage.py 缩短为 ./manage.py。 这可能很简单,但我找不到答案。我在有关 django 的问题的答案之一中看到了一步一步的方法,但我没有记住。尝试在 stac
我想将 python manage.py 缩短为 ./manage.py。 这可能很简单,但我找不到答案。我在有关 django 的问题的答案之一中看到了一步一步的方法,但我没有记住。尝试在 stac
我正在使用安装了 SQL Server Data Tools 的 VS 2012。我有一个 ADO NET 源,它使用 .Net Providers\MySQL 数据提供程序,并试图将一些数据推送到
根据我从文档中阅读的内容 https://developer.android.com/topic/libraries/architecture/workmanager , 它说: The task i
这两个类显然是相关的。 SupportFragmentManager 是否用于使用 FragmentTransaction 生成的 Fragments,而“常规”FragmentManager 专门用
我有一个桌子经理(经理ID、姓名、地址、城市、电话)。如果多个经理来自同一城市,我必须显示城市、姓名和电话详细信息。我的代码是:。但这向我展示了第一行中的一个错误,即“不是按表达式分组”。请救救我!
我是一名优秀的程序员,十分优秀!