线程之间共享哪些资源?

7 浏览
0 Comments

线程之间共享哪些资源?

最近,在面试中有人问我进程和线程的区别。事实上,我不知道答案。我思考了一分钟,给出了一个很奇怪的答案。

线程共享同一块内存,而进程不共享。回答后,面试官冷笑着向我提出了以下问题:

Q. 你知道程序被分成哪些段吗?

我的答案是:是的(觉得这很简单)堆栈、数据、代码、堆

Q. 那么,告诉我:线程共享哪些段?

我无法回答这个问题,只能说它们都共享。

请问有人能够给出进程和线程之间的差异的正确和印象深刻的答案吗?

admin 更改状态以发布 2023年5月21日
0
0 Comments

需要指出的是,这个问题实际上有两个方面——理论方面和实现方面。

首先,让我们看看理论方面。要理解进程和线程之间的区别以及它们之间共享的内容,您需要从概念上了解进程是什么。

我们从《现代操作系统 3e》(Tanenbaum著)第2.2.2节经典线程模型中得到以下内容:

进程模型基于两个独立的概念:资源组合和执行。有时它们之间需要分开;这就是线程的作用……

他继续说:

从一种角度来看,进程是一种将相关资源组合在一起的方式。进程具有包含程序文本和数据以及其他资源的地址空间。这些资源可能包括打开的文件、子进程、等待的警报、信号处理程序、会计信息等。通过以进程的形式将它们放在一起,它们可以更容易地被管理。进程具有的另一个概念是执行线程,通常缩写为线程。线程具有程序计数器,用于跟踪下一个要执行的指令。它具有寄存器,用于保存当前工作变量。它具有一个堆栈,其中包含执行历史记录,对于每个已调用但尚未从中返回的过程,均有一个帧。虽然线程必须在某个进程中执行,但线程和其进程是不同的概念,可以分别处理。进程用于将资源分组在一起;线程是在CPU上执行的实体。

他在下面提供了以下表格:

Per process items             | Per thread items
------------------------------|-----------------
Address space                 | Program counter
Global variables              | Registers
Open files                    | Stack
Child processes               | State
Pending alarms                |
Signals and signal handlers   |
Accounting information        |


上面的是线程工作所需的内容。正如其他人指出的,像segment这样的东西是依赖于操作系统的实现细节。

0
0 Comments

你的理解基本上是正确的,但线程共享 除了 栈以外的所有段。线程具有独立的调用堆栈,但其他线程堆栈中的内存仍然可以访问,理论上你可以保持指针指向其他线程的本地堆栈帧中的内存(尽管你应该找到更好的放置内存的位置!)。

0