线程之间共享什么资源?

最近,我在采访中被问到一个问题,一个进程和一个线程之间有什么区别。 真的,我不知道答案。 我想了一会儿,并给出了一个非常奇怪的答案。

线程共享相同的内存,进程不会。 回答这个问题后,面试官给了我一个邪恶的微笑,并向我解释了以下问题:

:你知道程序被分割的部分吗?

我的回答:是的(认为这是一个容易的)堆栈,数据,代码,堆

问: 那么,告诉我:线程共享哪些细分市场?

我无法回答这个问题,最后说出了所有这些。

请问任何人都可以为进程和线程之间的区别提供正确和令人印象深刻的答案?


你几乎是正确的,但线程共享除堆栈外的所有分段。 线程具有独立的调用堆栈,但是其他线程堆栈中的内存仍然可以访问,理论上你可以在其他线程的本地堆栈框架中保存一个指向内存的指针(尽管你可能应该找到一个放置内存的更好的地方!)。


从维基百科(我认为这对面试官来说是一个非常好的答案:P)

线程与传统的多任务操作系统进程不同之处在于:

  • 进程通常是独立的,而线程作为进程的子集存在
  • 进程携带相当多的状态信息,而进程内的多个线程共享状态以及内存和其他资源
  • 进程具有独立的地址空间,而线程共享其地址空间
  • 进程只能通过系统提供的进程间通信机制进行交互。
  • 在同一进程中线程之间的上下文切换通常比进程之间的上下文切换快。

  • 真正需要指出的是,这个问题实际上有两个方面 - 理论方面和实施方面。

    首先,我们来看看理论方面。 您需要理解流程在概念上是什么,才能理解流程和线程之间的差异以及它们之间共享的内容。

    我们从2.2.2节Tanenbaum的现代操作系统3e中的经典线程模型:

    流程模型基于两个独立的概念:资源分组和执行。 有时将它们分开是有用的; 这是线程进入的地方....

    他继续:

    查看流程的一种方式是,它可以将相关资源组合在一起。 进程具有包含程序文本和数据的地址空间以及其他资源。 这些资源可能包括打开的文件,子进程,待处理的警报,信号处理程序,会计信息等等。 通过将它们以流程的形式放在一起,可以更轻松地进行管理。 过程所具有的另一个概念是执行的线程,通常简称为线程。 线程有一个程序计数器,用于跟踪下一个要执行的指令。 它有寄存器,它保存当前的工作变量。 它有一个包含执行历史的堆栈,每个过程调用一个帧但尚未返回。 虽然线程必须在某个进程中执行,但线程及其进程是不同的概念,可以分别处理。 过程用于将资源组合在一起; 线程是计划在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        |
    

    以上是线程工作所需的。 正如其他人所指出的那样,细分是像操作系统相关的实现细节。

    链接地址: http://www.djcxy.com/p/55255.html

    上一篇: What resources are shared between threads?

    下一篇: Why was the comment that said "Don't format a floppy at the same time" funny when talking about threads and processes?