虚拟内存是操作系统提供的一种内存管理技术,它将主存和磁盘等外部存储设备结合起来,使得程序能够访问超出其实际物理内存的地址空间。
在虚拟内存的管理下,每个进程都拥有一个独立的虚拟地址空间,包含代码段、数据段、堆
、栈等区域。当程序访问虚拟地址时,操作系统会将其映射到物理地址,如果所需数据已经在主存中,那么就直接从主存中取出;如果不在主存中,操作系统则会将其他不使用的数据从主存中换出,为所需数据腾出空间,并从磁盘中读取所需数据到主存中,最后将其映射到虚拟地址空间中。
虚拟内存的主要作用是扩展主存的容量,使得每个进程能够使用更大的内存空间,提高系统的可用性和性能。同时,虚拟内存还可以提供内存保护、共享和动态加载等功能,保证程序的安全性和灵活性。
需要注意的是,由于虚拟内存的使用需要磁盘和主存之间频繁的数据交换,因此会带来一定的性能开销。因此,在应用程序设计和系统配置中,需要合理地使用虚拟内存,并根据实际情况来进行调整。
常见虚拟内存技术
分页式
出现的原因:分页主要用于实现虚拟内存,从而获得更大的地址空间
d将进程的虚拟地址空间划分成若干个固定大小的页,同时将物理内存划分成同样大小的页框。当程序访问虚拟地址时,操作系统通过页表将虚拟页映射到物理页框,从而实现地址的转换。
分页系统的优点是可以实现更灵活的内存管理,可以有效地减少内存碎片和提高内存利用率,同时还可以提供内存保护和共享等功能。缺点是由于每次访问内存都需要查找页表,会带来一定的开销,尤其是在页表较大或者缓存不命中的情况下。
- 优点:分页式内存管理可以实现非连续内存分配,简化了地址空间的管理,同时也方便了内存保护和共享。没有外碎片,每个内碎片不超过页的大小
- 缺点:由于每个页面的大小固定,可能会浪费一些内存空间(存在内部碎片)
分段式
出现的原因:为了使程序和数据可以被划分为逻辑上独立的地址空间并且有助于共享和保护。
将虚拟地址空间分成若干个逻辑段(segment),每个段可以是不同大小的,每个段的大小和属性都可以在进程运行时动态变化,可以将不同的数据存储在不同的段中。
- 优点:分段式内存管理的优点是可以更加灵活地使用内存,避免了分页式中的内部碎片问题
- 缺点:分段式内存管理可能会导致外部碎片问题,因为每个段的大小不一定是固定的,可能会留下一些不可用的空间。
段页式
页式存储有效的提高内存利用率,分段存储能反映程序的逻辑结构并有利于段的分享,将这两种方式结合一下。这种二者结合,将作业的地址空间首先被分成若干逻辑段,每段有自己的段号,每个段分成若干大小固定的页
页面置换算法
当物理内存不足时,需要将一部分页从物理内存中置换出去,以便为新的页腾出空间,通常使用的页面置换算法有FIFO算法、最近最少使用算法(LRU算法)、时钟算法(Clock算法)等。
页面缓存
为了提高文件访问速度,操作系统会将常用的文件或者程序的页缓存到物理内存中,当需要访问这些文件或程序时,可以直接从物理内存中读取,而不需要从硬盘中加载。
内存映射文件
将文件映射到虚拟地址空间中,可以让应用程序通过内存访问文件,操作系统将自动管理文件在物理内存和硬盘之间的数据传输。
Copy-on-write
一个进程fork(创建一个子进程)时,父进程的虚拟地址空间会被复制到子进程中,但是操作系统不会真正复制物理内存中的数据,而是让父进程和子进程共享同一块物理内存,只有当其中一个进程修改了内存中的数据时,操作系统才会复制出一份新的数据,以保证父进程和子进程的内存空间独立。