【操作系统——内存基本分段式存储管理】

0.2系列文章目录

1.《带你深挖计算机底层逻辑,打通你计算机基础知识的任督二脉》
2.《深度学习计算机底层原理,深度剖析存储器》
3.《基于内存全面理解高速缓冲存储器》
4.《深度学习计算机指令系统,彻底搞懂指令十大寻址方式》
5.《降维打击,带你深度学习CPU(上)》
6.《深度学习CPU(番外篇)——虚拟内存》
7.《深度学习CPU(番外篇)——虚拟内存》
8.《操作系统——内存连续分配管理方式》
9.《操作系统——内存基本分页存储管理》
10.《I/O方式——程序中断》



前言

        分页管理方式是从计算机的角度考虑设计的,目的是提高内存的利用率,提升计算机的性能,分页是通过硬件机制来实现的,对用户是完全透明的,也就是说,内存当当中的页要如何划分,用户是不能干预的,而分段管理方式则是在一定程度上考虑了用户和程序员,以满足编程、信息保护和共享、动态增长以及动态链接等多方面的需求。

        在读这篇文章之前,读者们一定要对基本分页式存储管理方式有着一定的了解,否则这篇文章理解起来可能会有一些困难,如果对这方面不了解的话可以先阅读一下我上一篇文章,为大家附上原文链接http://t.csdn.cn/kzR3Y


一、分段

       1.概述

        段式管理方式按照用户进程中的自然分界段来划分逻辑空间,例如用户进程由主程序段、两个子程序段、栈段和数据段组成,于是就把这个进程分为5段,每一段都要从0开始编址,并分配一段连续的内存地址空间(当然这里的连续说的是段内必须连续,但是段间不要求连续)。

        这里不同于基本分页式存储管理方式,将逻辑内存按照大小相同的块进行划分,划分的方式不会考虑程序本身就有的自然分段,因为程序本身就是有一定的逻辑结构、以及自然分段的,基本分页式存储管理方式是不会考虑这些的,直接粗暴地划分为相同大小的块。

        基本分段式管理方式中的逻辑地址由段号S和段内偏移量W两部分组成,如下图所示:

段号S 段内偏移量W

        在页式存储管理方式中,逻辑地址的页号和页内偏移量对用户是透明的,但是在段式管理方式当中,段号和段内偏移量由用户进行显式提供的,在高级程序设计语言中,这个工作由编译程序完成。 

        2.段表

        每个进程都有一张逻辑空间与内存空间相映射的段表,其中每个段表项对应进程的一段,段表项记录该段在内存当中的起始地址和长度,段表的内容如图所示。

段号 段长 本段在内存当中的起始地址

        配置段表以后,执行中的进程可以通过查找段表,找到每段所对应的内存区,可见段表用于实现从逻辑段到物理内存的映射,如图所示。

         3.地址变换机构

        分段系统的地址变换过程如图所示,为了实现进程从逻辑地址到物理内存地址的变换功能,在系统中设置了段表寄存器,用于存放段表起始地址F和段表长度M,从逻辑地址A到物理地址E之间的变换过程如下图所示。

 

  1. 从逻辑地址的前几位当中取出段号S,后几位为段内偏移量,注意这里不管是段号还是段内偏移量在系统当中一定都是二进制数,但是有些教材为了表达方便,用十进制数来表示。
  2. 比较段号S和段表长度M,若S>=M,则产生越界中断,否则继续执行,其实也很好理解段号代表着段的编号,而段表长度代表一共有几段,段号大于等于M都是越界,因为段号是从0开始编排的。
  3. 段表中的段号S对应的段表项地址=段表起始地址F+段号S*段表项长度,取出该段表项的前几位得到段长C,若段内偏移量>=C,则产生越界中断(因为如果你的偏移量大于段长的话就意味着你可能会偏移到这个段的外边),否则继续执行,从中可以看出段表项实际上只有两部分,前几位是段长,后几位是起始地址。注意这里的起始地址指的是逻辑通过段表找到对应的物理段,物理段的起始地址,然后找到物理段的其实地址以后再根据逻辑地址提供的段内偏移量计算出物理内存中的准确地址,因为每一个物理段内还有很多的地址,只根据物理段的起始地址,是无法精准地找出所需的程序的。
  4. 取出段表项中该段的起始地址b,计算物理地址E=b+W。

提醒:段式存储管理方式中的b代表某一段的起始地址,而基本也是存储管理方式中的b代表物理块号,并不是同样的概念,所以在页式存储管理方式当中计算物理地址时,还需要将b与页面大小L相乘,由于每个页面大小相同这么做就是为了找到程序在哪一个页面,比如说b为3,那么3*L就可以找到第三页在物理内存当中的具体地址,毕竟页面大小都是一样的。


二、段的共享与保护

        1.段的共享        

        在分段系统中,段的共享是通过两个作业的段表中相应表项指向被共享的段的同一个物理副本来实现的,这么说可能有些不好理解,说直白一点比如A段和B段想要共享C段,那么就将C段拷贝一份也就是物理副本,将这个物理副本存放在存储区当中的某一个区域,然后再A和B的表项当中存放这个副本的地址,其实就是类似于指针的作用,将副本的地址存放在两个AB的段表项中,也就算是AB指向这个段表了。

        当一个作业正在从共享段中读取数据时,必须防止另一个作业修改此共享代码中的数据,不能修改的代码称为纯代码或者可重入代码,这样的代码和不能修改的数据可以共享,而可修改的代码和数据不可以共享。

        2.段的保护

        与分页管理方式类似,分段管理方式的保护方法主要有两种一种是存取控制保护,还有一种是地址越界保护。

        地址越界保护将段表寄存器中的段表长度和逻辑地址中的段号进行比较,若段号大于段表长度(段表长度:段的数量总和)则产生越界中断,再将段表项中的段长和逻辑地址中的段内偏移量进行比较,若段内偏移量大于段长也会产生越界中断,而分页管理只需要判断页号是否越界即可,页内偏移是不可能越界的,因为页面的大小从一开始就已经固定下来了是可知可控的,而段长度是不一致的,不可知也就不可控,则有可能越界。


总结

        今天为大家详细地讲解了基本分段是存储管理方式,这部分的内容需要大家了解一下虚拟内存的相关知识,否则这部分的内容理解起来可能会有一些困难,如果各位小伙伴们感兴趣的话,可以关注一下我之前写过的CPU系列的文章,相信你对CPU会由更透彻的了解。在这里为小伙伴们附上原文链接。http://t.csdn.cn/I8NU1


你的支持就是我最大的动力,请问你学会了吗

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇

)">
下一篇>>