三种存储管理系统方式地地址换算
计算机储存单位和换算关系

计算机存储单位一般用B,KB、MB、GB、TB、PB、EB、ZB、YB、BB来表示,它们之间的关系是:位 bit (比特)(Binary Digits):存放一位二进制数,即 0 或 1,最小的存储单位。
字节 byte:8个二进制位为一个字节(B),最常用的单位。
1KB(Kilobyte 千字节) = 2^10 B = 1024 B;1MB(Megabyte 兆字节) = 2^10 KB = 1024 KB = 2^20 B;1GB(Gigabyte 吉字节) = 2^10 MB = 1024 MB = 2^30 B;1TB(Trillionbyte 太字节) = 2^10 GB = 1024 GB = 2^40 B;1PB(Petabyte 拍字节) = 2^10 TB = 1024 TB = 2^50 B;1EB(Exabyte 艾字节) = 2^10 PB = 1024 PB = 2^60 B;1ZB(Zettabyte 泽字节) = 2^10 EB = 1024 EB = 2^70 B;1YB(YottaByte 尧字节) = 2^10 ZB = 1024 ZB = 2^80 B;1BB(Brontobyte ) = 2^10 YB = 1024 YB = 2^90 B;1NB(NonaByte ) = 2^10 BB = 1024 BB = 2^100 B;1DB(DoggaByte) = 2^10 NB = 1024 NB = 2^110 B;1KB (Kilobyte 千字节)=1024B,1MB (Megabyte 兆字节简称“兆”)=1024KB,1GB (Gigabyte 吉字节又称“千兆”)=1024MB,1TB (Trillionbyte 万亿字节太字节)=1024GB,其中1024=2^10 ( 2 的10次方),1PB(Petabyte 千万亿字节拍字节)=1024TB,1EB(Exabyte 百亿亿字节艾字节)=1024PB,1ZB (Zettabyte 十万亿亿字节泽字节)= 1024 EB,1YB (Jottabyte 一亿亿亿字节尧字节)= 1024 ZB,1BB (Brontobyte 一千亿亿亿字节)= 1024 YB.注:“兆”为百万级数量单位。
自考-操作系统概论-第3章 存储管理

重点:各种管理方式下的地址转换;可 变分区方式的主存分配算法以及 移动技术;页式虚拟存储管理的 实现以及页面调度算法
3.1 计算机系统中的存储器 3.2 重定位 3.3 单用户连续存储管理 3.4 固定分区存储管理 3.5 可变分区存储管理 3.6 页式虚拟存储管理
存储器的层次结构:
1、早期的单用户操作系统是()存储管理功能 2、存储管理是对主存的()区域进行管理 3、存储管理的目的是() 4、地址转换的工作是将() 5、动态重定位是需要由()来实现 6、经过(),目标程序可以不经过修改而装入物理内 存单元 7、固定分区存储管理中,每个分区的大小是() 8、碎片是指(),碎片的存在使得() 9、最容易形成碎片的可变分区分配算法是() 10、可变分区管理主存时()程序在主存中不能移动
重定位问题与保护:物理地址和逻辑地址的映射关系
内存空间的扩充,提高主存空间利用率
使用固定分区的形式可以实现内存的扩充吗?
3.4.1 主存空间的分配与回收 3.4.2 地址转换和存储保护 3.4.3 如何提高主存空间的利用率
如何知道那个分区被占用,那个空闲
分区分配表:说明各区的分配和使用情况
分区分配表
操作系统的“合理”性
合理分配内存空间,保证多道程序的顺利运行 合理保护内存空间,防止各种可能的破坏泄漏
操作系统的“有效性”
有效保持内存空间的可用性,防止对资源的浪费 有效实现“小空间大容量”,提高计算机的适应性 有效配合CPU的调度过程,实现系统运行的稳定
内存空间的管理、分配和回收 内存空间的使用情况记录——位图、分配表、分 区表 内存空间的分配与回收——定长与不定长、静态 与动态 内存空间的地址映射(转换) 物理地址与逻辑地址的差别 内存空间的共享和保护 内存共享 内存保护:如何防止地址越界或操作越权? 内存空间的扩充 虚拟存储:如何使用小内存空间来运行大的程序?
计算机常用单位换算

