基本分段存储管理方式

前言

在上篇文章基本分页存储管理方式中介绍了非连续分配管理方式的基本分页存储管理方式。

接下来,本文将介绍非连续分配管理的第二种方式——基本分段式存储管理方式

分页实现离散分配,提高内存利用率。分页是系统管理完成的,对用户是不可见的。分段存储管理方式考虑了用户,以满足方便编程、信息共享、信息保护、动态增长及动态链接等多方面的需求。

分段

在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息,例如:主程序段MAIN,子程序段X,数据段D和栈段S等等。每个段都有自己段名,为了实现简单,通常可用段号来代替段名,每个段都从0开始并采用一段连续的地址空间

段的长度由相应的逻辑信息组的长度决定,各段的长度不相等。

分段地址中的地址结构:
在这里插入图片描述
分段系统的逻辑地址结构由段号(段名)和段内地址组成。

段号的位数决定了每个作业最多可以分几个段

就上述地址结构允许作业最多有216=64K个段。

段内地址位数决定了每个段的最大长度是多少

每个段的最大长度216=64KB

段表

为每个进程建立一张逻辑地址和内存空间映射的映射表,称为段表。

每个段对应一个段表项,其中记录了该段在内存中的起始位置(又称“基址”)和段的长度

各个段表项的长度是相同的。段号可以是隐含的,不占存储空间

在这里插入图片描述

地址变换机构

1、根据逻辑地址得到段号、段内地址

2、判断段号是否越界。若S>M,则产生越界中断,否则继续执行

3、查询段表,找到对应的段表项,段表项的存放地址为F+S*段表项长度

4、检查段内地址是否超过段长。若W≥C,则产生越界中断,否则继续执行

5、计算得到物理地址

6、访问目标内存单元

在这里插入图片描述

分页与分段的区别

1、页是信息的物理单位,对用户是不可见的;段是信息的逻辑单位,对用户是可见的。
2、分页的用户进程地址空间是一维的;分段的用户进程地址空间是二维的。
3、页的大小固定不变,由系统决定。段的大小是不固定的,它由其完成的功能决定。
4、分段比分页更容易实现信息的共享和保护。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基本分段存储管理系统是一种用于管理计算机内存的方法,它使用段(segment)的方式将内存划分为多个不同大小的区域,每个段可以单独分配给进程或任务使用。 Java可以使用类和对象的概念来模拟实现基本分段存储管理系统。首先,我们需要定义一个Segment类,该类具有以下属性:段号、起始地址、长度和状态(是否被分配)。 接下来,我们创建一个SegmentManager类,该类负责管理所有的段对象。它可以有以下方法: - addSegment():添加一个新的段到段管理器中,包括指定段号、起始地址和长度。 - allocateSegment():分配一个可用的段给进程或任务。可以通过查找状态为未分配的段来进行分配。 - deallocateSegment():释放已分配的段,将其状态设为未分配。 - printSegments():打印所有的段信息,包括段号、起始地址、长度和状态。 此外,可以创建一个Main类作为程序的入口,调用SegmentManager的方法来模拟实现基本分段存储管理系统的功能。 以下是一个简单的Java代码示例: ```java class Segment { int segmentNumber; int startAddress; int length; boolean allocated; public Segment(int segmentNumber, int startAddress, int length) { this.segmentNumber = segmentNumber; this.startAddress = startAddress; this.length = length; this.allocated = false; } } class SegmentManager { List<Segment> segments; public SegmentManager() { this.segments = new ArrayList<>(); } public void addSegment(int segmentNumber, int startAddress, int length) { segments.add(new Segment(segmentNumber, startAddress, length)); } public void allocateSegment() { for (Segment segment : segments) { if (!segment.allocated) { segment.allocated = true; break; } } } public void deallocateSegment(int segmentNumber) { for (Segment segment : segments) { if (segment.segmentNumber == segmentNumber) { segment.allocated = false; break; } } } public void printSegments() { for (Segment segment : segments) { System.out.println("Segment " + segment.segmentNumber + ": Start Address = " + segment.startAddress + ", Length = " + segment.length + ", Allocated = " + segment.allocated); } } } public class Main { public static void main(String[] args) { SegmentManager manager = new SegmentManager(); manager.addSegment(1, 0, 100); manager.addSegment(2, 100, 200); manager.printSegments(); manager.allocateSegment(); manager.printSegments(); manager.deallocateSegment(2); manager.printSegments(); } } ``` 上述代码演示了如何使用Java模拟实现基本分段存储管理系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值