我刚开始学习fork并在Linux中等待,并在wait()手册页注释中遇到了这一段:
终止但尚未等待的孩子成为“僵尸”。内核维护有关僵尸进程(PID,终止状态,资源使用信息)的最小信息集,以便允许父进程稍后执行等待以获得关于子进程的信息。只要没有通过等待从系统中删除僵尸,它就会占用内核进程表中的一个插槽,如果该表填充,则无法创建进一步的进程。如果父进程终止,则它的“僵尸”子进程(如果有的话)被init(8)采用,它会自动执行等待删除僵尸。
阅读此内容后想到的一个问题:
不是使用wait()会导致资源浪费,直到父终止,这个问题会在父进程被认为是系统中长期存在的进程时放大吗? 这是否意味着我应该在使用fork之后尽快使用wait()?
答案 0 :(得分:2)
不使用wait()的事实不会导致资源浪费 父母会终止吗?
当子进程正在运行时,没有资源的浪费;它仍在完成任务。您的引文所涉及的资源浪费仅在孩子死亡但父母尚未收到的情况下,即未对子流程进行wait()
。
当父进程意味着长时间时放大的问题 在系统中过程?
当您的应用程序运行很长时间并且不断分配子项时,当许多子进程仍在运行或父进程没有收到已退出的子进程时,系统可能会耗尽资源。应用程序流程的工作是尽可能快地管理系统上的资源并尽快收获子流程。
这是否意味着我应该尽快使用wait() 用fork?
没有直接的“早期”或“迟到”的答案。例如,父进程可能希望在子进程仍在运行而不是等待时继续执行有用的操作(当父进程知道子进程可能执行长任务时,甚至可能无需定期检查子进程是否为WNOHANG
状态完成)。所以在这种情况下,等待一个进程可能不是你想要的。通常,父母应该在期望孩子完成其任务(或想要知道孩子的stauts)时调用wait()
。程序员需要正确编码并在最合适的时间调用wait()
。