当前位置: 首页 > news >正文

os 虚拟内存

虚拟内存不仅能隔离进程,还能提高内存利用率,请解释虚拟内存如何提高内存利用率???

虚拟内存(Virtual Memory)通过以下几个机制来提高内存利用率:

1. 内存分页(Paging)

虚拟内存将物理内存划分为固定大小的块,称为页框(page frame),同时将进程的虚拟内存空间划分为同样大小的页(page)。虚拟内存系统通过页表(page table)将虚拟页映射到物理页框。由于每个进程只需在物理内存中保留当前使用的页面,其余页面可以留在磁盘上,这就避免了将整个进程加载到内存中,从而减少了物理内存的使用。

2. 按需调页(Demand Paging)

按需调页是指在进程执行时,只有在需要访问某个页面时才将该页面从磁盘加载到内存中。未被访问的页面则不占用物理内存。这种策略避免了不必要的内存占用,使得物理内存只用于活跃的页面,从而提高了内存利用率。

3. 页交换(Swapping)

当物理内存不足时,操作系统可以将暂时不活跃的页面移出物理内存,存放到磁盘的交换空间中。这种机制允许更多的进程共享有限的物理内存,通过动态调整每个进程的物理内存占用,优化了内存的利用效率。

4. 共享内存(Shared Memory)

在某些情况下,不同进程可以共享相同的内存页。比如,多个进程运行同一个程序时,操作系统可以让它们共享相同的只读代码段。这减少了冗余数据的内存占用,进一步提高了内存利用率。

5. 内存映射文件(Memory-Mapped Files)

通过内存映射文件,文件的内容可以直接映射到进程的虚拟内存空间中。这种方式避免了将文件内容加载到物理内存中的需要,从而节省了内存。只有当进程实际访问这些文件内容时,相应的页面才会被加载到物理内存。

总结

虚拟内存通过以上机制,使得操作系统能够有效地管理物理内存,减少不必要的内存占用,支持多个进程并发运行,从而显著提高内存利用率。这种内存管理方式不仅优化了系统性能,还提供了进程隔离和稳定性。


每个进程的虚拟地址空间中,内核空间的地址经过页表翻译后,都是指向同一片物理地址吗??

是的,在大多数操作系统中,每个进程的虚拟地址空间都包含一个内核空间,这个内核空间的地址经过页表翻译后,通常指向相同的物理内存区域。

具体解释

1. 虚拟地址空间的划分

典型的操作系统(如Linux)将每个进程的虚拟地址空间划分为两部分:

  • 用户空间(User Space):用于运行用户态应用程序。不同的进程有各自独立的用户空间。
  • 内核空间(Kernel Space):用于操作系统内核代码和内核态的数据结构。这个部分在所有进程中是相同的。
2. 页表翻译

每个进程都有自己的页表,负责将虚拟地址映射到物理地址。对于用户空间,页表会将进程的虚拟地址映射到不同的物理内存区域,每个进程的用户空间地址到物理地址的映射通常是独立的。

但是对于内核空间,大多数操作系统的设计是让内核空间的虚拟地址映射到相同的物理地址。因此,内核态的代码和数据在所有进程的虚拟地址空间中都是相同的,且都映射到相同的物理内存区域。

3. 原因和好处
  • 一致性:这种设计使得内核代码在不同的进程上下文中可以使用相同的地址访问相同的物理资源,简化了内核开发和调试。
  • 安全性:虽然内核空间的虚拟地址在所有进程中都是相同的,但普通用户态进程无法直接访问这些地址,只有内核态代码才能操作内核空间,从而保护了系统的稳定性和安全性。
4. 实际示例

在x86架构的Linux系统中,32位的虚拟地址空间通常被划分为下半部分(0x00000000到0xBFFFFFFF)为用户空间,上半部分(0xC0000000到0xFFFFFFFF)为内核空间。对于所有进程,0xC0000000以上的虚拟地址都映射到相同的物理地址,这些地址被用于访问内核态的代码和数据。

总结

因此,确实,每个进程的虚拟地址空间中的内核空间的虚拟地址经过页表翻译后,通常会指向相同的物理地址。这种设计既保证了内核的一致性,又确保了系统的安全性和稳定性。

