【问题标题】:What exactly happens when my process is killed?当我的进程被杀死时究竟会发生什么?
【发布时间】:2009-10-17 17:12:58
【问题描述】:

我有一个包含本机代码和托管代码的混合进程,在 Windows server 2003 上运行。

当我从进程资源管理器中终止我的进程时,它会进入 100% cpu 的状态并在此状态下保持一段时间(有时甚至 10 分钟),然后才会消失。在此期间,我不能“杀死”它或做任何其他事情。

当我通过进程资源管理器的终止通过进程终止进程时,进程会发生什么情况? 我相信这不会调用任何析构函数,那么是什么导致了这种 cpu 使用率?

谢谢, 丹

【问题讨论】:

  • 他说Windows server 2003
  • 抱歉,错过了,谢谢。您是否使用其他工具(例如资源工具包中的 kill.exe、带有 /F 选项的 taskkill.exe 或 pskill.exe)获得相同的行为?
  • 澄清一下,当你优雅地退出程序时,它不会表现出同样的高 CPU 行为?
  • 感谢所有 cmets 和想法。使用所有各种 kill/exit 方法,我确实得到了相同的行为。使用 Process Explorer 在我终止进程后,我无法显示线程堆栈。 100% CPU 时间是内核时间,所以我认为资源释放是一个很好的起点。当我弄清楚这一点时,我会发表另一条评论。

标签: .net c++ windows


【解决方案1】:

很明显,有些东西试图继续运行,这导致了您看到的挂起/死锁情况。我可以尝试解释如何使用一些工具来尝试找出正在发生的事情,但我可能应该把你交给大师......Tess - Lab on High CPU Hang

我能够使用她描述的方法来找出我自己的应用程序的问题。

【讨论】:

    【解决方案2】:

    改为使用任务管理器的结束进程(在进程选项卡上)尝试,如果您在任务管理器或 Winternal 的进程资源管理器上选择终止进程树,请尝试是否有区别,但我怀疑它会有所帮助。

    该进程应该(几乎)立即被终止,但是,有一些偷偷摸摸的方法可以留下来。如果您编写了自己的应用程序,我认为情况并非如此。其他进程更有可能不喜欢你的被带走。将进程监视器设置为快速刷新速度并对 cpu 列进行排序。您现在应该看到导致 100% 问题的进程。最有可能:系统。

    如果您使用大量内存,尤其是。当它总体上超过物理内存时,系统将重新组织(即,将内存从磁盘移回物理内存)。当我在打开 500 多个选项卡并占用 1.5GB 内存后杀死 Firefox 时,会发生类似的行为(直到冻结我的系统)。这种行为(缓慢地重新组织内存)在 Microsoft Windows 的更高版本中得到了改善。

    更新: 内部,proc expl。调用 TerminateProcess (以及其他),它强制关闭所有句柄和线程。 MSDN API ref“TerminateProcess 启动终止并立即返回。这将停止进程内所有线程的执行并请求取消所有挂起的 I/O。在所有挂起的 I/O 完成之前,终止的进程无法退出或取消。”。这意味着:您的 I/O 可以阻塞这个进程(虽然我想知道它如何使您的进程达到 100%,但 I/O 通常不会这样做)。

    【讨论】:

    • 我确定是我的进程占用了 100% cpu,而不是其他进程。内存重组。听起来很有趣 - 我会调查一下。谢谢
    【解决方案3】:

    如果您有多个线程或其他未释放的资源,那么它可能会尝试在应用程序被终止之前等待所有内容都被释放。

    当您的应用程序被终止时,理想情况下,所有使用的资源都将被释放,但这就是为什么您应该确保实现 IDispose 接口以帮助解决此问题,否则您可能会发现某些文件已打开无法重新打开,您唯一的选择是重新启动。

    当您尝试杀死其他应用程序时,是否会发生这种情况,或者只杀死这个应用程序?

    你可能想简化你的程序,或者在它使用太多资源之前尝试杀死它,看看你是否可以确定你会在什么时候遇到这个问题,然后你可能会更好地了解你做了什么导致此行为。

    【讨论】:

    • 如果应用程序以这种方式被杀死,IDisposable 对象将不再被调用,所有资源(对象句柄)都将被强制关闭。
    【解决方案4】:

    你能看看 Process Explorer 中的线程吗?查看正在运行的内容,尤其是占用 100% CPU 的内容。看看能不能找到调用栈,隔离具体的线程甚至函数。如果可以,请在此处发布答案!

    【讨论】:

    • 进程资源管理器在我杀死进程后无法获取线程的堆栈。
    【解决方案5】:

    我的心理调试器是您仍然分配了很多资源(即文件/注册句柄、win32k 对象等)并且内核正在清理它们。使用Process Explorer破解app时,资源使用率看起来高吗?

    【讨论】:

    • 资源使用情况看起来很正常,但看起来我缺少一些东西。内存、句柄、线程,一切看起来都还不错。我应该寻找其他任何资源吗?
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 2019-08-10
    • 2011-01-18
    • 2023-03-29
    • 2010-12-02
    • 2014-05-09
    相关资源
    最近更新 更多