【发布时间】:2014-05-09 15:33:53
【问题描述】:
有一个程序可以进行各种系统调用,有的做 IO,有的不做;让我们举几个例子:
- gettimeofday
- 分叉
- 写
- 阅读
- ioctl
当一个进程在执行系统调用时被杀死 (SIGKILL) 时,操作系统内核 (Linux 2+/FreeBSD7+/OSX) 会发生什么?特别是:当进程即将终止时,是否每个系统调用都知道如何自行清理?
【问题讨论】:
标签: linux unix process kernel system-calls
有一个程序可以进行各种系统调用,有的做 IO,有的不做;让我们举几个例子:
当一个进程在执行系统调用时被杀死 (SIGKILL) 时,操作系统内核 (Linux 2+/FreeBSD7+/OSX) 会发生什么?特别是:当进程即将终止时,是否每个系统调用都知道如何自行清理?
【问题讨论】:
标签: linux unix process kernel system-calls
当操作系统内核 (Linux 2+/FreeBSD7+/OSX) 发生什么情况时 进程在执行系统时被杀死(SIGKILL) 打电话?
进程在内核模式的上下文中执行系统调用。此时,如果内核收到任何中断(信号来自软件中断),它将检查该特定中断的优先级。软件中断在所有类型的中断中优先级最低,因此它会继续执行,直到完成关键路径执行。此时内核将存储其上下文并确定中断的原因和优先级并为中断服务(在这种情况下是终止/终止程序)。
但是这些概念有点复杂,并且可能在不同的系统上有所不同。您可能想参考 Maurice J Bach 的伟大著作《UNIX 操作系统的设计》,其中详细描述了这些概念和实现。
特别是:是否每个系统调用都知道如何清理 当进程即将终止时自身?
是的,因为系统调用代表进程在内核模式的上下文中执行。 因此,当进程开始中止/终止时,他们总是有清理的逻辑。如果用户模式程序由于意外原因终止,内核确保它清理该特定进程的所有资源。这就是内核的伟大之处。
【讨论】: