【问题标题】:Does the OS clean up vulkan resources after a crash?操作系统会在崩溃后清理 vulkan 资源吗?
【发布时间】:2019-06-06 03:14:59
【问题描述】:

我正在尝试创建 C++ 类来封装 Vulkan 初始化过程(在非常基础的层面上,我仍在学习),而我的设置方式需要将 vulkan 设备传递给显式“销毁”进行清理的功能。我将所有初始化都包含在 try-catch 块中;问题是如果在初始化期间抛出异常,对象将被销毁,我无法调用我的“销毁”函数。

在伪代码中:

try{
    DeviceObject device; // constructor initializes
    SomeResource resource(device);
    OtherResource other(device); // suppose an exception is thrown here

    while(programRuns){
        // do something
    }

    // end of program
    other.destroy(device);
    resource.destroy(device);
    device.destroy();
}
catch (myException e){
    showError(e);
}

在这种情况下,如果在运行时抛出异常,我的销毁函数不会被调用,它们只会在程序成功终止后被调用。

我已经想到了几种不同的设置方法来处理这种情况并确保明确清理资源,但我的问题是:我必须这样做吗?我知道我“应该”,但是如果程序崩溃并退出,操作系统会处理清理我创建的资源,还是会在系统 GPU(或类似的东西)上留下挂起的垃圾?

【问题讨论】:

    标签: vulkan resource-cleanup


    【解决方案1】:

    典型的操作系统(包括 Windows、Linux、Android 等)会在进程被销毁时清理进程的所有资源。这包括回收该进程专有的任何内存、关闭进程打开的文件和网络连接、减少共享资源的引用计数等。这包括破坏 GPU 上下文以及与之相关的任何内存或其他资源。所以不,当你的程序崩溃时,你不会因为不清理而泄漏系统资源。

    事实上,一些程序故意选择不清理干净/有意退出,因为操作系统通常比调用一堆应用程序终止代码更快。根据定义,代码不经常使用,因此甚至可能从未从磁盘中分页,并且它通常最终会做更多的工作,而不仅仅是释放操作系统级别的资源,例如为不拥有操作系统级资源的对象调用析构函数。

    在退出时优雅地清理(清理或崩溃)的主要原因是泄漏检测工具可以帮助您找到非终止泄漏。如果您泄露了所有内容,则有关您在终止前泄露的资源的报告(这可能表明有问题的泄露无限增长)往往会迷失在噪音中。

    【讨论】:

      【解决方案2】:

      根据基于进程的操作系统的定义,给定进程的所有资源在其终止时都会被释放。

      未捕获的异常只是进程终止的一种方式。您甚至无法捕捉到其他一些崩溃,例如堆栈溢出。因此,操作系统 必须 清除这个混乱。

      我还想补充一点,如果您在 C++ 中遵守 RAII 的例外情况,则应用程序本身会在堆栈展开期间正确销毁所有内容。

      【讨论】:

        猜你喜欢
        • 2011-10-07
        • 2010-11-06
        • 1970-01-01
        • 1970-01-01
        • 2018-09-28
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        相关资源
        最近更新 更多