1

这个问题是在 NVIDIA 面试中问我的

问)如果一个进程从无限时间运行并且操作系统完全失去了对它的控制,那么你将如何从该进程中释放资源?

4

1 回答 1

0

这是一个非常开放的问题,其答案取决于许多因素,例如操作系统的信号机制、实现的分叉等待退出、进程可以处于的状态……等等。您的答案应该在以下几行中。

一个进程可以处于以下状态之一:就绪、运行、等待......除此之外还有出生状态和终止/僵尸状态。在它的生命周期内,即从fork() 到exit() 之后,一个进程拥有系统资源在它的控制之下。例如:进程表中的条目、向 IO 设备打开的文件、分配的 VM、页表中的映射等...

操作系统已经失去了对进程的完全控制:我解释如下——

-----一个进程可以执行系统调用 Ex-read 并且操作系统会将进程置于睡眠/等待状态。有两种睡眠:INTERRUPTIBLE 和 UNINTERRUPTIBLE 读取完成后,硬件向操作系统发送一个信号,该信号将被重定向到睡眠进程。该过程将再次采取行动。也可能存在读取从未完成的情况,因此硬件从未发送信号。

假设进程启动了一次读取(这将失败)并转到:

中断睡眠: 现在该进程的操作系统/父进程可以向该进程发送 SIGSTOP、SIGKILL 等,它将从睡眠中中断,然后操作系统可以终止该进程以回收所有资源。这很好,解决了您无限资源控制的问题。

b UNINTERRUPTIBLE SLEEP: 现在即使读取没有发送任何信号,但正在花费无限时间,并且父/操作系统知道读取可能发送 SIGSTOP 失败,SIGKILL 无效,因为它正在休眠等待读取完成. 因此,现在该进程可以控制系统资源并且操作系统无法收回它。请参阅内容以清楚了解 UNITERRUPTIBLE SLEEP。因此,如果一个进程在无限时间处于这种状态,操作系统或父进程不能杀死/停止它并回收资源,这些资源会无限期地绑定,只有在系统关闭时才能回收,或者您需要破解服务被触发的驱动程序并由驱动程序终止,然后驱动程序将读取失败信号发送到不间断进程。

-----在进程完成执行并准备死亡后,创建该进程的父进程尚未调用该子进程的等待,进程处于 ZOMBIE 状态,在这种情况下,它仍然挂在一些系统资源上. 通常,父母的工作是确保它创建的孩子正常终止。但是,可能是这样的情况,应该调用这个孩子的等待自己的父母被杀死了,然后终止这个孩子的责任归于操作系统,这正是 init 进程在像操作系统这样的 UNIX 上所做的事情。除了它的其他工作之外,init 还充当父已死的进程的养父。它不时地运行 check_ZOMBIE 程序(当系统资源不足时)以确保 ZOMBIES 不会挂在系统资源上。

来自维基百科文章:当一个进程失去它的父进程时,init 成为它的新父进程。Init 定期执行等待系统调用以获取任何以 init 作为父级的僵尸。init 的职责之一是收割孤儿和无父母的僵尸。

所以你的答案应该指向进程状态的定义方式、信号处理机制的实现方式以及 init 进程获取 ZOMBIES 等的方式......

希望它能清除一两件事..

干杯....

于 2013-08-28T07:15:34.407 回答