线程与进程在内存方面 space?

Threads vs Process in terms of memory space?

我试图理解进程和线程之间的区别,我理解了所有要点,但我无法理解这一行:

The typical difference is that threads (of the same process) run in a shared memory space, while processes run in separate memory spaces.

这里是 reference.

任何人都可以帮我理解这里的内存 space 是什么意思吗?上面一行是什么意思,我可以理解吗?

"memory space"表示地址到内容的映射。所以,比如在两个不同的进程中,同一个地址的内容可能不同,因为它们有不同的内存空间。

如果一个系统中所有的内存都是一叠纸。每个过程都是一个小男孩或小女孩,他们从一堆纸上有自己的一堆来做他们的艺术品。这些是您的申请。

现在,如果其中一些应用程序是线程化的,可以将其想象成两个小女孩或男孩一起处理同一堆文件。他们都在给他们的同一张纸上涂鸦他们的创作。虽然其他小女孩和男孩不互相分享他们的论文,但他们是独立的 - 单线程。

也就是说,两个线程可以读取同一个内存,访问同一个全局变量。即内存是共享的,因为它是相同的地址 space.

单独的进程无法做到这一点,它们彼此独立。

记忆space就像一道界线。一种不超越、相互覆盖的隔离,因此进程不能访问彼此的变量等,因此必须使用 IPC 相互通信。但是线程可以访问全局变量(通常在读写时使用某种保护,如互斥量)。

Assume ( T = Thread, P = Process, and V = variable ) 
P1 
global_var
T1 
  can set global_var = 2
T2 
  can read global_var
  and can ever reset global_var

P2
  It cannot read P1::global_var

希望对您有所帮助!

已经有几个很好的答案了。

一些细节: 每个进程都被赋予一个虚拟内存地址,其范围为 2 次方字大小(10 年前它应该是 2 次方 32(对于 32 位机器))。进程可以使用这些地址就好像它是物理内存一样。在后台 OS 做了很多 swapping/paging/translation 等,从虚拟到物理(虚拟地址转换)。 OS 确保当两个进程读取或写入时,物理内存不会交错。但是当 运行 但映射到 RAM/main 内存中的不同物理地址时,两个进程可以具有相同的地址(虚拟)。

线程变量位于堆栈之下,它是相对的并且在线程内存中space/boundary因此一个线程中的地址不能在另一个线程中引用,但可以访问线程堆栈之外但在进程地址内的内容space.

在 Java 的特定上下文中,启动一个 JVM(Java 虚拟机)的单个 Java 调用是一个进程; JVM 中的代码可以访问该 JVM 中的内存,但不能访问其他 JVM 中的内存。

在每个 JVM 中可以有多个线程。这些线程共享一个内存 space,因为它们可以访问同一 JVM 中其他线程创建的对象。但是,它们不能访问由其他 JVM 中的线程创建的对象,因为这些对象位于其他 JVM 的内存中 spaces.