operating-system - os161 父子线程pid

标签 operating-system os161

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

子 pid、父 pid 到底是如何工作的。

我知道当你调用thread_fork()时,你正在当前线程的基础上创建另一个线程,新线程应该有一个唯一的ID和一个不同的文件描述符表。当sys_forkcurthread创建一个子进程时,除了pid之外,子进程与父进程相同。但我对 pid 和父 pid 的工作原理感到困惑。

这是我对进程表的解释。整个系统只有一张进程表。目前,每个线程都有 parent_pidmy_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/

相关文章:

c - 在c中声明内存结构

operating-system - 页码和偏移

c - 操作系统 C 中未执行的 for 循环

使用 IF 语句运行命令之前的 Powershell 操作系统检查

python - 在启动 raspbian 时运行 bash 或 python 脚本

c - 如何让子进程通过 sys_fork() fork 以使其内核堆栈包含陷阱帧?

java - 没有网络就可以更新吗?

linux - 什么决定了一个进程可用的虚拟地址空间的大小?

c - 如何在 2 个 .c 文件之间共享一个变量?