计算机常用单位换算计算机中使用的单位有时会令人感到困惑,因为它们往往是以不同的数量级来表示存储容量、数据传输速度和计算能力。
本文将详细介绍计算机常用单位之间的换算关系,并提供一些实用的换算方法,以帮助读者更好地理解计算机存储和性能指标。
一、存储容量单位换算在计算机中,存储容量通常以二进制的方式来表示,其中最小的单位是位(bit)。
以下是常用的存储容量单位及其换算关系:1.1 字节(Byte)字节是计算机存储容量的基本单位,1字节等于8位。
字节常用于表示少量数据,如一个字符或一个小图像的像素值。
下面是一些常见的存储容量单位换算,以字节为基准:- 1千字节(KB)= 1024字节- 1兆字节(MB)= 1024千字节- 1千兆字节(GB)= 1024兆字节- 1太字节(TB)= 1024千兆字节1.2 位(bit)位是计算机中最基本的存储单位,它可以表示二进制的0或1。
由于位较小且使用范围较窄,我们通常使用字节作为单位来表示存储容量。
二、数据传输速度单位换算数据传输速度通常用于衡量计算机的性能,包括网络连接速度、硬盘读写速度等。
以下是一些常用的数据传输速度单位及其换算关系:2.1 比特每秒(bps)比特每秒是衡量数据传输速度的基本单位,它表示每秒传输的比特数量。
以下是一些常见的数据传输速度单位换算,以比特每秒为基准:- 千比特每秒(Kbps)= 1024比特每秒- 兆比特每秒(Mbps)= 1024千比特每秒- 吉比特每秒(Gbps)= 1024兆比特每秒2.2 字节每秒(Bps)字节每秒是计算机中常用的数据传输速度单位,它表示每秒传输的字节数。
以下是一些常见的数据传输速度单位换算,以字节每秒为基准:- 千字节每秒(KBps)= 1024字节每秒- 兆字节每秒(MBps)= 1024千字节每秒- 吉字节每秒(GBps)= 1024兆字节每秒三、计算能力单位换算计算机的计算能力通常用于衡量其处理速度和性能。
数据的存储单位及换算关系

数据的存储单位及换算关系数据的存储单位是指计算机系统中用来表示和存储数字、文本和其他数据的一种量度单位。
数据的存储单位通常是位、字节、千字节、兆字节、千兆字节和艾字节。
位是计算机中最小的单位,通常用于表示数据的状态。
一个位只能表示0或1。
8个位组成一个字节,通常被用于存储一个字符或汉字。
千字节是计算机系统中常用的存储单位,用于表示较小的文件大小。
1千字节等于1024个字节,也就是说,一个文本文件的大小为10KB,意味着它包含了10千字节的数据。
兆字节是更大的存储单位。
1兆字节等于1024个千字节,也就是说,一个MP3文件的大小可能是4兆字节。
千兆字节是用于表示更大的数据量的单位。
1千兆字节等于1024个兆字节。
这个单位通常用于描述硬盘或闪存的存储容量。
艾字节是现代计算机系统中的最大存储单位,它表示1024个千兆字节。
在云计算领域,数据的存储容量常常使用艾字节来表示。
对于计算机用户来说,了解不同存储单位之间的换算关系是十分重要的。
例如,当你需要下载一个大文件时,你需要知道你的硬盘剩余的存储容量是否足够以及下载速度是否符合要求。
下面是几个常用的数据存储单位之间的换算关系:1字节 = 8位1千字节 (KB) = 1024字节1兆字节 (MB) = 1024千字节1千兆字节 (GB) = 1024兆字节1艾字节 (TB) = 1024千兆字节在实际使用过程中,我们需要了解各种文件大小和存储容量之间的换算关系。
比如,一个2分钟的MP3文件大小约为3MB,一个720p 的电影一般有4-6GB的大小,而一般的4TB硬盘可以存储200部这样的电影。
总之,了解数据的存储单位及换算关系对我们正确地使用计算机非常重要。
掌握这些基本知识可以帮助我们更好地管理我们的存储设备,避免存储空间不足等问题。
[操作系统]第3章 存储管理
![[操作系统]第3章 存储管理](https://img.taocdn.com/s3/m/80f34c274b35eefdc8d33320.png)
3.3.2 可变分区管理
1. 可变分区概念 可变分区/动态分区,与固定分区有三点不同: 1)分区的建立时刻 可变分区:在系统运行过程中,在作业装入时动态建立 固定分区:系统初启时建立。 2)分区的大小 可变分区:根据作业对内存的需求量而分配。 固定分区:事先设定,固定不变。 3)分区的个数 可变分区:变化不定。 固定分区:固定不变。
第3章 存储管理 章
本章研究的主要目的: 第一、要使主存得到充分、有效的利用; 第二、为用户提供方便的使用环境。
第3章 存储管理 章
3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 概述 地址映射 分区管理 覆盖与交换 分页管理 分段管理 段页式管理 虚拟存储器管理
3.1 概述
存储器分类
作业调度时,根据内存需求,按一定的分区分 配算法,在PDT中查找空闲区,若满足,则进 行分配,并置该分区状态为1,表明已被占用。 作业执行完,回收内存时,回收的分区状态置 0,等待重新分配。
固定分区存在问题
简单易行但存在下列问题: 碎片 可接纳的作业大小受分区大小的限制 一般用在作业大小预先知道的专用系统中。
空白区表中的空白区按其容量以递减的次序排 列。查找分区说明表,找到第一个满足申请长 度的空闲区,分配并分割。剩余部分插入适当 位置。 最差适应算法:分割大空闲区后,还可以产生 较大的空闲区,空闲区均匀地减小,以避免碎 片。
④ 唯一最佳适应算法(single best fit) 分区按大小顺序分级(8KB、16KB、32 KB、…… ) 作业按请求容量也分成相应的存储级,仅当 PDT中相应级的分区为空闲时,才进行内存 分配,即使有更大的分区空闲也不予以分配。
分配策略/算法
① 首次/最先适应First fit:
四个存储容量单位之间的换算关系

