内容系听课复习所做笔记,图例多来自课程截图
分段原理
与“分页”最大的区别就是:离散分配时所分配地址空间的基本单位不同
分页是不管程序的逻辑的,规定了页大小就是这么多,但是分段是依据程序自身逻辑来划分的(分页的基本单位“页”的长度是固定的,分段划分的基本单位“段”是大小不一的)
既然是分段(类似于分页,肯定也是离散存储),那么就需要段表保存映射的信息,需要查表完成程序的逻辑地址空间到物理地址空间的映射(转换)
因为段长不是固定的,所以段表需要记录段长(对比来看,页表不需要记录页长)
然后关于上面为什么是 16 + 32 = 48 16+32=48 16+32=48位,因为基址是内存的物理地址(确切的说是这个段在内存中的起始地址)
段表实现逻辑段到物理内存区的映射(逻辑地址->物理地址)
地址转换方式
段表存储的东西
地址变换是要求对于变化的逻辑空间里的地址已知,至于要用的东西在哪个段里,是看程序结构决定的。
与页不同的是,这里得检查段内地址是否超过段长
显然,需要两次访存(第一次是查段表,第二次是访问目标的内存单元)
对比
页是信息的物理单位。分页的主要目的是为了实现离散分配,提高内存利用率。分页仅仅是系统管理的需要,完全是系统行为,对用户是不可见的。
段是信息的逻辑单位。分段的主要目的是更好地满足用户需求。一个段通常包含着一组属于一个逻辑模块的信息。分段对用户是可见的,用户编程时需要显式地给出段名。
页的大小固定且由系统决定。段的长度却不固定,决定于用户编写的程序。
分页的用户进程地址空间是一维的,程序员只需给出一个记忆符即可表示一个地址。
分段的用户进程地址空间是二维的,程序员在标识一个地址时,既要给出段名,也要给出段内地址。
为什么说页是一维的,因为它的逻辑地址空间是被均匀等分的,当给出一个确定的逻辑地址时,总能找到处于第几页,及其对应的页内偏移。比如逻辑地址是9,页长为4,很容易知道是在第 9 / 4 = 2 9/4=2 9/4=2页,页内偏移是 9 % 4 = 1 9\%4=1 9%4=1。但是段式管理并不可以。
优点
分段比分页更容易实现信息的共享和保护。不能被修改的代码称为纯代码或可重入代码(不属于临界资源),这样的代码是可以共享的。可修改的代码是不能共享的
出现下图这种情况,对于分页管理,一个页存在允许被其他进程访问和不允许的两部分,这样不好标记到底允不允许其他进程访问,而段式存储则不会有这种问题。
分段和分页都可以使用快表机制