在 Windows 8.1 中,有没有办法确保进程在 RAM 用完时不是第一个被杀死的进程?

Kal*_*Kal 18 windows memory-management windows-8.1

我编写了一个 .NET 4.5 应用程序,它缓冲来自 Kinect v2 的颜色、红外线和深度数据,对其进行一些处理,然后以未压缩的形式将其转储到磁盘;.NET 应用程序还将 ffmpeg 作为子进程启动,并将颜色数据通过管道传输到它以编码为 H.264。

因为我没有使用 SSD,所以视频数据到达的速度比我写入磁盘的速度要快。但是没关系,当我的 RAM 不足时丢弃视频帧对我来说是可以接受的。我唯一的要求是我保留的大部分内容都是连续的 8 到 10 秒的视频块。因此,当我没有足够的 RAM 来缓冲连续 8 到 10 秒的视频(大约 1.5 到 2 GB)时,我在我的 .NET 4.5 应用程序中添加了一些逻辑来开始丢弃视频帧。

而且,为了防止页面抖动,我已经完全禁用了分页文件。这给我留下了总共 16 GB 的物理 RAM。

我的问题是,即使有了这种机制,有时我的 .NET 应用程序或 ffmpeg 子进程仍然会在 Windows 8.1 因内存不足而惊慌失措时被杀死,因为显然我的应用程序在有大量视频数据积压时使用了最多的内存写入磁盘。有没有办法告诉 Windows 我的进程比其他进程更重要,以便 Windows 首先开始杀死其他不太重要的进程?

Daw*_*ton 45

使用所有 RAM 时,Windows 不会终止进程。实际发生的是进程无法分配内存并崩溃。

发生这种情况是因为所有物理内存都在使用中,并且由于页面文件被禁用,内存管理器不再能够写入未使用的页面。这会使您的物理 RAM 保持满载,并且当您的进程或当时正在运行的任何其他程序尝试分配页面时,它会失败。一些应用程序崩溃。

Technet 的此演示文稿解释了:http : //channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405

当您利用所有内存时,页面文件通过充当过度承诺的支持来防止应用程序崩溃。

虚拟内存几乎是现代操作系统如何分配资源的基础,所以这一切都是关于在 RAM 中使用正在使用的东西,以及从磁盘移入和移出的东西。

其实只有两个答案:

  1. 重新启用页面文件并增加计算机上的 RAM 以减少磁盘抖动。
  2. 降低应用程序的内存需求。

最重要的是,RAM 只是另一级缓存,所有关于虚拟内存、页面文件、内存映射文件的内容,基本上都归结为:如果内存不足,则需要添加更多的。

  • 听起来您需要在应用程序中进行显式内存管理,然后... (9认同)
  • 或者少用.... (4认同)
  • 实际上,页面文件将位于磁盘上的其他位置。由于我们知道它不是 SSD,这意味着物理查找是最慢的磁盘操作。 (3认同)