日期:2014-05-17  浏览次数:20802 次

进程创建的WINDOWS的内核对象在进程结束时一定会被自动删除吗?
我看《windows核心编程》的时候,看到 上面说 当进程终止允许,系统能保证一切都被正确清除。
但是当进程终止时,对内核对象不仅仅是进行使用计数减一的操作吗?如果因为在程序中使用内核对象,导致进程终止,内核对象使用计数减一后,使用计数依然大于0,该内核对象还会被清除吗?
如何理解书上的这一句话呢?

------解决方案--------------------
进程确实没有机会执行自己的清除操作,但是操作系统可以在进程之后进行全面的清除,使得所有操作系统资源都不会保留下来。这意味着进程使用的所有内存均被释放,所有打开的文件全部关闭,所有内核对象的使用计数均被递减,同时所有的用户对象和GDI对象均被撤消。

       ----摘自Windows核心编程 第四版 4.3.3
------解决方案--------------------
《Windows编程启示录》
19.6 为什么有些进程在被终止之后还停留在任务管理器中
    当某个进程结束时(可能是正常结束,也可能是因为调用了像TerminateProcess之类的函数),这个进程的用户态模块将被删除。但内核态模块只有在与线程相关的所有驱动程序执行完成之后才会被删除。
    例如,如果某个线程正处于I/O操作中,那么将会给负责I/O的驱动程序发送一个内核信号来取消这个操作。
    如果驱动程序的行为是良好的,那么它将清除与这个未完成I/O相关的一些信息并且释放线程。
    如果驱动程序的行为是不好的(可能是因为驱动程序管理的硬件表现出奇怪的行为),那么可能需要花很长的时间来清除这个未完成的I/O。在这段时间里,驱动程序将不会释放这个线程(以及这个线程所在的进程)。实际的情况要更复杂一些,但这里的简单模型对于我们的讨论已经足够。
   ……
   换句话说,如果你终止了某个进程后还能在任务管理器中看到这个进程,那么实际上这个进程已经停止运行了,只不过还有些残留的信息保留在系统中,只有当与这个进程相关的所有驱动程序都完成了清除操作并且指向这个进程的句柄都已经关闭,进程才会完全消失。