0
点赞
收藏
分享

微信扫一扫

JS数组的一些方法

136. 伙伴系统 (buddy system)

伙伴系统是一个页面管理系统。

用一个数组来保存页的链表,索引为 0 的链表每个内存块一个页,索引为 1 的内存块由两个页拼成,以此类推。最大的内存块由 10 个页组成,即共 10 * 4KB = 4MB 每块。

申请过程:假设现在需要申请一个 4KB 的页,从索引为 0 的链表上去找,发现没有,则会往下即从索引为 1 的链表中找。假设有一个 8KB 的内存块,则它会将其拆分成两个页,一个将其地址返回给用户,一个放到索引为 0 的链表上。

释放过程:假设现在有两个 4KB 的页释放了,首先会放到索引为 0 的链表中,然后判断是否可以合并。合并规则是假如这两个页在物理内存中是相邻的,则可以称为伙伴,即合并成更大的内存款放到下一个链表中。假设这两个 4KB 的页物理地址相邻,则会合并成 8KB 的内存块加到索引为 1 的链表上。

优点:伙伴系统解决外部碎片问题,slab 缓存解决内部碎片问题。

在这里插入图片描述

137. slab 缓存

slab 工作机制:因为伙伴系统每次最少会申请一个页,申请小内存会比较浪费,所以就引入了 slab 缓存机制。通过 slab 可以将得到的页在缓冲中拆分成相等的更小的页,并用链表维护起来,当有小内存申请时就直接从 slab 缓冲中获取。

在这里插入图片描述

138. 简单说一下里操作系统保护模式和实模式,区别在哪?

其实问这个问题的目的,是为了引出虚拟内存,所以他后面都往虚拟内存方向问了。

  • 实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,系统程序和用户程序并没有区别对待,而且每一个指针都是指向实际的物理地址。这样一来,用户程序的一个指针如果指向了系统程序区域或其他用户程序区域,并修改了内容,那么对于这个被修改的系统程序或用户程序,其后果就很可能是灾难性的。再者,随着软件的发展,1M 的寻址空间已经远远不能满足实际的需求了。最后,对处理器多任务支持需求也日益紧迫,所有这些都促使新技术的出现。
  • 为了克服实模式下的内存非法访问问题,并满足飞速发展的内存寻址和多任务需求,处理器厂商开发出保护模式。在保护模式中,除了内存寻址空间大大提高;提供了硬件对多任务的支持;物理内存地址也不能直接被程序访问,程序内部的地址 (虚拟地址) 要由操作系统转化为物理地址去访问,程序对此一无所知。至此,进程 (程序的运行态) 有了严格的边界,任何其他进程根本没有办法访问不属于自己的物理内存区域,甚至在自己的虚拟地址范围内也不是可以任意访问的,因为有一些虚拟区域已经被放进一些公共系统运行库。这些区域也不能随便修改,若修改就会有出现 linux 中的段错误,或 Windows 中的非法内存访问对话框。
举报

相关推荐

0 条评论