有谁熟悉os/161可以回答我几个问题吗?
子 pid、父 pid 到底是如何工作的。
我知道当你调用thread_fork()
时,你正在当前线程的基础上创建另一个线程,新线程应该有一个唯一的ID和一个不同的文件描述符表。当sys_fork
从curthread
创建一个子进程时,除了pid之外,子进程与父进程相同。但我对 pid 和父 pid 的工作原理感到困惑。
这是我对进程表的解释。整个系统只有一张进程表。目前,每个线程都有 parent_pid
和 my_pid
。
- 一个父线程可以有多个子线程(通过不断调用sys_fork
)。
- 一个 child 只能有一个 parent 。
-每当sys_fork
被调用时,就会创建一个子进程,并且该子进程的parent_pid
被设置为创建该子进程的线程的pid。
-pid 1 用于启动/菜单线程。
我在理解进程表如何工作方面是否走在正确的轨道上?
最后一个问题:
对于sys_waitpid()
:只有父级可以使用waitpid
?他们只能等待自己的 child 吗?子进程可以在父进程上使用 waitpid
(否则会导致死锁)?
我在Google上查了很多资料,但发现了很多矛盾,到现在为止我仍然找不到明确的答案。
最佳答案
我对 OS/161 一无所知——但你的描述听起来很像标准 POSIX 系统。那么,这就是您的问题如何与 POSIX 配合使用,希望它们对于 OS/161 也有意义。
只有 parent 才会调用waitpid()
。应用程序是围绕此设计的。 waitpid()
的 POSIX 规范要求,如果 pid 不是调用进程的子进程,则返回错误,并将 errno 设置为 ECHILD
。
children 可以通过检查自己的parent pid
来确定他们的parent是否已经死亡:getppid(3)
。如果是1
,那么它们的父级已经死亡,并且它们的父级已被设置为init
。 (init
准备在死亡时收割所有孤儿,因此进程状态不会徘徊并用僵尸进程填充系统进程表。)(现代系统不这样做不再有“进程表”,但是必须回收 pid,并且一些进程控制信息必须保留在内核中,直到调用某种wait()
来获取进程。内存太重要了,不能长时间闲置。)
关于operating-system - os161 父子线程pid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8088373/