我有一个使用本机代码和托管代码的混合进程,在Windows Server 2003上运行。
当我从进程资源管理器中杀死我的进程时,它会进入100%cpu的状态并在离开之前保持一段时间(有时甚至是10分钟)。在此期间,我无法“杀死”它或做任何其他事情。
当我通过进程资源管理器的kill杀死进程时,进程会发生什么特别的事情? 我相信这不会调用任何析构函数,那么可能导致这种cpu使用的原因是什么?
谢谢, 丹
答案 0 :(得分:1)
尝试使用任务管理器的结束进程(在进程选项卡上),并尝试在任务管理器或Winternal的进程资源管理器上选择杀死进程树是否有区别,但我怀疑它会有所帮助。
这个过程应该被(几乎)立即杀死,然而,有一些偷偷摸摸的方法可以坚持下去。如果您编写了自己的应用程序,我认为情况并非如此。其他过程很可能不喜欢你被带走。以快速刷新速度设置Process Monitor并对cpu列进行排序。您现在应该看到哪个进程导致100%问题。最有可能的是:系统。
如果您使用大量内存,尤其是当它总体上超过物理内存时,系统将重新组织(即,将内存从磁盘移回物理内存)。当我在打开500多个标签后占用1.5GB内存时杀死Firefox时,会发生类似的行为(直到冻结我的系统)。使用更高版本的Microsoft Windows时,此行为(缓慢重新组织内存)已得到改进。
在内部,更新:,proc探索。调用TerminateProcess(以及其他),强制关闭所有句柄和线程。 MSDN API ref表示“TerminateProcess启动终止并立即返回。这将停止执行进程中的所有线程并请求取消所有挂起的I / O.终止的进程无法退出,直到所有挂起的I / O都被执行完成或取消。“。这意味着:你的I / O可以阻止这个过程(虽然我想知道它如何将你的过程变为100%,I / O通常不会这样做)。
答案 1 :(得分:1)
显然有些东西正在尝试继续运行,这会导致您看到的挂起/死锁情况。我可以尝试解释如何使用一些工具来尝试找出正在发生的事情,但我可能只是将你推迟到主人...... Tess - Lab on High CPU Hang
我能够使用她描述的方法找出我自己的应用程序的问题。
答案 2 :(得分:0)
如果您有多个线程或其他未释放的资源,那么它可能会在应用程序被杀之前等待释放所有内容。
当您的应用程序被终止时,理想情况下应该释放所有使用的资源,但这就是为什么您应该确保实现IDispose接口,以帮助解决这个问题,否则您可能会发现某些文件是打开的无法重新打开,您唯一的选择是重新启动。
当您尝试杀死其他应用程序时,是否会发生这种情况?或者只是这个?
你可能想要简化你的程序,或者在它使用太多资源之前尝试杀死它,看看你是否可以确定你将在什么时候遇到这个问题,然后你可能更清楚你做了什么导致这种行为。
答案 3 :(得分:0)
你能看看Process Explorer中的线程吗?查看正在运行的内容,尤其是占用100%CPU的内容。看看你是否能找到调用堆栈并隔离特定的线程甚至功能。如果可以的话,在这里发布答案!
答案 4 :(得分:0)
我的通灵调试器是你仍然分配了很多资源(即文件/ reg句柄,win32k对象等),内核正在清理它们。当您使用Process Explorer破解应用程序时,资源使用率是否很高?