操作系统什么时候清除进程的内存

2024-05-13

进程在某些操作系统上成功或异常终止,操作系统何时决定擦除分配给该进程的内存(数据、代码等);在退出时或当它想为新进程分配内存时?

这个清除内存分配过程在所有操作系统(winXP、Win7、linux、Mac)上都相同吗?

据我了解,页表具有该进程的虚拟地址和内存中实际物理地址的映射。

Thanks.


操作系统回收进程资源的方式可能(通常)因操作系统而异。在 Windows 方面,NT 派生的操作系统的行为类似,因此 win XP 和 win7 之间应该没有什么区别。请注意,在这种情况下询问“内存”过于简单化,因为内存有不同类型。例如,典型的 Windows 应用程序将具有堆栈内存、堆内存(有时是多个堆)、指令/静态内存,或许还有共享内存。大部分内存由进程单独拥有,Windows 将在进程终止(甚至异常终止)时回收它。

然而,共享内存可以(并且经常)有多个所有者;它与一个窗户把手 https://stackoverflow.com/questions/902967/what-is-a-windows-handle(可以从多个进程引用的内核级对象)。句柄具有引用计数,如果引用计数变为零,则回收相关资源。这意味着共享内存的寿命可以比引用它的进程的寿命长。此外,进程也可能“泄漏”句柄,并且该句柄永远不会被回收。程序员有责任确保此类句柄正确关闭并且不会泄漏;非正常终止的可能性使这一责任变得复杂。

顺便说一句,当 Windows“回收”内存时,它仅仅意味着内存可用于将来分配给其他进程等。实际的 1 和 0 通常会保留在那里,直到操作系统分配内存and内存的新所有者主动覆盖它。因此,“回收”并不意味着内存立即清零或类似的意思;在这种情况下清理内存效率很低,而且通常是不必要的。如果您出于安全考虑而提出要求,则不应依赖操作系统;在进程将内存释放回操作系统之前,您需要自己清理内存。

如果您想了解更多关于现代 Windows 操作系统如何处理内存的信息,并且不介意进行一些挖掘,MSDN 上的 Windows API 文档有很多关于该主题的信息,但有点分散。好的起点可能是 Windows 句柄和加载/卸载库/进程调用。Windows 应用程序编程 (Richter) https://rads.stackoverflow.com/amzn/click/com/1572319968如果我没记错的话,可能有一些关于这方面的不错的信息,但我现在手头没有副本可供检查。

