用户程序逻辑地址空间->页(连续)
物理内存空间->块(离散)
页表(内存中):key=页号,value=块号(内存中的物理块)
快表(高速缓冲区存储器中):key=页号,value=块号(内存中的物理块)
1、基本思想:将用户程序地址空间分成若干个大小不等的段,每段可以定义一组相对完整的逻辑信息。存储分配时,以段为单位,段与段在内存中可以不相邻接,也实现了离散分配。
2、分段存储方式的引入:方便编程、分段共享、分段保护、动态链接、动态增长
3、分段地址结构:作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。例程序段、数据段等。每个段都从0开始编址,段长不一样,并采用一段连续的地址空间。段的长度由相应的逻辑信息组的长度决定,因而各段长度不等。整个作业的地址空间是二维的。一维是段号,一维是(段内地址/段表项的长度);由于分段管理中,每个段内部是连续内存分配,但是段和段之间是离散分配的,因此也存在一个逻辑地址到物理地址的映射关系,相应的就是段表机制。段表中的每一个表项记录了该段在内存中的起始地址和该段的长度。段表可以放在内存中也可以放在寄存器中。
4、访问内存的次数:访问内存的时候根据段号和(段内地址/段表项的长度/段内位移量)计算当前访问段在段表中的位置,然后访问段表,得到该段的物理地址,根据该物理地址以及段内偏移量就可以得到需要访问的内存。由于也是两次内存访问,所以分段管理中同样引入了联想寄存器。
5、如果存储器采用基本分段机制,那么操作系统会为每个进程或任务建立一个段表
分段总结:作业空间是二维的,一维段号、一维段内地址/段内位移量(段长),段表由段号、段长、基址组成,用户通过段号到段表中获得段长与基址,从而定位到内存中的数据。内存空间中,每个段之间不连续,但是每个段自己内部是连续的
1、段是信息的逻辑单位,分段的目的是为了更好地实现共享,根据用户的需要划分,因此段对用户是可见的;页是信息的物理单位,是为了管理主存的方便而划分的,分页是为了实现非连续分配,以便解决内存碎片问题,或者说分页是由于系统管理的需要,其对用户是透明的。
2、段的大小不固定,由它所完成的功能决定;页的大小固定(一般为4K),由系统决定,将逻辑地址划分为页号和页内地址是由机器硬件实现的。
3、段向用户提供二维地址(段号+段内地址);页向用户提供的是一维地址(页号)
4、段是信息的逻辑单位,便于存储保护和信息的共享,页的保护和共享受到限制。
分页系统能有效地提高内存的利用率,而分段系统能反映程序的逻辑结构,便于段的共享与保护,将分页与分段两种存储方式结合起来,就形成了段页式存储管理方式。
在段页式存储管理系统中,作业的地址空间首先被分成若干个逻辑分段,每段都有自己的段号,然后再将每段分成若干个大小相等的页。对于主存空间也分成大小相等的页,主存的分配以页为单位。
段页式系统中,作业的地址结构包含三部分的内容:段号、页号、页内位移量
程序员按照分段系统的地址结构将地址分为段号与段内位移量,地址变换机构将段内位移量分解为页号和页内位移量。
为实现段页式存储管理,系统应为每个进程设置一个段表,包括每段的段号,该段的页表始址和页表长度(本来是段内基址和段长),如下图。每个段有自己的页表,记录段中的每一页的页号和存放在主存中的物理块号。
如果采用段页式结合的机制,那么一般一个进程或任务,操作系统会给其建立一个段表,而段表中的每个段又会对应一个页表,也就是说,段页式机制的每个进程有一个段表,有多个页表。
(1)程序执行时,从PCB中取出段表始址和段表长度,装入段表寄存器。
(2)由地址变换机构将逻辑地址自动分成段号、页号和页内地址。(涵盖了段表+页表)
(3)将段号与段表长度进行比较,若段号大于或等于段表长度,则表示本次访问的地址已超越进程的地址空间,产生越界中断。
(4)将段表始址与段号和段表项长度的乘积相加,便得到该段表项在段表中的位置。
(5)取出段描述子得到该段的页表始址和页表长度。
(6)将页号与页表长度进行比较,若页号大于或等于页表长度,则表示本次访问的地址已超越进程的地址空间,产生越界中断。
(7)将页表始址与页号和页表项长度的乘积相加,便得到该页表项在页表中的位置。
(8)取出页描述子得到该页的物理块号。
(9)对该页的存取控制进行检查。
(10)将物理块号送入物理地址寄存器中,再将有效地址寄存器中的页内地址直接送入物理地址寄存器的块内地址字段中,拼接得到实际的物理地址。
在段页式系统中,为了获得一条指令或数据,须三次访问内存。第一次访问是访问内
存中的段表,从中取得页表始址;第二次访问是访问内存中的页表,从中取出该页所在的物理块号,并将该块号与页内地址一起形成指令或数据的物理地址;第三次访问才是真正从第二次访问所得的地址中,取出指令或数据。
作业空间分段,再将每段分成大小相等的页,内存也分页
作业空间是二维的,分段号、页号、页内偏移量
程序员按照分段系统的地址结构将地址分为段号与段内位移量(段的长度),地址变换机构将段内位移量分解为页号和页内位移量
打个比方,比如说你去听课,带了一个纸质笔记本做笔记。笔记本有100张纸,课程有语文、数学、英语三门,对于这个笔记本的使用,为了便于以后复习方便,你可以有两种选择。
第一种是,你从本子的第一张纸开始用,并且事先在本子上做划分:第2张到第30张纸记语文笔记,第31到60张纸记数学笔记,第61到100张纸记英语笔记,最后在第一张纸做个列表,记录着三门笔记各自的范围。这就是分段管理,第一张纸叫段表。
第二种是,你从第二张纸开始做笔记,各种课的笔记是连在一起的:第2张纸是数学,第3张是语文,第4张英语……最后呢,你在第一张纸做了一个目录,记录着语文笔记在第3、7、14、15张纸……,数学笔记在第2、6、8、9、11……,英语笔记在第4、5、12……。这就是分页管理,第一张纸叫页表。你要复习哪一门课,就到页表里查寻相关的纸的编号,然后翻到那一页去复习
来自码农翻身 关于非连续内存分配的理解介绍:
虚拟内存:时间局部性原理+空间局部性原理
分页:
每页4KB,装载程序的时候按4KB装载
物理内存分块/页框(Page Frame),虚拟地址空间分页
操作系统维持一个页表,用来映射虚拟页面和物理页面
如果访问到一个没有被映射到物理内存的页面,则产生缺页中断
地址分为两部分:页号+偏移量(分段机制),由CPU的MMU实现地址的转换
由页号p在内存中的页表找到对应的页框号/块f,再到程序的物理地址中找到f块,对应偏移量i就可以得到程序了
为了防止每次都要多次访问内存,可以在MMU的缓存中存放快表
分段+分页:段页式存储管理机制
将程序分为代码段、数据段、堆栈段便于存储管理(比如修改代码段的时候可以立马抛出异常)
地址分为段号+偏移量,通过段号找到段的基址,和偏移量相加得到一个线性地址,这个线性地址再通过分页系统进行转换,最后形成物理地址
参考链接:
http://link.zhihu.com/?target=http%3A//blog.csdn.net/wangrunmin/article/details/7967293