前言
此篇文章是我在B站学习时所做的笔记,大部分图片都是课件老师的PPT,方便复习用。此篇文章仅供学习参考。
提示:以下是本篇文章正文内容
知识总览
分段
- 进程的地址空间:按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名(在低级语言中,程序员使用段名来编程),每段从0开始编址
- 内存分配规则:以段为单位进行分配,每个段在内存中占据连续空间,但各段之间可以不相邻。
解说:
由于各个分段是按功能模块来划分的,并且这些段名是由用户自己定义的,所以用户在读这个程序的时候就知道这两句代码做的事情是把某个全局变量的值赋值X的这个子函数当中的某个变量,因此对于用户来说采用分段机制之后程序的可读性还是很高的。在用户编程时,使用的是段名来操作各个段,但是在CPU具体执行的时候其实是使用段号这个参数,所以编译程序会把段名转换为与它们各自相对应的段号,然后CPU再执行这些指令的时候是根据段号来区分各个段的。
段号的位数决定了每个进程最多可以分几个段
段内地址位数决定了每个段的最大长度是多少
段表
问题:程序分多个段,各段离散地装入内存,为了保证程序能正常运行,就必须能从物理内存中找到各个逻辑段的存放位置。为此,需为每个进程建立一张段映射表,简称“段表”。
相对于页表来说,段表多了“段长”,因为每个分段的长度可能是不一样的,而在在分页存储管理当中,每个页面的长度是一样的,所以在分页存储中页长是不需要显示记录的,在分段存储中是需要显示的。
物理内存大小为4GB(即232B,可用32位表示整个物理内存地址空间)
1个字节=8位(1B=8bit)
48位大小的数字,只用6B的空间就可以表示。
地址变换
解说:
如果说此时要访问的逻辑地址的段号是2,然后段内地址是1024的话,那首先需要用段号2和段表长度M进行一个检查,那显然此时这个进程的段表长度应该是3,因为它有3个段,所以段号是<段表长度的,因此段号合法,所以就可以进行下一步用段号和段表始址查到这个段号对应的段表项,那这样的话就找到了2号段对应的段表项,那接下来需要对段内地址的合法性进行一个检查,段内地址和段长对比,发现2号段的段长是6k,而段内地址是1024也就是1k,所以段内地址<段长,因此在这个地方并不会产生越界中断,可以继续执行下去,那接下来通过这个段表项,我们知道了这个段在内存当中存放的起始地址是40k,所以用这个段的起始地址40k+段内地址w,也就是1024,那这样的话,我们就得到了最终想访问的目标内存单元,也就是A那个变量存放的位置,那这样的话,就完成了对这个逻辑地址的访问。
分段、分页管理的对比
- 页是信息的物理单位。分页的主要目的是为了实现离散分配,提高内存利用率。分页仅仅是系统管理上的需要,完全是系统行为,对用户是不可见的。
- 段是信息的逻辑单位。分段的主要目的是更好地满足用户需求。一个段通常包含着一组属于一个逻辑模块的信息。分段对用户是可见的,用户编程时需要显式地给出段名。
- 页的大小固定且由系统决定。段的长度却不固定,决定于用户编写的程序。
- 分页的用户进程地址空间是一维的,程序员只需给出一个记忆符即可表示一个地址。
- 分段的用户进程地址空间是二维的,程序员在标识一个地址时,既要给出段名,也要给出段内地址。
- 分段比分页更容易实现信息的共享和保护。
不能被修改的代码称为纯代码或可重入代码(不属于临界资源),这样的代码是可以共享的。
可修改的代码是不能共享的
- 访问一个逻辑地址需要几次访存?
1、分页(单级页表)︰第一次访存――查内存中的页表,第二次访存――访问目标内存单元。总共两次访存
2、分段:第一次访存――查内存中的段表,第二次访存――访问目标内存单元。总共两次访存 - 与分页系统类似,分段系统中也可以引入 快表 机构,将近期访问过的段表项放到快表中,这样可以少一次访问,加快地址变换速度。