问题标签 [page-fault]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
memory-mapped-files - 内存映射文件和“软”页面错误。不可避免?
我有两个在 Windows XP 下运行的应用程序(进程),它们通过内存映射文件共享数据。尽管我尽一切努力消除每次迭代的内存分配,但每次数据传输我仍然会遇到大约 10 个软页面错误。我已经尝试了 CreateFileMapping() 和 CreateFileView() 中的每个标志,它仍然会发生。我开始怀疑这是否只是内存映射文件的工作方式。
如果有人知道内存映射文件背后的 O/S 实现细节,我将不胜感激对以下理论的评论:如果两个进程共享一个内存映射文件并且一个进程写入它而另一个进程读取它,那么 O/S 标记页面写入无效。当另一个进程去读取现在属于无效页面的内存区域时,这会导致软页面错误(通过设计),并且 O/S 知道重新加载无效页面。此外,软页面错误的数量因此与数据写入的大小成正比。
我的实验似乎证实了上述理论。当我共享数据时,我会写入一个连续的数据块。换句话说,每次都会覆盖整个共享内存区域。如果我使块更大,软页面错误的数量会相应增加。因此,如果我的理论是正确的,那么除了不使用内存映射文件之外,我无法消除软页面错误,因为它们就是这样工作的(使用软页面错误来保持页面一致性)。具有讽刺意味的是,我选择使用内存映射文件而不是 TCP 套接字连接,因为我认为它会更有效。
注意,如果软页面错误是无害的,请注意。我听说在某些时候如果数量过多,系统的性能可能会受到损害。如果软页面错误本质上并没有太大的危害,那么如果有人对每秒多少个“过多”有任何指导方针,我想听听。
谢谢。
virtual-memory - 当页面从磁盘出现故障时,哪个(OS X)dtrace 探针会触发?
我正在写一个关于页面错误的文档并试图获得一些具体的数字来使用,所以我编写了一个简单的程序来读取 12*1024*1024 字节的数据。简单的:
所以是的,它会遍历并读取整个文件。问题是我需要在此过程中将触发 1536 次的 dtrace 探针(12M/8k)。即使我计算了所有 fbt:mach_kernel:vm_fault*: 探测器和所有 vminfo::: 探测器,我也没有达到 500,所以我知道我没有找到正确的探测器。
任何人都知道我在哪里可以找到当页面从磁盘出现故障时触发的 dtrace 探测器?
更新:
如果问题在于 stdio 函数中正在进行一些智能预取,我尝试了以下操作:
这个版本需要更长的时间来运行(42 秒实时,其中 10 秒是用户时间,其余是系统时间 - 我猜是页面错误),但仍然会产生五分之一的错误,正如我预期的那样。
出于好奇,时间增加并不是由于循环开销和强制转换(char 到 int)。执行这些操作的代码版本需要 0.07 秒。
arrays - 两个数组中的页面错误计数?
家庭作业:
考虑二维数组 A:
其中 A[0][0] 位于页面大小为 500 的分页内存系统中的位置 500(有点不切实际——不是 512)。一个操作矩阵的小进程位于页面 0(位置 0 到 499)中。因此,每条指令都将来自当前存储在第 0 页中的一条指令。
假设只有五个页框,包括第 0 页,以下数组初始化循环产生了多少页错误,使用 LRU 替换并假设页框 0 包含进程,而其他四个最初为空?
A)for (int j = 0; j < 200; j++) for (int i = 0; i < 200; i++) A[i][j] = 0;
B)for (int i = 0; i < 200; i++) for (int j = 0; j < 200; j++) A[i][j] = 0;
问题:
我从哪里开始解决这个问题?我已经阅读了我的文字,但没有发现其中的大部分内容有用。我扔了一些数字,我发现:
40,000 = 数组项的总数
80 (40k/500) = 总页数
A) 20,000 (80*250) 因为每隔一个循环都会导致页面错误?
B) 80(每页一个,40,000/500 = 80)?
我在正确的轨道上吗?有什么建议吗?提示?
linux - 引发缺页异常时,操作系统如何定位磁盘上尚未加载到内存中的内容?
当由于 CPU 试图访问的内容尚未加载到内存中而引发页面错误异常时,操作系统如何在辅助存储(例如硬盘)上定位丢失的内容?
提前感谢您的解释。
-伊万
delphi - 4000 万个页面错误。如何解决这个问题?
我有一个应用程序,它从磁盘中的单个对象加载 170 个文件(假设它们是文本文件)并一直保存在内存中。当我从磁盘加载这些文件时,内存被分配一次。因此,不涉及内存碎片。我还使用 FastMM 来确保我的应用程序永远不会泄漏内存。
该应用程序将所有这些文件相互比较以找到相似之处。过度简化我们可以说我们比较文本字符串,但算法要复杂得多,因为我必须允许字符串之间存在一些差异。每个文件大约 300KB。加载到内存(保存它的对象)中需要大约 0.4MB 的 RAM。因此,正在运行的应用程序需要大约 60MB 或 RAM(工作集)。它处理数据大约 15 分钟。问题是它会产生超过 4000 万个页面错误。
为什么?我有大约 2GB 的可用 RAM。据我所知,页面错误很慢。他们在多大程度上减慢了我的程序?如何优化程序以减少这些页面错误?我想这与数据局部性有关。有人知道这个(Delphi)的一些示例算法吗?
更新:
但是看看页面错误的数量(任务管理器中没有其他应用程序接近我,甚至到目前为止)我想如果我设法优化内存布局(减少页面错误)我可以提高我的应用程序的速度)。
Delphi 7,Win 7 32 位,RAM 4GB(3GB 可见,2GB 免费)。
c++ - 识别主要页面错误原因
我被要求查看一个用 C++ 编写并在 Linux 上运行的内部应用程序,这有一些困难。周期性地它会有大量的主要页面错误(~200k),这会导致挂钟运行时间增加 x10+,然后在某些运行中它将没有。
我已经尝试隔离不同的代码片段,但在测试它时很难重复页面错误错误。
有没有人对从应用程序/Linux 中获取更多关于主要页面错误的信息有任何建议?我所拥有的只是一个总数。
performance - 如何判断进程页面错误的数量何时会影响性能?
对于进程生成的页面错误数,有一个 Windows 性能计数器。是否存在影响性能的经验法则阈值?
operating-system - 无法理解 Belady 的异常情况
所以 Belady's Anomaly 指出,当使用 FIFO 页面替换策略时,当添加更多页面空间时,我们会遇到更多页面错误。
我的直觉告诉我们,我们应该减少或最多增加相同数量的页面错误,因为我们增加了更多的页面空间。
如果我们将 FIFO 队列视为管道,则添加更多页面空间就像使管道变得更大:
那么,为什么你会得到更多的页面错误呢?我的直觉是,使用更长的管道,您需要更长的时间才能开始出现页面错误(因此,使用无限管道,您将没有页面错误),然后您会遇到同样多的页面错误,就像通常与较小的管道一样。
我的推理有什么问题?
c - 了解分页虚拟内存的第一步:在初始页面错误时创建页表条目
我想了解虚拟内存分页。我有以下代码片段,代表该过程的第一步。这里search_tbl
从主程序调用每个逻辑地址,以检查页表是否已经有一个条目,该条目将提供的逻辑地址映射到物理内存中的某个位置。vfn
是虚拟帧号。
编辑: 这个实现有什么意义吗?还是我走错了路?
任何帮助/建议将不胜感激。谢谢你。
java - Java JVM 保持针对操作系统的内存分配
我在 Windows 7 64 位上运行 1.6.0_25 64 位。
我试图让 JVM 以最大内存运行,因为我的应用程序非常占用内存......但遗憾的是......内存分配没有建立,并且有很多来自 Windows 的页面错误继续带来下一组中的虚拟内存。
我正在运行 java -Xms2G -Xmx3G 测试
以下代码是我尝试将整个文件带入......这样我就不会遇到页面错误来读取。
这样做我可以看到,在 Windows 任务管理器中,系统在读取文件时达到了 2G 的内存......但是一旦完成读取......内存又回落了!!!!
这是一个主要问题......我需要整个字节数组留在活动内存中。
谢谢你,哎
我修改了代码以使用基本数组类型 int[][] 和 float[][] 来保存我的数据,而不是保留包含 int 和 float 的对象的 ArrayLists。
这样做,我发现我的 java 内存没有被交换(所以,我猜堆内存的处理方式与这里的堆栈有点不同)[哦,我确实将所有代码也更改为静态类型 - 我知道,非常糟糕编程风格]
我现在遇到的问题是如何处理我的 HashMap ......我尝试构建查找表的所有尝试都以 O(n^2) 运行时间来构建失败!!!