2

有谁熟悉os/161可以帮我回答几个问题吗?

子 pid,父 pid 究竟是如何工作的。

我知道,当您调用时,thread_fork()您正在基于当前线程创建另一个线程,新线程应该具有自己的唯一 ID 和不同的文件描述符表。在从 中sys_fork创建一个孩子时curthread,除了pid之外,孩子与父母相同。但我对 pid 和父 pid 的工作方式感到困惑。

这是我对进程表的解释。整个系统只有一个进程表。现在我有parent_pid每个my_pid线程。
- 一个父线程可以有多个子线程(通过不断调用sys_fork)。
-一个孩子只能有一个父母。
- 每当sys_fork被调用时,都会创建一个孩子,并将parent_pid这个孩子的 pid 设置为创建这个孩子的线程的 pid。
-pid of 1 用于引导/菜单线程。

在理解进程表的工作原理方面,我是否走在正确的轨道上?

最后一个问题:对于sys_waitpid():只有父母可以使用waitpid?他们只能等待他们的孩子吗?孩子可以waitpid在父母身上使用(或者这会导致死锁)吗?

我一直在用谷歌搜索,但我发现了很多矛盾,直到现在我仍然找不到我的问题的明确答案。

4

1 回答 1

4

我对 OS/161 一无所知——但您的描述听起来很像标准的 POSIX 系统。因此,这就是您的问题如何与 POSIX 一起使用,希望它们对 OS/161 也有意义。

只有父母会打电话waitpid()。应用程序是围绕这一点设计的。如果 pid 不是调用进程的子进程,则POSIX 规范waitpid()要求返回错误并将 errno 设置为。ECHILD

孩子们可以通过检查自己的parent pid:来确定他们的父母是否已经死亡getppid(3)。如果是1,那么他们的父母已经死了,他们的父母已经被设置为init. (init准备在他们死后收割所有孤儿,因此进程状态不会逗留并用僵尸进程填充系统进程表。)(现代系统不再有“进程表”,但 pids 必须被回收并且一些进程控制信息必须保留在内核中,直到wait()调用某种类型来获取进程。那个内存太重要了,不能长时间闲置。)

于 2011-11-11T01:27:55.097 回答