我试图了解进程和线程之间的区别,我理解了所有重点,但我无法理解这一行:
典型的区别在于(同一进程的)线程在a中运行 共享内存空间,而进程在不同的内存空间中运行。
这是reference。
任何人都可以帮我理解记忆空间在这里意味着什么吗?上面的内容对外行人的意义是什么,以便我能理解?
答案 0 :(得分:7)
如果系统中的所有内存都是一叠纸。每个过程都是一个小男孩或女孩,他们从一堆文件中拥有它自己的作品。这些是你的应用程序。
现在,如果其中一些应用程序是有线程的,可以把它想象成两个小女孩或男孩一起使用同一堆文件。他们都在给他们的同一张纸上涂写他们的作品。虽然其他小女孩和男孩没有彼此分享他们的论文,但他们是独立的 - 单线程。
换句话说,两个线程可以从同一个内存中读取并访问相同的全局变量。即共享内存,因为它是相同的地址空间。
单独的流程不能这样做,它们彼此独立。
答案 1 :(得分:1)
内存空间就像一个边界。隔离不过度,互相覆盖,因此进程无法访问彼此的变量等,因此必须使用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 :(得分:0)
“存储空间”是指地址到内容的映射。因此,例如,在两个不同的进程中,同一地址的内容可能不同,因为它们具有不同的内存空间。
答案 3 :(得分:0)
已有几个好的答案。
一些细节: 每个进程都有一个虚拟内存地址,范围为2个电源字大小(10年前它将是2个电源32(32位机器))。该进程可以使用这些地址,就像它是物理内存一样。在后台,OS执行大量的交换/分页/转换等,从虚拟到物理(虚拟地址转换)。操作系统确保当两个进程读取或写入时,物理存储器不会交错。但是两个进程在运行时可以具有相同的地址(虚拟),但映射到RAM /主存储器中的不同物理地址。
线程变量位于堆栈下,它是相对的并且在线程内存空间/边界内,因此一个线程中的地址不能在另一个线程中引用,但可以访问线程堆栈之外但在进程内# 39;地址空间。
答案 4 :(得分:0)
在Java的特定上下文中,启动一个JVM(Java虚拟机)的Java的单个调用是一个过程; JVM中的代码可以访问该JVM中的内存,但不能访问其他JVM中的内存。
在每个JVM中,可以有多个线程。这些线程共享一个内存空间,因为它们可以访问同一JVM中其他线程创建的对象。但是,它们不能访问其他JVM中的线程创建的对象,因为这些对象位于其他JVM的内存空间中。