explorer

万丈高楼平地起,勿在浮沙筑高台

0%

理解交换策略,当内存吃紧时,系统是如何决定哪个内存页面应该被置换到交换分区中的?

阅读全文 »

当只有一级页表时,页表本身所占用的空间就会很大,而多级页表可以解决这个问题。

假设页块大小为 4KB,那么对于 32 位系统来说,一个进程需要映射到 1048576 个页块。

一个页表项为 4 字节,那么一个进程的页表就是 4*1048576 = 4MB。

假设一个系统中运行了 1000 个进程,那么页表总共就要占用 4000 MB,这显然是无法使用的。
阅读全文 »

前面说过 MMU 中只存放页表基地址,而页表是存放在 SDRAM 中的。 每次执行指令或读写数据前,都需要先将虚拟地址转换为物理地址,这就需要先读取页表的内容,这无疑是很慢的。

所以需要在 MMU 中增加一个 cache,也就是快表(translation-lookaside buffer, TLB), 当要进行地址转换时,如果 TLB 中有缓存的转换关系,那么就可以不用访问页表从而大大提高了转换速度。

阅读全文 »

前面我们将空闲内存最开始分为一个整体,然后用户申请多少就给多少,这最终会导致很多大小各异的内存碎片。

  • 频繁的申请和释放,会生成很多很小的空闲内存碎片,比如就几个字节。这在很多时候无法满足用户申请的内存大小。

另一个方法是将内存空间划分为以页为单位(比如 4KB),虚拟地址空间和物理地址空间都以固定大小的页划分,这样分配的内存最小单位就是页。

  • 相对来讲,这种方式减缓了内存碎片的严重程度。因为空闲内存至少是一个页,在很多时候用户还是可以申请到内存的。
阅读全文 »

学习书籍:

这是我第一次接触泛型算法,既羞愧又激动……

标准库容器所提供的操作集合很小,因为有泛型算法可用于不同类型的容器和不同类型的元素。

泛型算法:

  • 算法:实现了经典算法的公共接口
  • 泛型:用于不同类型的元素和多种容器类型
阅读全文 »

理解内存管理的一些细节,如何尽量避免内存碎片又要保持内存申请和释放的高效率?

  • 外部碎片(external fragmentaion):指的是当被申请的内存空间遍布内存各个位置,导致剩下很多小的空闲内存,从而形成碎片
    • 这就会出现总空闲内存虽然远大于申请内存,但申请内存依然会失败的情况
  • 内部碎片(internal fragmentation):当内存管理器返回的内存大小大于申请的大小时,多于的部分程序不会使用,也就浪费了
    • 这是因为内存管理器以块为单位管理内存空间,申请得到的内存总是块大小的整数倍
阅读全文 »

如果直接将整个程序的 address space 映射到物理内存,那么物理内存将会有很大的浪费,并且也无法运行太多其他程序,所以需要理解内存分段。

阅读全文 »