希望对 Linux 内部结构有更了解的人能够解决这一方面的问题。这是特定于操作系统的内容,因此可能存在差异。值得注意的是,NT 之前的 Windows(例如 Windows 95,98 等)具有完全不同的进程内存模型。这些差异往往会使操作系统在异常终止的情况下更难回收内存;一些用户发现,如果运行不稳定的应用程序,需要经常重新启动操作系统,以清理累积的内存泄漏。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操作系统什么时候清除进程的内存 的相关文章

  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • 更改 mingw' 启动目录或创建 mingw 符号链接

    设置 mingw 控制台启动目录的最简单方法是什么 我只使用 mingw 进行编译 但由于缺乏编辑器甚至符号链接 我很困惑如何告诉 mingw 控制台出现在不同的目录而不是常规的主目录中 如果有人知道如何像 cygwin 那样将 真正的 符
  • Ubuntu Python shebang 线不工作

    无法让 shebang 线在 Ubuntu 中为 python 脚本工作 我每次只收到命令未找到错误 test py usr bin env python print Ran which python usr bin python 在 sh
  • R foreach问题(某些进程返回NULL)

    我遇到了问题foreach我正在 R 中使用的程序的一部分 该程序用于运行不同参数的模拟 然后将结果返回到单个列表 然后用于生成报告 当并非所有分配的模拟运行都在报告上实际可见时 就会出现问题 从各方面来看 似乎只有分配的运行的一个子集实际
  • 用于验证 IIS 设置的 Powershell 脚本

    是否可以使用 Power Shell 脚本获取 IIS 设置 我希望使用脚本获取 检查以下信息 检查 Windows 身份验证提供程序是否正确列出 协商 NTLM 检查是否启用了 Windows 身份验证 Windows 身份验证高级设置
  • 如何在线程创建和退出时调用函数?

    include
  • Linux 使用 boost asio 拒绝套接字绑定权限

    我在绑定套接字时遇到问题 并且以用户身份运行程序时权限被拒绝 这行代码会产生错误 acceptor new boost asio ip tcp acceptor io boost asio ip tcp endpoint boost asi
  • 操作/Lambda 表达式内存管理问题

    我将一个操作存储在局部变量中 然后在该局部变量超出范围后使用 使用前是否有被清理的危险 这是一个例子 public List GetMaps Action
  • 如何解决内存碎片

    我们偶尔会遇到这样的问题 长时间运行的服务器进程 在 Windows Server 2003 上运行 由于内存分配失败而引发异常 我们怀疑这些分配由于内存碎片而失败 因此 我们一直在寻找一些可能对我们有帮助的替代内存分配机制 我希望有人能告
  • 如何在不使用 IDE 的情况下在 Linux 上运行 Java 项目

    我是 Java 新手 基本上 我开发了一个java项目 其中包含Eclipse中的多个Java包 该项目在我安装了 redhat Linux 的桌面上运行正常 然而 我需要在一个更强大的没有安装X11的Linux服务器 redhat ent
  • 调整巨大数组的大小

    我正在我的应用程序中处理巨大的数组 需要调整它们的大小 假设您有一个 2Gb 的阵列 并且想要将其大小调整为 3Gb 有没有办法在暂时不需要 5Gb 的情况下调整它的大小 例如 给定一个 1Gb 堆 使用 Xmx1G flag public
  • 如何才能将 TCP 连接返回到同一端口?

    机器是 RHEL 5 3 内核 2 6 18 有时我在 netstat 中注意到我的应用程序有连接 建立了 TCP 连接本地地址 and 国外地址是一样的 其他人也报告了同样的问题 症状与链接中描述的相同 客户端连接到本地运行的服务器的端口
  • 如何在Windows上分离“Git bash”中启动的“git gui”?

    例如 我开始 git bash 我导航到某个目录 I start git gui 我关闭控制台窗口或按 Ctrl C Git gui 的窗口消失了 即使我用过git gui disown 即使当我按 Ctrl C 时它不在前台 如何正确分离
  • 删除指向对象的 C++ 指针

    我认为删除命令会释放我分配的内存 有人可以解释为什么删除后我似乎仍然有内存在使用吗 class Test public int time int main Test e e new Test e gt time 1 cout lt lt e
  • python tracemalloc 模块分配统计信息何时会与 ps 或 pmap 中显示的内容不匹配?

    我正在尝试查找内存泄漏 所以我已经完成了 import tracemalloc tracemalloc start
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • 自定义波特率,redux

    我遇到的问题详述如下自定义波特率 https stackoverflow com questions 7714060 custom baud rate SetCommState 波特率 921600 失败 但波特率 115200 成功 尽管
  • Qt 支持 Windows 蓝牙 API 吗?

    谁能告诉我 Qt 是否支持 Windows 蓝牙 API 如果是这样 您能否分享一些有关如何使用它的信息 自上次答复以来 这个问题的答案发生了一些变化 Qt 5 2 版为 Linux BlueZ 和 BlackBerry 设备实现了蓝牙 A
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • 如何正确取消引用然后删除 JavaScript 对象?

    我想知道从内存中完全取消引用 JavaScript 对象的正确方法 确保删除时不会在内存中悬空 并且垃圾收集器会删除该对象 当我看这个问题时在 JavaScript 中删除对象 https stackoverflow com questio

随机推荐