【问题标题】:Threads vs Process in terms of memory space?就内存空间而言,线程与进程?
【发布时间】:2015-11-23 17:46:07
【问题描述】:

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

典型的区别是(同一进程的)线程在一个 共享内存空间,而进程在不同的内存空间中运行。

这里是reference

谁能帮我理解这里的内存空间是什么意思?上面的线是什么意思,通俗地说,我可以理解?

【问题讨论】:

    标签: java multithreading process semantics


    【解决方案1】:

    “内存空间”是指地址到内容的映射。所以,比如在两个不同的进程中,同一个地址的内容可能因为内存空间不同而不同。

    【讨论】:

      【解决方案2】:

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

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

      换句话说,两个线程可以从相同的内存中读取并访问相同的全局变量。即内存是共享的,因为它是相同的地址空间。

      单独的进程无法做到这一点,它们是相互独立的。

      【讨论】:

        【解决方案3】:

        内存空间就像一个边界。隔离以不超越,相互覆盖,因此进程无法访问彼此的变量等,因此必须使用 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
        

        希望这会有所帮助!

        【讨论】:

          【解决方案4】:

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

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

          线程变量位于堆栈之下,它是相对的,并且在线程内存空间/边界内,因此一个线程中的地址不能在另一个线程中引用,但可以访问线程堆栈之外但在进程地址空间内的东西。

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              猜你喜欢
              • 2011-12-27
              • 2010-12-09
              • 1970-01-01
              • 2012-01-17
              • 1970-01-01
              • 1970-01-01
              • 2020-05-21
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多