在这里插入图片描述


在 4GB 物理内存的机器上,申请 8G 内存会怎么样?
在一台只有 4GB 物理内存的机器上,如果一个进程试图申请 8GB 的内存,操作系统会利用虚拟内存技术来处理这个请求。这可能会导致以下几种情况:

1. 内存分配成功

操作系统通常不会立即分配物理内存,而是分配虚拟内存地址空间。这意味着即使物理内存不足,进程仍然可能成功申请到 8GB 的虚拟内存。这是因为虚拟内存空间可以大于物理内存。操作系统通过分页机制来管理虚拟内存,并使用磁盘上的交换空间(swap space)来弥补物理内存的不足。

2. 实际内存使用与分配不同

即使申请了 8GB 的虚拟内存,进程只有在实际使用这些内存时(即访问这段内存)才会触发操作系统将其映射到物理内存。对于那些未实际访问的部分,操作系统不会为其分配物理内存。因此,如果进程实际使用的内存远小于 8GB,那么物理内存的占用量也会较小。

3. 使用交换空间

当进程实际使用的内存超出物理内存的容量时,操作系统会将不常用的内存页面交换到磁盘上的交换空间中,以腾出物理内存给需要的页面。这种机制允许系统在物理内存不足的情况下,继续支持更大的内存需求。

4. 性能下降

使用交换空间会导致性能下降,因为磁盘的访问速度远低于物理内存。随着越来越多的内存页面被交换到磁盘上,系统会变得非常缓慢,可能出现频繁的磁盘I/O操作,甚至导致“交换颠簸”(thrashing),即系统花费大量时间在内存页面的交换上,而无法有效执行任务。

5. 内存不足错误

如果操作系统的交换空间用尽,或者系统无法为进程分配所需的内存资源,内存分配操作可能会失败。此时,进程可能会收到std::bad_alloc(C++)或OutOfMemoryError(Java)等错误,表明内存分配失败。

6. OOM(Out Of Memory)杀手

在Linux等操作系统中,当系统内存耗尽时,内核可能会启动OOM杀手,选择性地终止某些进程以释放内存,确保系统的其余部分能够继续运行。如果你的进程占用了大量内存且系统内存不足,它可能会成为OOM杀手的目标,从而被强制终止。

总结

在4GB物理内存的机器上申请8GB内存,操作系统会利用虚拟内存和交换空间技术来处理请求,但这可能导致显著的性能下降,甚至内存分配失败或进程被终止。因此,在有限的物理内存环境中,申请远超出物理内存容量的大量内存通常不是一个好的做法。


http://www.mrgr.cn/news/6994.html

相关文章:

  • TCP与UDP传输的学习
  • Web应用服务器Tomcat
  • 如何在Geth中搭建P2P多节点以太坊私链:详细教程与实操步骤
  • 【算法】希尔排序、计数排序、桶排序、基数排序
  • 入门Java编程的知识点—>程序结构(day04)
  • 代码随想录day52 101孤岛的总面积 102沉没孤岛 103水流问题 104建造最大岛屿
  • CentOS7发送邮件如何配置SMTP服务器发信?
  • Ubuntu 22安装和配置PyCharm详细教程(图文详解)
  • UE5打包iOS运行查看Crash日志
  • AI副业:别只顾刷黑神话悟空!AI做神话账号,商单月入过万(附教程)
  • 适用于应用程序安全的 11 大 DevSecOps 工具
  • 大语言模型 (LLM)是什么_
  • 【设计模式】单例模式、工厂模式、策略模式、观察者模式、装饰器模式
  • 异步交互技术Ajax-Axios
  • LeetCode面试题Day16|LC56 合并区间、LC57 插入区间
  • Lodash 使用详解:提升 JavaScript 开发效率的利器
  • 【解压即玩】使命召唤 系列合集17-1,经典收藏
  • 芯片后端之 PT 使用 report_timing 产生报告 之 -include_hierarchical_pins 选项
  • CLion调试ROS(包括launch启动的ROS)
  • Debian系列和Red Hat系列常用命令