在操作系统中,总是会遇到内存分页,磁盘分块等概念。以往,我总把它当作约定俗成的公理去记忆。最近,我有了些新的理解,把写在这里,欢迎讨论。
首先,我认为内存页,磁盘块,缓存cacheline都是逻辑概念,即是为了在软件层面达到某种便于管理的目的而设计的。
为什么磁盘要分块?
我们知道对于HDD来说,其硬件最小的读写单位是扇区(读写粒度 512字节)。而一般HDD的容量大,文件系统若按扇区为读写粒度并不方便(这种表述并不具体)。而且由于磁盘IO性能的瓶颈,细粒度的读写既低效,也会损害磁盘的寿命。因此文件系统对磁盘的读写是将多个扇区看做一个块(这个概念在windows中被称为簇)。文件系统以块大小为单位对磁盘进行读写。块大小一般为扇区的2的n次方倍。(不固定,现在也出现了大小为4kB的扇区)。
为什么内存要分页?
内存相对于磁盘是个高性能存储设备,物理上内存是按字节寻址的。分页这个概念出现在虚拟内存中。虚拟内存的意义是:对于每个进程来说,他们拥有内存(虚拟)空间是大且连续的。而这些大且连续的虚拟内存对应在物理内存上的位置是离散分布的。其中的映射关系被称为页表。但即便这样为什么要分页呢?直接按字节把每个虚拟内存地址和物理内存地址一一对应不行么?我的答案是:这么做理论上不会产生内存碎片,因为粒度足够小,但这需要维护一个巨大的映射关系表。 而且现代处理器都采用多进程共享内存资源,每个进程都需要建立和维护属于自己的页表。这样的页表的存储空间开销会很大。因此操作系统把虚拟内存分为一定大小的页面(一般4096B)。物理内存相应划分为一定大小的页面帧。据此,虚拟地址划分为虚拟页号+页内偏移,物理地址划分为页帧号+页内偏移。这样形成的页表较为精简,方便管理,做虚拟页号与页帧号之间的映射。而页大小也不能过大,这样在实际物理内存上可能会产生小于一个页大小的内存碎片。
为什么缓存要有cacheline?
缓存比内存性能还好,那不更有理由以字节为读写粒度了么?应该这么理解,缓存设置的目的是为了弥补不同速率设备间的性能差异,其原理是利用访存的局部性。而存储一段连续的内存块(这里的内存块也是个逻辑概念,且仅存在于缓存逻辑中,与磁盘块或内存页并不相同)是利用了访存的空间局部性,即当前访问的位置,在未来不远的时间内再次访问其相邻位置的可能较大。这也是为了增加cache命中的手段。
以上均属于个人理解,欢迎留言讨论。