Skip to content

2011年 408 操作系统 第 25 题

操作系统2011年选择题2分

题目

在支持多线程的系统中,进程 P 创建的若干线程不能共享的是( )。

错因

A

代码段是只读共享的核心资源——所有线程都跑同一份代码,没必要复制多份。把代码段当成线程私有是没把"线程是为了共享资源才引入的"这条想清楚。

B

打开文件(fd 表)以进程为单位维护——同进程内所有线程共享同一份 fd 表,A 线程打开的 fd 在 B 线程也能用。这是线程共享的标志性资源之一。

C

全局变量在堆 / 数据段,进程级共享。线程间共享全局变量正是它们能高效协作的原因(也是要互斥保护的原因),不共享反而怪了。

总解析

引入线程的初衷:让同一进程内的多个执行流共享大部分资源、各自只持有最少的私有状态。

资源同进程线程间是否共享
代码段✓ 共享(都跑一份代码)
数据段 / 全局变量✓ 共享(堆、BSS)
✓ 共享(malloc 出来的内存)
打开文件表 (fd)✓ 共享(进程级管理)
信号处理✓ 共享(按进程)
当前工作目录、用户 ID 等✓ 共享
PC 程序计数器✗ 私有(各线程在代码不同位置)
栈 / 栈指针私有(每线程一个独立栈)
通用寄存器✗ 私有(线程被切走时各自保存)
线程局部存储 (TLS)✗ 私有

为什么栈必须私有

栈用来存函数调用链 + 局部变量——每个线程都在独立执行函数(调用深度、局部变量值都不同),不能共用一个栈。栈指针 SP 指向当前线程栈的栈顶,自然也是每线程一份。

速记:线程共享"全局信息"(代码、数据、文件);私有"执行流信息"(PC、栈、寄存器)——前者是"程序的状态",后者是"执行到哪了",所以前者共、后者私。

逐项核对:

选项描述共享?
A代码段
B打开的文件
C全局变量
D某线程的栈指针✗ 私有

最终答案是 D

最后更新:

⚠️ 这道题暂未配可视化,欢迎在 CodeBrick 反馈区告诉我们你想看哪道题