首页 > 解决方案 > 进程和线程如何与虚拟内存相关

问题描述

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

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

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

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

标签: linuxmemoryvirtual-memory

解决方案


我的理解正确吗?

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

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

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

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

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

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

不。

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


推荐阅读