29.1 线程共享了什么、私有数据是什么?
线程共享了什么?
实际上就是
clone()
用于支持线程的标志 中的那些标志提到的内容。以下抄书:
除了全局内存之外,线程还共享了一些其他属性(这些属性对于进程而言是全局性的, 而并非针对某个特定线程),包括以下内容。
- 进程 ID(process ID)和父进程 ID。
- 进程组 ID 与会话 ID(session ID)。
- 控制终端。
- 进程凭证(process credential)(用户 ID 和组 ID )。
- 打开的文件描述符。
- 由
fcntl()
创建的记录锁(record lock)。 - 信号(signal)处置。
- 文件系统的相关信息:文件权限掩码(umask)、当前工作目录和根目录。
- 间隔定时器(
setitimer()
)和 POSIX 定时器(timer_create()
)。 - 系统 V(system V)信号量撤销(undo,semadj)值(47.8 节)。
- 资源限制(resource limit)。
- CPU 时间消耗(由
times()
返回)。 - 资源消耗(由
getrusage()
返回)。 - nice 值(由
setpriority()
和nice()
设置)。
2025/3/8 总结一下,希望好记一点:
- 内存:共享虚拟地址空间。
- 一组标识:pid/ppid/pgid/sid、进程凭证(uid 和 gid)。
- 文件:文件描述符、文件记录锁、cwd、umask
- 进程交互:sysv 信号量、控制终端(算是进程交互吧?因为有控制终端代表着有其他进程来控制)
- 信号和时间:信号处理方式、定时器
- 资源分配和调度:资源限制 rlimit、CPU 时间 / 资源消耗的统计信息、nice 值
从另外一个角度考虑,线程共享了什么可以看
clone()
用于支持线程的标志。
线程的私有数据是什么?
书中列举了一部分:
- 线程 ID(thread ID,29.5 节)。
- 信号掩码(signal mask)。
- 线程特有数据(31.3 节)。 (thread local?)
- 备选信号栈(
sigaltstack()
)。 - errno 变量。
- 浮点型(floating-point)环境(见 fenv(3))。
- 实时调度策略(real-time scheduling policy)和优先级(35.2 节和 35.3 节)。
- CPU 亲和力(affinity,Linux 所特有,35.4 节将加以描述)。
- 能力(capability,Linux 所特有,第 39 章将加以描述)。
- 栈,本地变量和函数的调用链接(linkage)信息(calling convention 的一些东西)。