在NVIDIA采访中向我询问了这个问题
Q)如果一个进程是从无限时间和O.S.运行的。已完全失去对它的控制,那么你将如何从该过程中释放资源?
答案 0 :(得分:0)
这是一个非常开放的问题,其答案取决于许多因素,如操作系统的信号机制,实现fork等待退出,进程可以等的状态等等。你的答案应该是以下几行。
一个过程可以处于以下状态中的一个:准备好,正在运行,等待......除此之外还有生来状态和终止/僵尸状态。在其生命周期中,即在fork()到exit()之后,进程在其控制下具有系统资源。例如:进程表中的条目,打开IO设备的文件,分配的VM,页表中的映射等......
操作系统已失去对流程的完全控制:我解释如下 -
----- 进程可以执行系统调用Ex-read,操作系统会将进程置于休眠/等待状态。睡眠有两种: INTERRUPTIBLE& UNINTERRUPTIBLE 强> 读取完成后,硬件会向操作系统发送一个信号,该信号将被重定向到休眠进程。这个过程将再次出现。可能还存在从未完成读取的情况,因此硬件从未发送信号。
假设进程启动了读取(将失败)并转到:
一个可中断的休眠:现在这个进程的OS /父进程可以向这个进程发送一个SIGSTOP,SIGKILL等,它会从睡眠状态中断,然后操作系统可以终止进程回收所有进程资源。这很好,解决了无限资源控制的问题。
b UNINTERRUPTIBLE SLEEP:现在即使读取没有发送任何信号,但是花费了无限时间,并且父/ OS知道读取失败可能发送SIGSTOP,SIGKILL也没有效果因为正在睡觉UNITERRUPTIBLY等待阅读完成。所以现在这个过程控制着系统资源,操作系统无法回复。有关UNITERRUPTIBLE SLEEP的清楚了解,请参阅this。因此,如果进程在无限时间内处于此状态,则操作系统或父不能终止/停止它并回收资源,这些资源将无限期地绑定,并且只有在系统< strong>关闭电源,或者你需要破解服务器所在的驱动程序并由驱动程序终止它,然后驱动程序将读取失败的信号发送到UNINTERRUPTIBLE PROCESS。
----- 在进程完成执行并准备好死后,创建此进程的父进程尚未调用wait对此子进程处于ZOMBIE状态,其中它仍然挂在一些系统资源上。通常,父项的工作是确保它创建的子项正常终止。但是,可能是这样一种情况,那个应该对这个孩子本身调用等待的父亲被杀了,然后终止这个孩子的责任转到操作系统,这正是UNIX进程在UNIX上做的操作。除了其他工作之外,init就像父母已经死亡的过程中的养父母一样。它不时地运行check_ZOMBIE过程(当系统资源很低时),以确保ZOMBIES不会挂起系统资源。
来自wikipedia article:当进程丢失其父进程时,init将成为其新父进程。 Init定期执行等待系统调用,以使用init作为父级来获取任何僵尸。 init的职责之一就是收获孤儿和无父的僵尸。
所以你的答案应该指向过程状态的定义方式,信号处理机制的实现方式以及init过程获得ZOMBIES等的方式....
希望它清除了一两件事......
...干杯