操作系统(二)内存管理——页式与段式存储
今天没有代码,因为我还没想明白怎么写!
因为不知道今天的代码应该怎么写,所以决定先写一写内存分配的原理。
先忽略掉教材里面众多有关于内存管理的知识点,只简单介绍一下页式和段式存储两种内存管理方式。为之后引入保护模式和长模式进行一下铺垫。
内存管理的意义
在我个人的观念里,引入内存管理主要有一下两个原因:
- 随着CPU从开始的20位增加到32位再到现在的64位CPU,可以直接访问的内存从最初的只有1M增加到4G再到16EG(理论值,目前支持到128G)。为了管理如此大量的存储空间,要设计一些管理模式(算法)去管理这样基数的内存,使得内存的分配有程序可寻。
- 现代程序对内存的需求逐渐加大,加之分时系统的内存中可能会有大量程序正在运行,如何合理给每个程序分配内存才能将计算机各部件的利用率提高成为了一个需要深入研究的问题。
孙子曰:凡治众如治寡,分数是也。
总而言之,内存管理就是通过设计一种合理的数据结构,来进行内存的管理,以降低系统的复杂度,并提高系统的效率。
今天暂且只介绍页式存储和段式存储。
段式存储
段式存储是为了解决以上两种问题所提出的一种算法。段式存储将内存分割为若干长度不同或相同的数据段;要求每个段内的内存连续,段间地址不必连续。
在学习的过程中发现,有两种分段机制,一种是在操作系统进行加载时的对内存进行的分段,另一种是用户进程中按自然段进行分段。具体还需要在以后学习中查阅资料理解。
每个段的描述信息,包括段基址、段长等信息将以下图的形式进行组成,形成一个段表项,由多个段表项组成组成一张段表,存储在内存中。
在对内存进行分段之后,需要通过以下的方式来访问内存地址。
31 … 16 | 15 … 0 |
---|---|
段号S | 段内偏移量W |
程序在访问内存地址时,分别给出段号S和段内偏移量W,再根据段号S查找段表获得段基址,然后计算得到要访问的实际地址。
页式存储
在这里仅提及基础页式存储的原理,并不涉及有关虚拟内存的内容。
和段式存储不同,页式存储的每个页面的大小是固定的。因此当给进程分配内存时,若有进程内存不足一页时,将分配一整页。分页存储的逻辑地址结构如下:
31 … 16 | 15 … 0 |
---|---|
页号P | 段内偏移量W |
和段式存储的逻辑地址结构基本相同。因此,也同样需要引入一张页表进行地址的映射。由于每一页的长度L固定,所以可以根据逻辑地址A计算得到页号P和段内偏移量W。
再根据P查找页表,获得页的起始地址F,即可以求得实际地址。
随着页表项的增加,为了提高查找速度,以及降低内存占用,可以引入多级页表,在此不再深入,有兴趣可以自行查阅教材。
需要注意的是,在页式存储中,每个进程都有自己的页表。
尽管页式存储和段式存储原理上相近,但是这两种存储方式有一些差异:
- 一般来说页式存储的每个基本单元(页)的大小要小于段式存储中的段。
- 页式存储在分配内存时可能会产生内部碎片,而段式不会。
- 还有好多。。。
段页式管理
在页式和段式存储方式出现以后,又有牛人将其进行了结合,形成了段页式管理方式。目前还用不到,所以懒得写了,可以自行查阅教材。