四个存储容量单位之间的换算关系在计算机和信息技术领域,存储容量单位是我们经常会接触到的概念。
而对于这些存储容量单位之间的换算关系,掌握起来却并不容易。
本文将为大家介绍四个主要的存储容量单位之间的换算关系,希望能够对大家有所帮助。
1.比特(Bit)、字节(Byte)、千字节(KB)、兆字节(MB)、吉字节(GB)、太字节(TB)、拍字节(PB)之间的换算关系1比特(Bit)= 1/8 字节(Byte)1字节(Byte)= 8 比特(Bit)1千字节(KB)= 1024 字节(Byte)1兆字节(MB)= 1024 千字节(KB)1吉字节(GB)= 1024 兆字节(MB)1太字节(TB)= 1024 吉字节(GB)1拍字节(PB)= 1024 太字节(TB)2.关于存储容量单位的扩展在实际应用中,除了上面介绍的存储容量单位外,还有一些其他的存储容量单位,比如千兆字节(GB)、太兆字节(TB)和拍兆字节(PB)等。
它们之间的换算关系依然遵循2的10次幂的规律。
1千兆字节(GB)= 1024 兆字节(MB)1太兆字节(TB)= 1024 千兆字节(GB)1拍兆字节(PB)= 1024 太兆字节(TB)3.存储容量单位的应用场景在日常生活中,存储容量单位被广泛应用于计算机存储、网络传输、文件大小等方面。
我们常常会听到一张照片的大小是几百KB或几MB,一首歌曲的大小是几MB或几GB,一部电影的大小是几GB或几TB 等。
掌握存储容量单位的换算关系,不仅有助于我们更好地理解各种媒体文件的大小,也有助于我们更加高效地管理和利用存储空间。
4.存储容量单位的换算实例为了更好地理解存储容量单位之间的换算关系,我们可以通过一些实际的例子来进行计算。
如果我们要将10TB的数据转换成GB,按照上面介绍的换算关系,可以进行如下计算:10TB = 10 * 1024GB = xxxGB又如果我们要将500MB的数据转换成KB,可以进行如下计算:500MB = 500 * 1024KB = xxxKB通过这些实例计算,我们可以更加清晰地理解存储容量单位之间的换算关系,也能够更加熟练地进行换算操作。
存储原理及基本知识

存储原理及基本知识:当前流行的计算机系统中,广泛采用由三种运行原理不同、性能差异很大的存储介质,来分别构建高速缓冲存储器、主存储器和虚拟存储器,再将它们组成通过计算机硬软件统一管理与调度的三级结构的存储器系统。
为了便于存放,每个存储单元必须有唯一的编号(称为“地址”),通过地址可以找到所需的存储单元,取出或存入信息。
这如同旅馆中每个房间必须有唯一的房问号,才能找到该房间内的人.软盘存储器由软盘、软盘驱动器和软盘驱动卡三部分组成。
通常每8个二进制位组成一个字节。
字节的容量一般用KB、MB、GB、TB来表示,它们之间的换算关系:1KB=1024B;1MB=l024KB:1GB=l024MB;1TB=1024GB。
20GB=20×1024MB。
每一个能代表0和1的电子线路称为一个二进制位,是数据的最小单位。
现代计算机中采用二进制数制是因为二进制数的优点是物理上容易实现且简单可靠;运算规则简单;适合逻辑运算。
存储容量大小是计算机的基本技术指标之一。
通常不是以二进制位、字或双字来表示,因为这些表示不规范,一般约定以字节作为反映存储容量大小的基本单位。
在微机中,信息的最小单位为二进制位,用bit来表示;8位二进制构成一个字节,用Byte来表示;一个或一个以上字节可组成一个二进制表示的字,字长可以是8位、16位、32位或64位;两个字长的字,称为双字。
在计算机内部,电路中常用的器件具有两种不同的稳定状态:高电平和低电平。
这两种状态之间能相互转换。
因此,在计算机内部,一切信息的存放、处理和传送都采用二进制数的形式。
因为计算机内部的计数基本单位是2,2的10次幂是1024。
所以1024个字节为1K字节,写做1KB。
1024×1024个字节为1M字节,记做1MB。
一个完整的计算机硬件系统包括运算器、控制器、存储器、输入设备和输出设备,运算器和控制器合称中央处理器或微处理器,中央处理器与内存储器合在一起称为主机。
《操作系统》实验报告三 页式虚拟存储管理中地址转换和缺页中断

