同一进程中有多个线程,并不意味着每个线程都复制一份完整的全局内存,也不意味着所有资源都只有一份。Linux的pthreads手册开头同时写出共享与独立两类关系:线程共享data和heap所对应的全局内存,每个线程则有自己的栈。两项描述放在一起,才是该段给出的完整范围。
手册先说明,一个进程可以包含多个线程,这些线程执行同一个程序。随后明确将data与heap列为共享内存,将stack与其中的自动变量放在逐线程一侧。因此,“同一个程序”没有取消线程自身的栈,“各有栈”也没有把共享的全局内存改成每线程私有。不同名称指向的内存对象,应当分别保留。
身份属性也有类似区分。共享属性列表包括process ID;逐线程属性列表则包括thread ID。看到两个线程标识不同,不能仅据此在过程图中画出两个不同PID的进程。反过来,进程号相同也没有抹去线程标识和各自栈的区别。这里解释手册的属性归属,没有查看任何运行中的程序。
这让技术说明可以更具体地表达执行结构。一份自拟摘要若只说“多个线程各自运行”,仍不知道它们共享什么;若再写明同一进程内共享data与heap、每线程有自己的stack,才恢复了所述内存关系。该例并不是线程创建方法,也不推导实际程序的调用栈内容、分配大小或访问方式。
共享内存这一事实,本身不说明业务访问已经协调好;有自己的栈,也不能单凭这句话宣称获得某种安全隔离。本文没有读取同步设计、创建线程、调整调度或测量性能。手册中两类资源的说明,适合帮助读清结构图和术语,不代替具体程序的运行证据。
本篇限定于Linux man-pages的pthreads条目开头与相关属性列表,不将其推广成所有语言运行时的统一实现。网页HTML渲染日期不是该概念的首次发布日期。对操作系统资料阅读,保留共享全局内存和独立栈两条线索,能够解释同一进程中的线程为何既有关联资源,也有各自状态。
信息来源
本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。