H__D  

一、虚拟内存

  虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
现代所有用于一般应用的操作系统都对普通的应用程序使用虚拟内存技术,老一些的操作系统,如DOS和1980年代的Windows,或者那些1960年代的大型机,一般都没有虚拟内存的功能

  

  参考:https://zhuanlan.zhihu.com/p/96098896

二、MMU 内存管理单元

  MMU是Memory Management Unit的缩写,中文名是内存管理单元,有时称作分页内存管理单元(英语:paged memory management unit,缩写为PMMU)。它是一种负责处理中央处理器(CPU)的内存访问请求的计算机硬件。它的功能包括虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、中央处理器高速缓存的控制,在较为简单的计算机体系结构中,负责总线的仲裁以及存储体切换(bank switching,尤其是在8位的系统上)。

  MMU位于处理器内核和连接高速缓存以及物理存储器的总线之间。当处理器内核取指令或者存取数据的时候,都会提供一个有效地址(effective address),或者称为逻辑地址、虚拟地址。这个地址是可执行代码在编译的时候由链接器生成的。不同于开发嵌入式处理器系统的程序员,桌面型计算器的程序开发人员通常对硬件的物理配置信息所知甚少。将存储器系统虚拟化,程序员就不需要了解存储器的物理配置细节。当应用代码需要使用存储空间时,操作系统通过MMU为其分配合适的物理存储空间。有效地址不需要和系统的实际硬件物理地址相匹配,而是通过MMU将有效地址映射成对应的物理地址,以访问指令和数据。 [1] 

  每条MMU匹配规则所对应的存储器的大小定义为页。页的大小通常设定为不会对程序的性能造成显著影响的最小的程序和代码的长度。当暂时不使用物理内存的内容时,可将其保存到硬盘等外部存储器里,将其空间用于其他程序;当再次使用这部分内容时再从外部存储器写回到实际物理内存中。通过这种方法,系统就可以提供多于实际物理内存容量的“虚拟内存”。如果MMU定义的页太大,那么进行虚拟内存页面替换所花费的时间就太长;如果页太小,就会引起过于频繁的页面替换。通常最小的页设定为4 KB。
  
  

三、内核空间 (Kernel space)与 用户空间(User space)

  Kernel space 是 Linux 内核的运行空间,User space 是用户程序的运行空间。为了安全,它们是隔离的,即使用户的程序崩溃了,内核也不受影响。

  虚拟内存被操作系统划分成两块:内核空间和用户空间,内核空间是内核代码运行的地方,用户空间是用户程序代码运行的地方。当进程运行在内核空间时就处于内核态,当进程运行在用户空间时就处于用户态。

  

  Kernel space 可以执行任意命令,调用系统的一切资源;User space 只能执行简单的运算,不能直接调用系统资源,必须通过系统接口(又称 system call),才能向内核发出指令

  注:通过系统接口,进程可以从用户空间切换到内核空间。

 

  参考:https://cloud.tencent.com/developer/article/1352415

四、内核态和用户态

  虚拟内存被操作系统划分成两块:内核空间和用户空间,内核空间是内核代码运行的地方,用户空间是用户程序代码运行的地方。当进程运行在内核空间时就处于**内核态**,当进程运行在用户空间时就处于**用户态**,为了安全,它们是隔离的,即使用户的程序崩溃了,内核也不受影响。说起这个概念就是因为线程上下文切换的概念。虽然线程上下文切换比进程切换成本要低但是,线程切换也是很影响性能的。线程上下文切换就涉及用户态到内核态的转换。

 

  参考:https://www.jianshu.com/p/605045ad96b6

 五、读写文件数据

  读写文件数据的方式

  1、传统的read()和write()系统调用

  2、mmap()内存映射

read()实现

  先来看下用户进程调用read()在Linux中是怎样实现的。比如要读取磁盘上某个文件的8192个字节数据,那么这8192个字节会首先拷贝到内存中作为page cache(方便以后快速读取),然后再从page cache拷贝到用户指定的buffer中,也就是说,在数据已经加载到page cache后,还需要一次内存拷贝操作和一次系统调用。

  

mmap()内存映射实现

  使用mmap(),则在磁盘数据加载到page cache后,用户进程可以通过指针操作直接读写page cache,不再需要系统调用和内存拷贝。

  mmap()其实只是将一个文件的一部分内容映射到了进程虚拟地址空间中的一个VMA区域,并没有真正分配物理内存,只有等到进程真正访问这个VMA的时候,才会触发page fault,将这部分文件内容从磁盘拷贝到内存中。

   
 

  参考:  

  mmap映射 [一]:https://zhuanlan.zhihu.com/p/67894878

  mmap映射 [二]:https://zhuanlan.zhihu.com/p/71517406

 
 
posted on 2021-06-08 02:15  H__D  阅读(92)  评论(0编辑  收藏  举报