实验项
目
名称
页式虚拟存储管理中地址转换和缺页中断
实验目的及要求1、深入了解页式存储管理如何实现地址转换。
2、进一步认识页式虚拟存储管理中如何处理缺页中断。
实验内容
编写程序完成页式虚拟存储管理中地址转换过程和模拟缺页中断的处理。
实验具体包括:首先对给定的地址进行地址转换工作,若发生缺页则先进行缺页中断处理,然后再进行地址转换;最后编写主函数对所做工作进行测试。
假定内存64KB,每个内存块1024字节;作业最大支持到64KB,系统中每个作业分得内存块4块。
实验步骤
注:可根据实际情况加页。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
三种存储管理方式的地址换算摘要:操作系统(Operating System,OS)是方便用户、管理和控制计算机软硬件资源的系统软件(或程序集合)。
从用户角度看,操作系统可以看成是对计算机硬件的扩充;从人机交互方式来看,操作系统是用户与机器的接口;从计算机的系统结构看,操作系统是一种层次、模块结构的程序集合,属于有序分层法,是无序模块的有序层次调用。
操作系统在设计方面体现了计算机技术和管理技术的结合。
操作系统是系统软件的核心,、它控制程序的执行和提供资源分配、调度、输入/输出控制和数据管理等任务。
如DOS、UNIX、OS/2和Windows NT都是得到广泛使用的操作的系统。
三种管理方式中,分页系统能有效地提高内存利用率,分段系统则能很好地满足用户需要,而段页式系统则是把前两种结合起来形成的系统。
这种新系统既具有分段系统的便于实现、分段可共享、易于保护、可动态链接等一系列优点,有能像分页系统那样很好地解决内存的外部碎片问题,以及可为各个分段离散地分配内存等问题。
关键字:分页方式,分段方式,段页式方式,操作系统。
1.引言:分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页。
在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。
段的长度由相应的逻辑信息组的长度决定,因而个段长度不等。
段页式存储管理方式是分段和分页原理的结合,即先将用户程序分成若干个段,再把每个段分成若干个页,并为每一个段赋予一个段名。
三种存储管理都有其相应的段表、页表和地址变换机构。
2.三种存储管理方式地址换算描述:(1)分页存储管理方式为了实现从进程的逻辑地址到物理地址的变换功能,在系统中设置了页表寄存器,用于存放页表在内存中的始址和页表的长度。
当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将有效地址(相对地址)分为页号和页内地址两部分,再以页号为索引去检索页表。
查找操作由硬件执行。
在执行检索之前,先将页号与页表长度进行比较,如果页号大于或等于页表长度,则表示本次所访问的地址已超越进程的地址空间。
于是,这一错误将被系统发现并产生一地址越界中断。
若未出现越界错误,则将页表始址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置,于是可从中得到该页的物理块号,将之装入物理地址寄存器中。
与此同时,再将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中。
这样便完成了从逻辑地址到物理地址的变换。
(2)分段存储管理方式为了实现从进程的逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址和段表长度TL。
在进行地址变换时,系统将逻辑地址中的段号与段表长度TL进行比较。
若S>TL,表示段号太大,是访问越界,于是产生越界中断信号;若未越界,则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的起始地址,然后,再检查段内地址d是否超过该段的段长SL。
若超过,即d>SL,同样发出越界中断信号;若未越界,则将该段的基址与段内地址d相加,即可得到要访问的内存物理地址。
(3)段页存储管理方式在段页式系统中,为了便于实现地址变换,需配置一个段表寄存器,其中存放段表始址和段表长TL。
进行地址变换时,首先利用段号S,将它与段表长TL 进行比较。
若S>TL,表示未越界,于是利用段表始址和段号来球出该段所对应的段表项在段表中的位置,从中得到该段的页表始址,并利用逻辑地址中的段内页号P来获得对应表的页表项位置,从中读出该页所在的物理块号b,再利用块号b和页内地址来构成物理地址。
3.程序模块:#include <stdlib.h>#include <stdio.h>int settable1(int n,int k);//创建页表int printTable1(int n,int k);//显示页表int transt(int n,int k,int add);//分页地址换算int defSect(int n,int *t);//创建段表int printSect(int n);//输出段表内容int transSect(int n,int s,int d);//进行分段地址换算函数int setSectTable(int n,int k);//创建段页式内容int printSectTable(int n,int k);//显示段页内容int transSectPage(int n,int k,int s1,int s2,int s3);//段页式地址换算//定义页表结构体typedef struct stable{int y1;//页号int y2;//块号}stable;struct stable setst[512];//建立段表的结构体typedef struct setsect{int d1;//段号int d2;//段长int d3;//基址}setsect;struct setsect sets[512];//定义段表的总长度//建立段页式内的页表的结构体typedef struct table{int dy1;//页号int dy2;//块号}table;//建立段页式的结构体typedef struct setAll{struct table c1[512];//定义段内页表的结构体int c2;//段号int c3;//段长int c4;//起始地址}setAll;struct setAll set[512];//定义段页式的总长度4.三种存储管理方式的地址变换机构(1)分页系统的地址变换机构实用文档(2) 分段系统的地址变换机构(3) 段页式系统中的地址变换机构5.结束语:为期二周的操作系统课程设计很快就结束了,做为每个学期末的一项必修课,课程设计的目的就是要让我们能够更加深刻的理解课堂上所学的知识,并能够将它们应用到实践中去,让知识能为实践服务。
这次操作系统的课程设计,我是通过编程演示三种存储管理方式的地址换算过程。
通过这次课程设计,加深了我对课堂上所学的三种存储管理方式的地址换算的概念的理解,了解了操作系统的工作原理已经平时遇到的一些状况是怎么样产生的,通过这次操作系统的课程设计,另我学到了很多在课堂上学不到的知识,以及动手能力,这次课程设计老师不限开发工具,因此也锻炼了我们对新的开发工具的掌握能力。
对于我们计算机专业的学生来说,在软件更新如此之快的今天,对新的开发工具的快速掌握能力也是一项必不可少的能力。
当然,在这次课程设计中,也暴露出来了一些问题,就是我对开发工具的使用,虽然大学三年基本是用C编写程序比较多,但是还是感到了力不从心的感觉,就是自己对一些C函数库的了解不够,导致自己在用的时候走了很多弯路,这也从间接让我了解了许多平时学习不到的知识。
课程设计不仅能锻炼我们把知识应用于实践的能力,还锻炼了我们思维的逻辑性。
编写一个BUG尽可能少的程序,需要考虑很多方面的问题,包括给别人试用,这就锻炼了我们逻辑思维的能力,为今后走上工作岗位打下了坚实的基础。
6.参考文献:《计算机操作系统》西安电子科技大学出版社《C语言程序设计教程》机械工业出版社附:三种存储管理方式地址换算程序清单如下:#include <stdlib.h>#include <stdio.h>int settable1(int n,int k);//创建页表int printTable1(int n,int k);//显示页表int transt(int n,int k,int add);//分页地址换算int defSect(int n,int *t);//创建段表int printSect(int n);//输出段表内容int transSect(int n,int s,int d);//进行分段地址换算函数int setSectTable(int n,int k);//创建段页式内容int printSectTable(int n,int k);//显示段页内容int transSectPage(int n,int k,int s1,int s2,int s3);//段页式地址换算//定义页表结构体typedef struct stable{int y1;//页号int y2;//块号}stable;struct stable setst[512];//建立段表的结构体typedef struct setsect{int d1;//段号int d2;//段长int d3;//基址}setsect;struct setsect sets[512];//定义段表的总长度//建立段页式内的页表的结构体typedef struct table{int dy1;//页号int dy2;//块号}table;//建立段页式的结构体typedef struct setAll{struct table c1[512];//定义段内页表的结构体int c2;//段号int c3;//段长int c4;//起始地址}setAll;struct setAll set[512];//定义段页式的总长度int main(){int choice1,choice2;int truth=0,truth1;int jobAddr;//进程的逻辑地址空间int md;//页面大小int addr1;//输入的逻辑地址int dc;//定义段表的长度int dh,sAddr;//定义段表的逻辑地址的段号和段内地址int dyc;//段页式的段表长度int jobs,jobt,joba;//段页式逻辑段号、段内页号、页内地址do{printf(" 组员:符小平崔健王菲菲王天渤\n");printf("--------------操作系统课程设计题目:分页、分段、段页式地址换算-------------------\n\n");printf(" 总菜单\n");printf(" 1.分页方式\n");printf(" 2.分段方式\n");printf(" 3.段页式\n");printf(" 4.结束\n\n");printf("----------------------------------------------------------\n"); printf("请输入您的选择:\n");scanf("%d",&choice1);switch(choice1){case 1:{//分页方式do{printf(" 分页方式\n");printf("---------------------------------------------------\n");printf(" 1.随机生成进程大小\n");printf(" 2.进程创建页表\n");printf(" 3.显示页表的信息\n");printf(" 4.地址换算\n");printf(" 5.退出\n");printf("---------------------------------------------------\n\n"); printf("请输入您的选择:");scanf("%d",&choice2);switch(choice2){case 1:{printf(" 随机生成一个进程(大小在1024K至2048K)\n"); printf("---------------------------------------------------\n");do{jobAddr=rand()%2048;//随机产生进程的逻辑地址空间}while(jobAddr<1024);printf("该进程的逻辑地址空间是:%d(K)\n",jobAddr);printf("页面的大小:");scanf("%d",&md);truth=1;printf("---------------------------------------------------\n"); }break;case 2:{if(truth==1){printf("\n 进程创建的页表\n");printf("---------------------------------\n\n"); settable1(jobAddr,md);truth1=1;printf("\n\n---------------------------------\n");}else{printf("\n\n---------------------------------\n"); printf("\n还没有创建进程.请先选择1创建进程.\n\n"); printf("\n\n---------------------------------\n"); break;}}break;case 3:{if(truth==1){if(truth1==1){printf("\n 显示进程创建的页表\n");printf("---------------------------------\n\n"); printTable1(jobAddr,md);printf("\n\n---------------------------------\n");}else{printf("\n\n---------------------------------\n");printf("\n还没有创建页表.请先选择2创建页表.\n\n");printf("\n\n---------------------------------\n");break;}}else{printf("\n\n---------------------------------\n");printf("\n还没有创建进程.请先选择1创建进程.\n\n");printf("\n\n---------------------------------\n");break;}}break;case 4:{if(truth==1){if(truth1==1){printf("\n 地址换算\n");printf("---------------------------------\n\n");printf("请你输入要进行换算的逻辑地址(K):");scanf("%d",&addr1);if(addr1>jobAddr){do{printf("输入的逻辑地址大于进程地址空间,请重新输入逻辑地址(K):"); scanf("%d",&addr1);}while(addr1>jobAddr);}transt(jobAddr,md,addr1);printf("\n\n---------------------------------\n");}else{printf("\n\n---------------------------------\n");printf("\n还没有创建页表.请先选择2创建页表.\n\n");printf("\n\n---------------------------------\n");break;}}else{printf("\n\n---------------------------------\n");printf("\n还没有创建进程.请先选择1创建进程.\n\n");printf("\n\n---------------------------------\n");break;}}break;case 5:{printf("---------------------------------------------------\n\n"); printf("退出分页方式地址换算选项,进入总菜单.\n");printf("---------------------------------------------------\n\n");}break;default:{printf("---------------------------------------\n");printf("错误提示:你输入的选择有错,请重新选择!\n");printf("---------------------------------------\n");}}}while (choice2!=5);}break;case 2:{//分段方式do{printf(" 分段方式地址换算\n");printf("---------------------------------------------------\n"); printf(" 1.创建段表\n");printf(" 2.显示段表\n");printf(" 3.地址换算\n");printf(" 4.退出\n");printf("---------------------------------------------------\n\n"); printf("请输入您的选择:");scanf("%d",&choice2);switch(choice2){case 1:{printf(" 开始创建段表\n");printf("---------------------------------------------------\n"); printf("请输入你要创建的段表长度(最大为512个):");scanf("%d",&dc);defSect(dc,&truth);printf("---------------------------------------------------\n"); }break;case 2:{if(truth==1){printf("\n 显示已经创建的段表内容\n");printf("---------------------------------\n\n");printSect(dc);printf("\n\n---------------------------------\n");}else{printf("\n\n---------------------------------\n");printf("\n还没有创建段表.请先选择1创建段表.\n\n"); printf("\n\n---------------------------------\n");break;}}break;case 3:{if(truth==1){printf(" 分段地址换算\n");printf("---------------------------------------------------\n"); printf("请您输入逻辑地址的段号,段内地址(K):");scanf("%d,%d",&dh,&sAddr);transSect(dc,dh,sAddr);printf("---------------------------------------------------\n"); }else{printf("---------------------------------------------------\n"); printf("\n还没有创建段表.请先选择1创建段表.\n\n");printf("---------------------------------------------------\n"); break;}}break;case 4:{printf("---------------------------------------------------\n\n"); printf("退出分段方式地址换算选项,进入总菜单.\n");printf("---------------------------------------------------\n\n"); }break;default:{printf("---------------------------------------\n");printf("错误提示:你输入的选择有错,请重新选择!\n");printf("---------------------------------------\n");}}}while (choice2!=4);}break;case 3:{//段页式do{printf(" 段页式地址换算\n");printf("---------------------------------------------------\n"); printf(" 1.创建段页式\n");printf(" 2.显示段页式结构\n");printf(" 3.地址换算\n");printf(" 4.退出\n");printf("---------------------------------------------------\n\n"); printf("请输入您的选择:");scanf("%d",&choice2);switch(choice2){case 1:{printf(" 开始创建段页式\n");printf("---------------------------------------------------\n"); printf("请输入你要创建的段表长度(最大为512个):");scanf("%d",&dyc);printf("页面的大小K:");scanf("%d",&md);setSectTable(dyc,md);truth=1;printf("---------------------------------------------------\n"); }break;case 2:{if(truth==1){printf("\n 显示段页式结构\n");printf("---------------------------------\n\n"); printSectTable(dyc,md);printf("\n\n---------------------------------\n");}else{printf("\n\n---------------------------------\n");printf("\n还没有创建段页式.请先选择1创建段页式.\n\n"); printf("\n\n---------------------------------\n");break;}}break;case 3:{if(truth==1){printf(" 段页式地址换算\n");printf("---------------------------------------------------\n"); printf("请输入要查找的逻辑地址段号:");scanf("%d",&jobs);printf("段内页号:");scanf("%d",&jobt);printf("页内地址(K):");scanf("%d",&joba);transSectPage(dyc,md,jobs,jobt,joba);printf("---------------------------------------------------\n"); }else{printf("---------------------------------------------------\n"); printf("\n还没有创建段表.请先选择1创建段页式.\n\n"); printf("---------------------------------------------------\n"); break;}}break;case 4:{printf("---------------------------------------------------\n\n");printf("退出段页式地址换算选项,进入总菜单.\n");printf("---------------------------------------------------\n\n"); }break;default:{printf("---------------------------------------\n");printf("错误提示:你输入的选择有错,请重新选择!\n");printf("---------------------------------------\n");}}}while (choice2!=4);}break;case 4:{printf("准备退出程序!!!\n");}break;default:{printf("---------------------------------------\n");printf("错误提示:你输入的选择有错,请重新选择!\n");printf("---------------------------------------\n");}}}while (choice1!=4);return (0);}//创建页表int settable1(int n,int k){int p;//页号int d;//剩余地址int i;int block;//块号p=n/k;//求出逻辑地址空间总页数d=n%k;//求出该页大小block=1024*1024/k; //求出最大块号for(i=0;i<p;i++){setst[i].y1=i;//页号setst[i].y2=rand()%block;//定义随机产生的块号在1到(1M内存/页面大小)}printf("正在创建中··\n");if(d!=0){setst[p].y1=p;//页号setst[p].y2=rand()%block;//定义随机产生的块号在1到(1M内存/页面大小)之间}printf("\n页表已经创建成功!");return (0);}//显示页表int printTable1(int n,int k){int p;int d;p=n/k;//求出总页数d=n%k;//求出该页大小printf(" 进程逻辑地址空间:%dK 页面大小:%dK\n",n,k); printf(" 页表\n");if(d!=0){for(i=0;i<=p;i++){printf("页号:%d->块号:%d\n",setst[i].y1,setst[i].y2); }}else{for(i=0;i<p;i++){printf("页号:%d->块号:%d\n",setst[i].y1,setst[i].y2); }}return (0);}//分页地址换算int transt(int n,int k,int add){int p1,d1;p1=add/k;//求出逻辑页号d1=add%k;//求出逻辑页内地址printf("\n 分页地址换算结果.\n");printf("---------------------------------\n");printf("进程逻辑地址空间=%dK\n",n);printf("页面大小=%dK\n",k);printf("给定的逻辑地址=%dK\n",add);printf("页号=%d\n",p1);printf("块号=%d\n",setst[p1].y2);printf("起始地址=%dK\n",setst[p1].y2*k);printf("页内地址=%dK\n",d1);printf("物理地址=(起始地址+页内地址)=%dK\n",setst[p1].y2*k+d1); printf("\n---------------------------------\n");return (0);}//创建段表int defSect(int n,int *t){int i;printf("\n 开始给各个段号分配段长和基址.\n");printf("-------------------------------------------\n");for(i=0;i<n;i++){sets[i].d1=i;printf("定义第%d段的段长(K):",i);scanf("%d",&sets[i].d2);//自己定义段长(10~50)sets[i].d3=rand()%2048;//定义随机产生基址为1到2048之间}*t=1;printf("\n---------------------------------\n");return (0);}//输出段表int printSect(int n){int i;printf(" 段表\n");for(i=0;i<n;i++){printf("\n");printf("段号:%d->段长:%dK->起始地址:%dK",sets[i].d1,sets[i].d2,sets[i].d3);}return (0);}//进行分段地址换算int transSect(int n,int s,int d){int sum;printf(" 分段地址换算结果");printf("\n-----------------------------------\n");if(s<n){//段号与段表长度比较if(d<=sets[s].d2){//段内地址与该段的段长比较sum=sets[s].d3+d;printf("查找段号=%d\n",s);printf("该段段长=%dK\n",sets[s].d2);printf("该段起始地址=%dK\n",sets[s].d3);printf("分段地址中的段内地址=%dK\n",d);printf("物理地址=(起始地址+段内地址)=%dK\n",sum);}else{printf("输入的段内地址超过该段的段长,访问越界,产生越界中断信号!\n");}}else{printf("输入的段号太大,访问越界,产生越界中断信号\n!");}printf("-----------------------------------\n\n");return (0);}//创建段页式内容int setSectTable(int n,int k)int p,d;int i,j;int block;block=1024*1024*1024/k;//求出最大块号for(i=0;i<n;i++){set[i].c2=i;printf("定义第%d段的段长(大于1024K,小于2048K):",i);scanf("%d",&set[i].c3);//自己定义段长p=set[i].c3/k;d=set[i].c3%k;set[i].c4=rand()%1024;//定义随机产生的起始地址在1到1024之间for(j=0;j<p;j++){set[i].c1[j].dy1=j;//页号set[i].c1[j].dy2=rand()%block;//定义随机产生的起始地址在1到(1G内存/页面大小)之间}if(d!=0){set[i].c1[p].dy1=p;//页号set[i].c1[p].dy2=rand()%block;//定义随机产生的起始地址在1到(1G内存/页面大小)之间}return (0);}//显示段页式内容int printSectTable(int n,int k){int i,j;int s,p,d;printf(" 段表长度:%d 页面大小:%dK\n",n,k);printf(" 段页式:");for(i=0;i<n;i++){printf("\n段号:%d->页表大小:%dK->页表起始地址:%dK-->页表\n",i,set[i].c3,set[i].c4);s=set[i].c3;p=s/k;d=s%k;//显示段页式结构的内容if(d!=0){for(j=0;j<=p;j++){printf("页号:%d->块号:%d\n",set[i].c1[j].dy1,set[i].c1[j].dy2); }}else{for(j=0;j<p;j++){printf("页号:%d->块号:%d\n",set[i].c1[j].dy1,set[i].c1[j].dy2); }}}return (0);}//段页式地址换算int transSectPage(int n,int k,int s1,int s2,int s3){int p,d,s;printf("\n 段页式地址换算结果.\n");printf("-----------------------------------------\n");if(s1<n){s=set[s1].c3;p=s/k;//求出逻辑地址所在的页号d=s%k;//求出逻辑地址的页内地址if(d!=0){if(s2<=p){printf("段长=%d\n",n);printf("段号=%d\n",s1);printf("段号为%d的始址=%dK\n",s1,set[s1].c4);printf("页面大小=%dK\n",k);printf("段号为%d的页表总页数=%d\n",s1,p+1);printf("段内页号=%d\n",s2);printf("块号=%d\n",set[s1].c1[s2].dy2);printf("页号为%d始址=(块号*页面大小)=%dK\n",s2,set[s1].c1[s2].dy2*k); printf("页内地址=%dK\n",s3);printf("物理地址=(段号始址+页号始址+页内地址)=%dK\n",set[s1].c1[s2].dy2*k+s3);}else{printf("输入的页号大于该段的段内页号,产生越界中断!\n");}}elseif(s2<p){printf("段长=%d\n",n);printf("段号=%d\n",s1);printf("段号为%d的始址=%dK\n",s1,set[s1].c4);printf("页面大小=%dK\n",k);printf("段号为%d的页表总页数=%d\n",s1,p);printf("页号(段内页号)=%d\n",s2);printf("块号=%d\n",set[s1].c1[s2].dy2);printf("页号为%d始址=(块号*页面大小)=%dK\n",s2,set[s1].c1[s2].dy2*k); printf("页内地址=%dK\n",s3);printf("物理地址=(段号始址+页号始址+页内地址)=%dK\n",set[s1].c1[s2].dy2*k+s3);}else{printf("输入的页号大于该段的段内页号,产生越界中断!\n"); }}else{printf("输入段号大于段长,产生越界中断!\n");}printf("-----------------------------------------\n"); return (0);}。