为什么被强制结束的进程还在任务管理器里?

为什么被强制结束的进程还在任务管理器里?

作者:BlogUpdater |  时间:2021-08-11 |  浏览:1173 |  评论已关闭 条评论

当一个进程结束运行(可能是正常结束,或者被TerminateProcess强制结束),这个进程的用户模式部分将会被彻底销毁并被系统回收。
但是来了。
但是,其内核模式部分不会简单地被清理,而是会等到线程中所有的驱动代码结束运行。

举个例子
如果进程中的某个线程正在进行I/O操作,内核向负责I/O的驱动程序发出信号,表明应该取消操作。
如果这个驱动代码被正确地实现,则它将清理所有未完成的I/O操作并释放线程。
如果它没有被正确的实现,或者正在被操作的硬件没那么快完成操作,则就会需要一段比较长的时间来完成整个取消动作。

在这段时间里,线程是否能结束运行,完全由驱动代码决定,因为线程属于进程,也即进程是否结束运行,完全由驱动决定。如果你觉得这个问题可能是因为驱动造成的,你可以使用内核调试器,找到被挂起的进程并从中确定没有正常退出的线程。

具体来说,就是使用调试命令 [!irp] 来查看所有挂起的IRP,从而确定是哪个设备没有完成指定的控制动作。当进程中的所有驱动代码都完成其工作之后,整个进程才会完全结束它的运行。

剩下的,就是进程对象了。进程对象会一直保留在系统中,直至所有引用它的进程句柄全部关闭且进程中的所有线程全部结束运行为止。你应该还记得,当调用CreateProcess之后,一定要调用CloseHandle关闭PROCESS_INFORMATION结构体中的进程句柄吧?

换句话说,如果一个进程被强制结束后还是处于挂起状态,则表明:这个进程确实是”死了”,只是因为系统在等待所有相关的驱动代码完成清理,和所有打开的进程句柄被关闭。

总结
进程是一个很好的概念,为了实现这个概念且同时以一种简单容易理解的方式呈现给开发者,操作系统实现者需要精心设计各种数据结构,的确不容易。

最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Why do some process stay in Task Manager after they’ve been killed?》

最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

标签:

评论已关闭。