【发布时间】:2015-11-23 17:46:07
【问题描述】:
我试图理解进程和线程之间的区别,我理解了所有要点,但我无法理解这一行:
典型的区别是(同一进程的)线程在一个 共享内存空间,而进程在不同的内存空间中运行。
这里是reference。
谁能帮我理解这里的内存空间是什么意思?上面的线是什么意思,通俗地说,我可以理解?
【问题讨论】:
标签: java multithreading process semantics
我试图理解进程和线程之间的区别,我理解了所有要点,但我无法理解这一行:
典型的区别是(同一进程的)线程在一个 共享内存空间,而进程在不同的内存空间中运行。
这里是reference。
谁能帮我理解这里的内存空间是什么意思?上面的线是什么意思,通俗地说,我可以理解?
【问题讨论】:
标签: java multithreading process semantics
“内存空间”是指地址到内容的映射。所以,比如在两个不同的进程中,同一个地址的内容可能因为内存空间不同而不同。
【讨论】:
如果系统中的所有内存都是一叠纸。每个过程都是一个小男孩或女孩,他们从一堆文件中拥有自己的一堆来做他们的艺术品。这些是您的应用程序。
现在,如果其中一些应用程序是线程化的,可以将其想象为两个小女孩或男孩一起处理同一堆文件。他们都在给他们的同一张纸上涂鸦他们的创作。虽然其他小女孩和男孩不互相分享他们的论文,但他们是独立的 - 单线程。
换句话说,两个线程可以从相同的内存中读取并访问相同的全局变量。即内存是共享的,因为它是相同的地址空间。
单独的进程无法做到这一点,它们是相互独立的。
【讨论】:
内存空间就像一个边界。隔离以不超越,相互覆盖,因此进程无法访问彼此的变量等,因此必须使用 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 位机器))。进程可以使用这些地址就好像它是物理内存。在后台,操作系统做了很多交换/分页/翻译等,从虚拟到物理(虚拟地址转换)。操作系统确保当两个进程读取或写入时,物理内存不会交错。但是两个进程在运行时可以具有相同的地址(虚拟),但映射到 RAM/主内存中的不同物理地址。
线程变量位于堆栈之下,它是相对的,并且在线程内存空间/边界内,因此一个线程中的地址不能在另一个线程中引用,但可以访问线程堆栈之外但在进程地址空间内的东西。
【讨论】:
在Java的特定上下文中,一次Java的调用,启动一个JVM(Java虚拟机),就是一个进程; JVM 中的代码可以访问该 JVM 中的内存,但不能访问其他 JVM。
在每个 JVM 中可以有多个线程。这些线程共享一个内存空间,因为它们可以访问同一 JVM 中其他线程创建的对象。但是,它们不能访问由其他 JVM 中的线程创建的对象,因为这些对象位于其他 JVM 的内存空间中。
【讨论】: