『面试问答』:什么是虚拟内存?为什么要有虚拟内存?
面试官: 请说一下,什么是虚拟内存?为什么要有虚拟内存?
虚拟内存,就是机器上运行的一个个的进程,访问的都是虚拟的内存,比如C语言中的指针指向的内存地址,或者gdb调试工具看到的地址,都是虚拟的,并不是机器上的实际物理内存。
虚拟内存是相对于物理内存来说的,物理内存,简单来说就是电脑上看到的那些内存条,是机器真正可以实际访问的物理内存空间。比如内存条是 8G 的,那计算机可用的物理内存就是 8G。
在一台计算机上,如果只有单个进程独享整个物理内存,当然是没有问题的,但是现在的操作系统都是支持多进程并发运行的,当两个进程同时对同一块物理内存地址进行读写时,显然是有冲突的。此外,进程申请的内存可能并没有使用,如果有太多的进程同时申请了大量的内存,也会导致物理内存不够用。
为了防止多进程运行时造成的这些使用内存地址的冲突,操作系统引入了虚拟内存,为每个进程提供了一个独立的虚拟内存空间,使得进程以为自己独占全部内存资源。
引入虚拟内存后,进程访问的虚拟内存地址通过CPU芯片内部集成的内存管理单元MMU,转换成物理地址,然后再通过物理地址访问内存。
对于系统上运行的进程来说,在32位系统上,可以拥有4GB虚拟内存空间,在64位系统上,则可以拥有256T虚拟内存空间。
由于每个进程都有一个这么大的地址空间,导致所有进程的虚拟内存加起来,自然要比实际物理内存大得多。所以,并不是所有的虚拟内存都会分配物理内存,只有那些实际使用的虚拟内存才会分配物理内存。
当进程对某块虚拟内存进行读写时,CPU 就会去访问这块内存, 这时如果发现这块虚拟内存没有映射到物理内存, CPU 就会产生缺页中断,进程会从用户态切换到内核态,并将缺页中断交给内核的缺页中断函数处理,这时才会真正地为它分配物理内存。
操作系统使用分段和分页的机制管理虚拟地址与物理地址的映射关系。
内存分段机制,简单理解就是根据程序申请使用内存的需要,来把物理内存分成一段一段内存来管理,比如程序需要100M的内存,分段机制就给1段100M连续空间的物理内存与之对应。
内存分页将整个虚拟内存和物理内存空间分成一段段固定大小的片,虚拟内存和物理内存的映射以这个片为最小单位进行管理,我们把这个片称为页,在Linux系统上,页的大小为4KB。
此外,为了解决页表过大的问题,操作系统引入了多级页表机制。
为了解决页表访问慢的问题,在CPU中加入了TLB页表缓存机制。
分享软件开发岗位面试题及答案