(POSIX)操作系统是不是会在进程崩溃后恢复资源?

Posted

技术标签:

【中文标题】(POSIX)操作系统是不是会在进程崩溃后恢复资源?【英文标题】:Do (POSIX) Operating Systems recover resources after a process crashes?(POSIX)操作系统是否会在进程崩溃后恢复资源? 【发布时间】:2011-10-07 02:14:06 【问题描述】:

假设我们有一个进程分配一个监听特定端口的套接字,用它做一些事情然后异常终止。现在第二个进程启动并希望分配一个套接字,该套接字侦听先前由崩溃进程持有的同一端口。这个socket可以重新分配吗?

操作系统如何恢复未正确释放的资源?操作系统是否跟踪进程 ID 以及每个分配的资源?

我可以期望每个 POSIX 兼容系统都进行这种清理吗?

【问题讨论】:

@Jeff:“我可以期待每个 POSIX 兼容系统都进行这种清理工作吗?”为什么像这样的问题是题外话?对于程序员来说,了解我们需要在多大程度上确保正确释放资源是非常重要的。我目前正面临一个困难的 IPC 问题,所以这个问题并不是出于普遍的好奇。 (我会相应地编辑)。 我不认为清理与 POSIX 有任何关系。您可以期望这种自动清理会发生在每个值得实际使用的操作系统上。如果操作系统不这样做,应用程序的每次异常终止都会从系统中删除资源,并且由于资源永久(直到下次重新启动)消失,它会变得不可用。 @mah 你知道win98,不是吗? :-) 但你是对的,我当然也希望如此。 @Johannes Rudolph -- 我重申我的限定词“每个操作系统都值得真正使用”;)遗憾的是,我恐怕也记得 Windows ME... 【参考方案1】:

这取决于操作系统,但通常操作系统会维护一个进程控制结构,以管理其资源等。当一个进程从系统分配资源(例如打开文件或分配内存)时,分配的详细信息将放在该结构中。当进程终止时,其中的所有内容都会被清理 - 但最好在执行过程中明确清理。

【讨论】:

【参考方案2】:

具体细节取决于操作系统,但一般来说,用户代码在虚拟地址空间/沙盒中运行,它无法直接访问硬件资源。用户进程想要访问/分配的任何东西都必须通过调用操作系统并要求它提供所需的资源来提供。

因此,操作系统有一种简单的方法可以知道谁被分配了哪些资源,只要它跟踪这些信息,在进程崩溃时清理资源就像获取分配的资源列表一样简单到该进程,并再次将它们全部标记为可用。

【讨论】:

以上是关于(POSIX)操作系统是不是会在进程崩溃后恢复资源?的主要内容,如果未能解决你的问题,请参考以下文章

进程是不是会在退出时自动清理 pthreads 占用的资源

是啥导致应用程序在后台长时间运行后在恢复时崩溃?

电脑开机出现windows资源管理器已停止工作

当进程崩溃时,操作系统是不是会刷新 CPU 缓存?

OS之进程管理---多线程模型和线程库(POSIX PTread)

并发控制:进程通信之信号量