1.概念原理:
段式存储机制即按照程序的自身逻辑关系,划分成若干个程序段和数据段。每个段会有一个短号。即如图
2.内存分配机制:
以段为单位划分内存,并不固定每个段的大小。其中也有段逻辑地址以及段物理地址的概念,不了解逻辑地址和物理地址概念的请看我笔记no1讲的页式存储管理机制:https://www.jianshu.com/p/6c7efb5376e6
这里不得不讲一下段式存储机制,允许各个段不连续存放,这样会导致碎片问题。但是其碎片问题没有分区式管理那么严重,因为分区式管理是整一块空间整个存入,段式管理有分割程序整体的大小。可能会出现分割好的段正好能放入碎片的情况,所以没分区式管理那么严重。
3.进程中的段表:
段表一样存储在内存中,其段表一般格式如下:
你会发现它有三个属性,分别是短号,段首址,以及段长度。其好像少了段框号?其实不然,因为段的长度不固定,所以不能像页那样分配出页框。而且具体一步去观察它更像是页表和请求表的结合。这样的设计方式是非常巧妙的,有利于共享和动态连接。
4.段式物理地址转换:
首先也是要记住有两个寄存器是服务于段式地址转换的。一个叫段表始址寄存器,一个叫段表长度寄存器。段式存储机制的寄存器和页式存储机制寄存器格式上很像。但是不要以为是同一个寄存器,首先它俩的名字不一样,其次用的也不是同一个寄存器。
段式始址寄存器:用于保存正在运行进程的段表始址。
段表长度寄存器:用于保存正在运行进程的段表长度。
这里段式存储机制会与页式机制有所稍稍的不同,你会发现这里没有用到请求表。
当然没用就对了,这样就能理解为什么前面我说的段式存储机制的段表项形似页表加请求表了吧。
来说回正题,我们看看地址转换机制怎么运行的。
首先还是我们知道的信息,我们会知道逻辑地址。其次段表始址寄存器(这里是段表始址)和段表长度寄存器是填充好的。
在这里我们会比较段号是否小于段长度(即地址越界的判定),然后用段表始址寄存器找到段表,再用段号找到实际的段长,这是还会做一个比较,即比较段内地址是否超过了实际段的段长(地址越界的判定)。
判定都没问题了,那么直接用段始址加段内地址偏移就找到目标物理地址喽。
5.总结:
内存中段式存储管理和页式存储管理一样需要访问两次内存,其加快访问的机制也是相联存储器和快表。但是由于段表项数目一般都少于页式存储管理,所以它的相联存储器也相对较小,所以可以更显著的减少存取数据的时间。
其优点有:便于动态申请内存,管理和使用统一化,便于共享和动态链接。
缺点:产生了内存碎片化的问题。