UNIX领域的主题u
上来了在评论中。那是什么?
答案1
在 AT&T Unix 以及历史上的 BSD 中,只有进程,没有线程;进程表中的每个条目都由struct proc
结构体和struct user
结构体两部分组成。前者始终驻留在内核内存中。作为交换进程的一部分,后者可以被交换。 (记住,这是在 Unices 实际上交换了事物,而不是按需分页他们。)
该struct user
结构也被称为“u 区”。这是因为,由于一些巧妙的内存映射,当前进程的user
结构始终位于内核内存中相同的固定虚拟地址,并且可以通过全局符号u
(而不是通过指针)在代码中引用。
该结构包含当进程不是当前正在运行的进程时内核根本不需要的各种内容,包括文件创建掩码、打开的文件描述符表、资源限制等。它包含信号的地址处理程序,仅当进程正在运行并尝试调用处理程序时才需要,而不是阻塞信号或挂起信号集的掩码,这两者在进程换出时都需要,因此位于struct proc
.在某些 Unices 中,它甚至包含当前 I/O 操作的参数,而不是让它们在堆栈上传递。
当然,这种设计的理由并没有持续很长时间。到 20 世纪 80 年代末,它们几乎已经过时了。全局变量和巧妙的内存映射最终被通过指针的简单间接所取代。您会发现struct user
BSD 上的 C 库头文件中仍然存在该文件(在 参考资料中<sys/user.h>
),但它主要是为了源代码兼容性而存在。 在XNU,它实际上被声明为一个空结构。 FreeBSD 笔记它的存在主要是因为它用于 a.out 格式执行的核心转储中。 Linux 甚至直到这个想法过时之后才存在,而且根本不这样做。
该设计存在一些可变性。例如:AT&T Unix System 5 有一个“扩展用户区域”,由结构字段struct euser
指向的,其中包含一些内容。这进一步说明了一点。的所有成员变量的命名都符合当时的C内核编码约定及其早期语言规则。 u_euserp
u
struct user
u_something
这被认为是其umask
如此命名的原因,尽管这并不确定。
进一步阅读
- 史蒂夫·D·佩特 (1996)。 UNIX 内部原理:实用方法。艾迪生-韦斯利。 ISBN 9780201877212。
- 莫里斯·J·巴赫 (1987)。Unix®操作系统的设计。普伦蒂斯·霍尔。国际标准书号 0132017571。