459 字
2 分钟
为什么要有虚拟内存
  1. 1操作系统面试学习路线与知识地图
  2. 2什么是用户态和内核态
  3. 3什么是系统调用?它和普通函数调用有什么区别
  4. 4进程和线程有什么区别
  5. 5进程的五种状态:新建、就绪、运行、阻塞与终止
  6. 6fork、exec 和 wait 分别做什么
  7. 7什么是竞态条件和临界区?如何保证互斥
  8. 8互斥锁和自旋锁有什么区别?分别适合什么场景
  9. 9死锁的四个必要条件是什么?如何逐个预防
  10. 10缺页异常如何处理?虚拟内存不等于 Swap
  11. 11阻塞、非阻塞、同步、异步 I/O 怎么区分
  12. 12抢占式调度是什么?SJF 和 MLFQ 适合什么假设
  13. 13进程间通信如何选择?管道、共享内存、信号和 Socket
  14. 14线程切换时,操作系统要做哪些操作
  15. 15进程上下文切换要保存什么?为什么有开销
  16. 16死锁是什么?如何预防和避免死锁?
  17. 17银行家算法如何避免死锁?死锁检测后怎样恢复
  18. 18活锁、饥饿和死锁有什么区别
  19. 19进程调度算法:FCFS、SJF、优先级、时间片轮转与多级反馈队列
  20. 20调度指标有哪些?什么是优先级反转
  21. 21为什么要有虚拟内存本文
  22. 22TLB、多级页表和虚拟地址转换是怎么工作的
  23. 23什么是分段,什么是分页
  24. 24页面置换算法有哪些?FIFO、LRU 和 Clock
  25. 25信号量是什么?计数信号量和二元信号量怎么用
  26. 26条件变量是什么?为什么要和互斥锁配合使用
  27. 27进程间通信方式:管道、消息队列、共享内存、信号量与套接字
  28. 28I/O 模型有哪些:阻塞、非阻塞与多路复用
  29. 29select、poll 和 epoll 有什么区别
  30. 30epoll 的 LT 和 ET 模式有什么区别
  31. 31什么是异步 I/O?它和非阻塞、多路复用的区别
  32. 32什么是僵尸进程和孤儿进程?如何处理
  33. 33原子操作是什么?原子性、可见性和有序性有什么区别
  34. 34什么是工作集和抖动?内存不足时为何系统变慢
  35. 35mmap 是什么?文件映射和匿名映射怎么理解
  36. 36什么是写时复制?fork 和私有映射如何利用 COW

虚拟内存解决了什么问题#

  1. 让程序能用比物理内存大得多的地址空间:8GB 内存的机器跑十几个浏览器标签页、IDE、Docker 容器,加起来早超了物理内存。虚拟内存把不常用的页换到磁盘 Swap 区,当前活跃的页留在内存里。
  2. 进程之间完全隔离:每个进程有自己独立的虚拟地址空间,进程 A 的 0x1000 和进程 B 的 0x1000 指向不同的物理内存。一个进程的野指针最多把自己搞崩,不会影响别的进程,操作系统稳定性有了保障。
  3. 程序员不用担心物理内存布局:写代码时用的都是逻辑地址,程序可以被加载到物理内存的任意位置,操作系统通过页表做映射,对程序完全透明。

虚拟内存的工作原理#

  1. 每个进程看到自己独占 4GB(32 位)或 256TB(64 位)的地址空间。
  2. 进程访问虚拟地址时,MMU 查页表找到对应的物理地址。
  3. 如果页不在内存里,触发缺页异常,操作系统从磁盘加载。
  4. 物理内存不够时,把不活跃的页换出到 Swap。

物理内存和 Swap 都满了会怎样?#

Linux 内核会启动 OOM Killer,按一定算法选个进程干掉来释放内存。选的标准是尽量杀内存占用大但又不太重要的进程,通过 oom_score 打分。

为什么访问 Swap 会导致性能急剧下降?#

磁盘和内存的速度差了 10 万倍。内存随机访问延迟大概 100 纳秒,机械硬盘寻道要 10 毫秒,SSD 也要几十微秒。一旦频繁换页,CPU 大部分时间都在等磁盘 I/O,系统就卡死了。

为什么要有虚拟内存
https://blog.xqcherry.top/posts/interview/operating-system/virtual-memory/
作者
xqcherry
发布于
2026-10-09
许可协议
CC BY-NC-SA 4.0