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 的一些东西)。