- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
题目二:模拟页式存储管理中内存的分配和管理
设计思想说明
模拟页式存储管理,首先假定内存被分为2048块(块和页大小一致),利用位式图中该位的状态表示状况,判断它内存的块是否被占用,0表示内存块为空闲状态,新作业可申请该块;1表示内存被占用,新的作业不能占用该块。该位示图使用32字长的字表示,故需要64个这样的字。位示图存放在文件中,每行表示32字长的字,共64行。块和页的大小为512字节。
程序中使用结构体node来存放作业的相关信息(加入内存的进程名,新作业的申请内存的大小(单位为字节),分配的块数,分配块在内存中的位置,最后块的碎片的大小(单位为字节));使用sum来记录当前的空闲的内存块数。
该程序在显示完内存的分配之后,使用switch—case来为用户提供可供是实现的功能。用户选择不同的功能之后,程序会自动进入到不同的实现模块中,用户再依次根据程序的提示进行操作。
模拟页式存储中内存的分配和管理这个程序划分为了以下几个模块:显示当前的内存分配的位示图,添加新的作业,完成作业(将原来分配给用户的内存空间回收),显示作业的内存分配的页表等功能。在添加新的作业的这个功能中,当用户申请的作业的存放空间大于当前内存拥有的最大的内存空间,则该程序不给予分配。在完成作业的功能中,程序将原来分配给作业的内存空间按照存放在结构体中的内存空间的链表回收。显示位示图的功能就是将现在的位示图显示 到屏幕上。显示作业的相关信息就是将存放该作业的节点中包括的所有内容显示出来。
相关数据结构的说明
用来保存用户作业的相关信息的结构体的定义:
typedef struct node{
char jobname[20]; //申请内存空间的进程名
int num; //申请空间的大小(字节数)
int block; //分配的块数
int nums[PAGES]; //保存分配的块号
int slice; //保存碎片大小
struct node *next;
}jobs;
用来存放用户作业链表的头节点的结构体指针:
jobs *head;
用来存放当前的内存中剩余的空间数:
int sum;
各个模块的算法流程
从文件中读取位示图的模块:readdata()
开始进入到inf.txt,string s,int iagetline(in,s)!=NULL
开始
进入到inf.txt,string s,int ia
getline(in,s)!=NULL
Getline(in,s)!=NULL
istringstream sin(s)
b.push_back(ia)
a.push_back(b)
是
结束
否
是
否
用户选择功能模块:choose()
开始输入需要操作功能的代表数字添加作业模块
开始
输入需要操作功能的代表数字
添加作业模块
完成作业模块
显示作业信息模块
显示位示图模块
退出系统
其他数字
1
2
4
3
0
添加作业模块:add()
开始输入要添加的作业的进程名输入该作业需要的内存空间大小num
开始
输入要添加的作业的进程名
输入该作业需要的内存空间大小num
num%PAGESIZE==0
是
block=num/PAGESIZE
否
Block=num/PAGESIZE+1
block=sum
是
为这个作业申请一个节点,将作业的进程名,申请的字节数,占用的内存空的块数,这些块在内存中的位置,以及碎片的大小
sum=sum-block
将这个节点插在链表的最后一个位置上
否
进入到choose()模块中
结束
完成作业模块:finish()
开始输入要回收的作业的进程名p=head,q=p-next
开始
输入要回收的作业的进程名
p=head,q=p-next
p-next!=NULL
否
strcmp(q-jobname,name)==0
是
回收为作业分配的内存空间,即将原来分配的空间的对应的位示图的标志由1改为0,将原来的链表链接好
sum=sum+q-block
删除这个节点
否
结束
p=p-next
显示位示图的模块:tableview()
开始i=0iWORDNUM
开始
i=0
iWORDNUM
jWORD
j=0
couta[i][j]
coutendl
是
结束
否
是
否
显示用户作业的相关信息的模块:pageview()
开始p=head-nextp!=NULL
开始
p=head-next
p!=NULL
输出该节点指向作业名,存放空间等相关信息
是
结束
否
程序清单
五.简单的使用说明
1.作业的进程名作为唯一识别进程的主码。
文档评论(0)