【问题标题】:How process and thread related to virtual memory进程和线程如何与虚拟内存相关
【发布时间】:2019-09-06 00:24:49
【问题描述】:

我是 Linux 和计算机架构的新手,只是一些关于进程和线程如何与虚拟内存和物理内存 RAM 相关的问题。以下是我的问题。

Q1-当有两个进程(进程A和进程B)同时运行时,如果进程A现在正在运行,进程B的状态如寄存器值,堆对象等必须被推送到磁盘上存储(虚拟内存) ,而当下一次上下文切换发生时,进程B将从磁盘“恢复”到RAM,进程A的状态将被推送到磁盘,我的理解是否正确?

Q2- 如果我在 Q1 中的理解是正确的,为什么不将所有进程也保存在 RAM 上呢?通常我们有 16gb、32gb 之类的大 RAM,如何将每个进程的状态存储在 RAM 上,当进程太多并且 RAM 即将耗尽时,将进一步进程的状态存储到磁盘?

Q3-线程怎么样?如果有多个线程(例如线程A和线程B),当线程A运行时,线程B的状态是否也会被推送到磁盘存储?

【问题讨论】:

    标签: linux memory virtual-memory


    【解决方案1】:

    我的理解正确吗?

    不,这是错误的。等待或阻塞的进程不会被交换到磁盘。他们在记忆中等待。虚拟内存不在磁盘上。

    同样在具有两个处理器的系统上,两个进程同时运行,因此进程 A 和 B 可以同时运行。

    为什么不将所有进程也保存在 RAM 上?

    这正是发生的事情。所有进程内存都在 RAM 中等待,直到调度程序切换到该进程。

    旁注:如果没有可用的 RAM 并且系统有可用的交换,并且此进程在某个定义的时间内空闲,那么它可能会在磁盘上交换,即。进程内存可能会移动到磁盘。但这不会立即发生,它会在很长一段时间后在某些情况下发生

    也会被推送到存储在磁盘上吗?

    没有。

    虚拟内存与内存的物理位置无关。反过来说——虚拟内存是一种抽象,它允许系统修改内存的物理(如果有的话)位置。我给出的一个最简单的解释是:有一个特殊的 cpu 寄存器在取消引用时添加到每个地址。用户空间程序执行*(int*)4,但他没有得到 RAM 中第 4 个字节后面的值,特殊的 cpu 寄存器值在取消引用时被添加到指针值中。寄存器值由系统配置,在不同程序中可以不同。因此,您可以在两个程序中拥有完全相同的指针值,但它们都指向不同的位置。当然,这是过于简单化了。

    【讨论】:

    • Curk 感谢您的回答。那么这是否意味着我们拥有的 RAM 越大,进程交换到硬盘的机会就越少?
    • 而对于线程,如果一台机器上只有单核,并且内存耗尽,线程状态也会被交换到磁盘?
    • that the large RAM we have, the less chance processes get swapped to hard disk? - RAM 被填满然后进程将被交换到磁盘的可能性越小。但不,不是真的。如果您有大量可用的 ram 并且内核看到一个进程从未运行,它通常会交换它。还有swappiness sys设置。
    猜你喜欢
    • 2011-07-14
    • 2013-12-13
    • 2020-05-21
    • 2017-10-02
    • 2011-12-27
    • 2012-06-28
    • 2011-09-09
    • 2011-08-19
    • 1970-01-01
    相关资源
    最近更新 更多