linux - 进程和线程如何与虚拟内存相关
问题描述
我是 Linux 和计算机体系结构的新手,只是关于进程和线程如何与虚拟内存和物理内存 RAM 相关的一些问题。以下是我的问题。
Q1-当有两个进程(进程A和进程B)同时运行时,如果进程A现在正在运行,进程B的状态如寄存器值、堆对象等必须被推送到磁盘上(虚拟内存)存储,当下一次上下文切换发生,进程 B 将从磁盘“恢复”到 RAM,进程 A 的状态将被推送到磁盘,我的理解是否正确?
Q2-如果我在 Q1 中的理解是正确的,为什么不把所有进程也保存在 RAM 上呢?通常我们有 16gb、32gb 等大型 RAM,如何将每个进程的状态存储在 RAM 上,当进程太多并且 RAM 即将用完时,进一步进程的状态将存储到磁盘?
Q3-线程怎么样?如果有多个线程(例如线程A和线程B),当线程A运行时,线程B的状态是否也会被推送到存储在磁盘上?
解决方案
我的理解正确吗?
不,这是错误的。等待或阻塞的进程不会被交换到磁盘。他们在记忆中等待。虚拟内存不在磁盘上。
同样在具有两个处理器的系统上,两个进程同时运行,因此进程 A 和 B 可以同时运行。
为什么不把所有进程也保存在 RAM 上呢?
这正是发生的事情。所有进程内存都在 RAM 中等待,直到调度程序切换到该进程。
旁注:如果没有可用的 RAM 并且系统有可用的交换,并且此进程在某个定义的时间内空闲,则它可能会在磁盘上交换,即。进程内存可能会移动到磁盘。但这不会立即发生,它会在很长一段时间后在某些情况下发生
也会被推送到存储在磁盘上吗?
不。
虚拟内存与内存的物理位置无关。反过来说——虚拟内存是一种抽象,它允许系统修改内存的物理(如果有的话)位置。我给出一个最简单的解释:有一个特殊的 cpu 寄存器,在取消引用时会添加到每个地址。用户空间程序这样做*(int*)4
但他没有得到 RAM 中第 4 个字节后面的值,特殊的 cpu 寄存器值在取消引用时被添加到指针值。寄存器值由系统配置,在不同程序中可以不同。因此,您可以在两个程序中拥有完全相同的指针值,但它们都指向不同的位置。当然,这是过于简单化了。
推荐阅读
- c++ - 类模板中的多个可选成员,无需开销
- redis - 使用 Jredisearch 创建索引时添加前缀
- javascript - 从 csv 添加数字
- android - 来自 IntentService 的启动活动在 Android 12 中不起作用
- node.js - 反应生产 npm 运行命令以代码 0 退出
- javascript - 我的请求在 Postman 中有效,而不是在浏览器中(React、Node、Cloudinary)
- mysql - 如何使用 SQL 获取列中某个值的百分比?
- c# - 顶级委托引用无法解析
- python - pandas.series.diff 奇怪的输出
- java - 在 Windows 上使用 Jar 文件启动 JMeter 时出现白色空白屏幕