内存管理之分段分页机制

分页概念:逻辑空间分页,物理空间分块(页框),页与块同样大,页连续块离散,用页号查页表,由硬件做转换,页面和内存块大小一般选为2的若干次幂(便于管理)。
页表作用:实现从页号到物理地址的映射。操作系统需要为每个进程维护一个页表,页表给出了该进程的每一页对应的页框的位置。

简单分页类似于固定分区,只是采用分页技术的分区相当小,一个程序可以占据多个分区,而且这些分区不需要是连续的。而固定分区不一样,一个程序装入一个分区中。
请求分页的基本思想
1.请求分页=分页+请求
2.请求分页提供虚拟存储器
3.页表项中的状态位指示该页面是否在内存,若不在,则产生一个缺页中断

页面置换:把一个页面从内存调换到磁盘的对换区中
抖动:在具有虚存的计算机中,由于频繁的调页活动使访问磁盘的次数过多而引起的系统效率降低的一种现象

常用的页面置换算法
先进先出法:(置换次数比较多)
最佳置换法(OPT):选择将来不再使用或在最远的将来才被访问的页调换出去(不便于实现)
最近最少使用置换法(LRU):当需要置换一页时,选择在最近一段时间里最久没有使用过的页面予以淘汰
最近未使用置换法(NUR):是LRU算法的近似方法,选择在最近一段时间里未被访问过的页面予以淘汰

 内存管理之分段分页机制_第1张图片

地址转换:若使用16位地址,页大小为1KB,即1024字节,相对地址为1502的二进制形式为000001 0111011110.由于页大小为1KB,偏移量为10位,剩下的6位为页号,因此一个程序最多有2^6=64页组成,每页大小1KB。

考虑一个n+m位的地址,最左边的n位是页号,最右边的m位是偏移量,设n=6,m=10,地址转换需要经过以下步骤

1,提取页号,即逻辑地址最左边的n位

2,以这个页号为索引,查找该进程页表中相应的页框号k

3,该页框的起始物理地址为k*2^m,该地址加上偏移量就是物理地址

逻辑地址为 000001 0111 0111 10,页号为1,偏移量为478,假设该页在内存页框6(000110)中,则物理地址页框号为6,偏移量为478,物理地址为

000110 0111 011110
相对地址=1502 000001 0111 0111 10

 

用户进程2700字节

                                                                                              

                   a分区


逻辑地址=页号1,偏移量=478 000001 0111 0111 10

                       478

页0          

页1                

页2                        

内部碎片      

                     b分页页大小1kb


 逻辑地址=段号1,偏移量752 0001 0010 1111 0000

段0                         750字节 

   段1                    1950字节

 

段式管理的基本思想是:把程序按内容或过程(函数)关系分成段,每个段有自己的名字(编号)。一个作业或进程的虚拟存储空间都对应于一个由段号(段号:段 内偏移)构成的二维地址,编译程序在编译链接过程中就直接形成这样的二维地址形式。段式管理以段为单位分配内存,然后通过地址变换将段式虚拟地址转换成实际的内存物理地址。和页式管理一样,段式管理也采用只把那些经常访问的段驻留内存,而把那些将来一段时间不被访问的段放入外存,待需要时自动调入的方法实现虚拟存储器。

段式管理把一个进程的虚拟地址空间设计成二维结构,即段号(段号:段内偏移)的形式。前面己经谈到,与页式管理编译程序产生一 维连续地址不同,段式管理系统中的编译程序编译形成多个段及段的名字或编号,各个段号之间无顺序关系。与页式管理页长度相同不一样,段的长度是不同的,每个段定义一组逻辑上完整的程序或数据。例如,在DOS操作系统中,一个程序内部被分为了正文段、数据段、堆栈段等。每个段是一个首地址为O并连续的一维线 性空间。

 

由于使用大小不等的段,分段类似于动态分区。在没有采用覆盖技术和使用虚拟内存的情况下,为执行一个程序,需要把它所有的段都装入内存。与动态分区不同的是,在分段方案中,一个程序可以占据多个分区,并且这些分区不要求是连续的。分段消除了内部碎片,但是和动态分区一样,它会产生外部碎片。

进行地址转换:考虑一个n+m位的地址,左边的n位是段号,右边的m位是偏移量。n=4;m=12;因此最大段长度为2^12=4096

1,提取段号,即逻辑地址最左边的n位

2,以这个段号为索引,查找该进程段表中该段的起始物理地址

3,最右边m位代表偏移量,偏移量和段长度进行比较,如果偏移量大于该段的长度,则该地址无效

4,物理地址为该段的起始物理地址与偏移量的和。

假设逻辑地址为 0001 0010 1111 0000 段号为1,偏移量为752,假设该段的起始武力地址为   0010 0000 0010 0000 则相应的物理地址为:

            + 0000 0010  1111 0000

            = 0000 0011  0001 0000

总之,采用简单分段技术,进程被划分为许多段,段的大小不需要相等,当一个进程需要调入内存时,,它的所有段装入内存的可用区域,并建立一张段表。

你可能感兴趣的:(内存,分页,管理,内存管理)