【发布时间】:2015-02-05 11:08:41
【问题描述】:
我知道清理是一件好事。我也了解操作系统内部,所以如果我知道我的进程正在终止,那么它的内存将被释放。但我喜欢提出不同的观点。我在线上,在退出时释放内存是相当糟糕的主意。
例如我可能分配了当前已换出的大内存,如果我在退出时将其释放,则需要将其带到 RAM 中,然后释放它。如果我不这样做,退出时它只会在一张表中被标记为空闲。
总体而言,操作系统发生了很大变化(基本保持不变),我理解这个问题可以被认为是 A_VERY_PLATFORM_DEPENDENT,但从今天的应用程序开发人员的角度来看,他要么陷入(?)某些框架,要么是胆大妄为正在研究 COM 等原始技术的 coder 非常依赖,我称之为 VERY_CONTROLLED_ENVIRONMENT。
对于TL;DR:在现代操作系统上,我认为我不应该在退出时执行清理。如果你认为我错了,为什么?
PS:我不是在谈论 RTOS,我的意思是受控环境是指 Windows、Linux,我从来没有指设备驱动程序开发或操作系统开发。
【问题讨论】:
-
我怀疑应用程序
free和 SOfree之间存在差异(关于需要将页面从 SWAP 带入 RAM) -
这是几周前讨论过的。我会找到并标记这个副本。
-
非内存资源如文件句柄、内核句柄等呢?如果你不清理基于内存的资源,你怎么能确定它们没有持有“外部”句柄?
-
我想说 cleanup 应该更多地从资源角度来看,例如db 服务器会话、独占本地文件锁等,而不仅仅是 释放 内存(当然,任何合理的操作系统都应该从退出的进程中重新获得内存)。
-
试图在用户代码中复制操作系统功能,在没有充分理由的情况下,只是愚蠢的。要无故障关闭应用程序,必须在释放内存等资源之前停止所有线程。操作系统可以轻松做到这一点。用户代码不能总是这样做,(例如,它不能安全地直接停止在另一个内核上运行的线程,而不是请求终止的线程),即使可以,它也是额外的代码、测试和调试来复制已经存在的功能和已经过测试。如果没有不良后果,就终止。东西 valgrind。
标签: c++ operating-system resource-cleanup application-layer