Jde*_*eBP 37

在 AT&T Unix 和历史上的 BSD 中,只有进程,没有线程;进程表中的每一项都由struct proc结构和struct user结构两部分组成。前者总是驻留在内核内存中。后者可以被换出,作为换出进程的一部分。(请记住,这是在 Unices 实际交换东西而不是按需分页的时代。)

struct user结构也被称为“u 区”。这是因为,作为一些巧妙的内存映射的结果,当前进程的user结构始终位于内核内存中相同的固定虚拟地址,并且可以通过全局符号u(而不是通过指针)在代码中引用。

当进程不是当前正在运行的进程时,该结构包含内核根本不需要的各种内容,包括文件创建掩码、打开的文件描述符表、资源限制等。它包含信号处理程序的地址,仅在进程运行并尝试调用处理程序时需要,但不包含阻塞信号或挂起信号集的掩码,这两者在进程被换出时都需要,哪些是因此在struct proc. 在某些 Unices 中,它甚至包含当前 I/O 操作的参数,而不是让它们在堆栈上传递。

当然,这种设计的原因已经很久没有成立了。到 1980 年代末,它们几乎已经过时了。毕竟,全局变量和巧妙的内存映射最终被通过指针的简单间接取代。您会发现struct userBSD(在<sys/user.h>)上的 C 库头文件中仍然存在 ,但主要是为了源兼容性。 在 XNU 中,它实际上被声明为一个空结构。 FreeBSD 指出它的存在主要是因为它用于 a.out 格式的核心转储。Linux 甚至在这个想法过时之后才存在,并且根本不这样做。

这个设计有一些变化。例如:AT&T Unix System 5 有一个“扩展用户区”, a struct euser,由结构的u_euserp字段指向u,其中一些东西存在。这进一步说明了一点。的所有成员变量的struct user命名都符合当时的 C 内核编码约定及其早期语言规则。 这被认为是 被命名为的原因,尽管这并不确定。u_somethingumask

进一步阅读

  • 史蒂夫 D. 佩特 (1996)。 UNIX 内部:实用方法。艾迪生-卫斯理。ISBN 9780201877212。
  • 莫里斯 J. 巴赫 (1987)。Unix® 操作系统的设计。普伦蒂斯霍尔。ISBN 0132017571。