基本分页存储管理的模拟实现.docx

上传人:b****4 文档编号:4255337 上传时间:2023-05-06 格式:DOCX 页数:15 大小:235.26KB
下载 相关 举报
基本分页存储管理的模拟实现.docx_第1页
第1页 / 共15页
基本分页存储管理的模拟实现.docx_第2页
第2页 / 共15页
基本分页存储管理的模拟实现.docx_第3页
第3页 / 共15页
基本分页存储管理的模拟实现.docx_第4页
第4页 / 共15页
基本分页存储管理的模拟实现.docx_第5页
第5页 / 共15页
基本分页存储管理的模拟实现.docx_第6页
第6页 / 共15页
基本分页存储管理的模拟实现.docx_第7页
第7页 / 共15页
基本分页存储管理的模拟实现.docx_第8页
第8页 / 共15页
基本分页存储管理的模拟实现.docx_第9页
第9页 / 共15页
基本分页存储管理的模拟实现.docx_第10页
第10页 / 共15页
基本分页存储管理的模拟实现.docx_第11页
第11页 / 共15页
基本分页存储管理的模拟实现.docx_第12页
第12页 / 共15页
基本分页存储管理的模拟实现.docx_第13页
第13页 / 共15页
基本分页存储管理的模拟实现.docx_第14页
第14页 / 共15页
基本分页存储管理的模拟实现.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基本分页存储管理的模拟实现.docx

《基本分页存储管理的模拟实现.docx》由会员分享,可在线阅读,更多相关《基本分页存储管理的模拟实现.docx(15页珍藏版)》请在冰点文库上搜索。

基本分页存储管理的模拟实现.docx

基本分页存储管理的模拟实现

 

基本分页存储管理的模拟实现

 

学院:

专业:

学生姓名:

学号:

指导教师:

 

2014年3月18日

 

 

二、相关操作系统的知识介绍………………………………2

四、程序功能说明……………………………………………3

九、程序代码………………………………………………7

 

一、设计内容

根据设计要求实现对基本分页存储管理的模拟

二、相关操作系统的知识介绍

连续分配方式会形成许多“碎片”,虽然可通过“紧凑”方法将许多碎片拼接成可用的大块空间,但须为之付出很大的开销。

如果允许将一个进程直接分散的装入到许多不相邻接的分区中,则无需在进行“紧凑”。

基于这一思想而产生了离散分配方式。

如果离散分配的基本单位是页,则称为分页存储管理方式;如果离散分配的基本单位是段,则称为分段存储管理方式。

在分页存储管理方式中,如果不具备页面对换功能,则称为基本的分页存储管理方式,或称为纯分页存储管理方式,它不具有支持实现虚拟存储的功能,它要求把每个作业全部装入内存后方能运行。

三、课程设计的目的及要求

1、课程设计的目的

操作系统课程设计是计算机专业重要的教学环节,它为我们提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。

●进一步巩固和复习操作系统的基础知识。

●培养我们结构化程序、模块化程序设计的方法和能力。

●提高我们调试程序的技巧和软件设计的能力。

●提高我们分析问题、解决问题以及综合利用C语言进行程序设计的能力。

2、设计要求

1.选择恰当的数据结构表示页表

2.进程名,进程所需页数,进程进行的操作(装入/退出)等操作可有键盘输入,也可从文件读出。

3.每进行一次进程的装入或者退出操作,就显示出操作执行后内存中各页的分配情况。

四、程序功能说明

函数各模块部分功能

voidCreatA()//创建内存新函数

voidNewNode(LinkList&L)//建立新进程

voidFreeNode(LinkList&L)//回收进程,释放内存

voidPrintf(LinkListL)//显示所有进程所占物理块信息

voidlook(LinkListL)//查看进程信息

voidshowit()//显示内存块使用信息

函数的整体功能

这个程序是为了实现离散分配方式,以消减内存的外零头,提高内存的利用率,由系统把逻辑地址划分为页号和页内地址两部分。

通过这个程序实现了将进程分页处理,划分物理块。

五、算法整体思想

先定义A[100]来记录内存物理块;max=99来记录内存物理块数;count=100来记录未使用的物理块数。

首先通过CreatA()函数初始化内存而后通过NewNode(LinkList&L)建立新的进程,输入进程号,进程名,进程大小,计算出所需要的进程页数以及分配物理块。

通过FreeNode(LinkList&L)来删除所选择的进程信息,释放内存。

通过Printf(LinkListL)显示以上两个函数所产生的进程信息。

而后通过look(LinkListL)查看进程信息。

通过showit()显示内存物理块的分布情况。

当输入进程号new_node->f,然后通过j=0至j>3时终止,如若p->f=newnode->f当是时进程存在,重新输入,当不是时p=p->next;如若非此情况则输入进程名称和进程大小,然后通过进程页数n=size/1024,若页内地址k!

=0,n=n+1显示所需页数,比较页数与物理块的大小,如果页数大于物理块数则内存物理块不足,新建进程失败;如果小于则分配内存物理块。

 

六、主要功能模块进程图

 

 

Y

 

N

 

Y

N

 

七、实验结果

添加进程

删除进程

内存使用情况

查看进程

八、实验总结

通过本次操作系统课设,本次课设为我们提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。

进一步巩固和复习操作系统的基础知识。

培养我们结构化程序、模块化程序设计的方法和能力。

提高我们调试程序的技巧和软件设计的能力。

提高我们分析问题、解决问题以及综合利用C语言进行程序设计的能力。

本次课设掌握了如何创建一个进程,添加进程和删除进程。

通过本次课设,我也发现我的好多不足之处,首先在源程序的录入上就遇到了很大的麻烦,由于英文录入的速度比较慢,在源程序代码的录入上就花费了很多的功夫,还有就是C语言的基本功还不够扎实,出现了很多不该出现的毛病,还好在设计过程,让我深深体会到老师在课堂上讲的内容和要注意的地方的重要性,也正是老师在课堂上提前给我们做了提醒和学习,我在设计时才没花费太多的时间去更正这些问题。

在以后的学习中,我一定要注意基本功的学习。

谢谢老师对我的指导与教诲,在今后的学习中一定会用心再用心,不辜负老师对学生的教诲!

九、程序代码

#include"stdio.h"

#include"stdlib.h"

#include"string.h"

intA[100];//内存物理块,0:

未使用,非0:

已使用

intmax=99;//记录内存的物理块数,值为A[100]最大下标

intcount=100;//记录内存未使用物理块数

typedefstructLNode

{

intf;//进程号

charname[8];//进程名

intsize;//进程大小

intn;//进程页数

intye[100];//页表,下标表示页号,内容表示进程各页所在物理块

structLNode*next;}LNode,*LinkList;//内存初始化

voidCreatA()

{

inti=0;

for(i=0;i<=max;i++)

A[i]=0;

}//建立新进程

voidNewNode(LinkList&L)

{

inti,j;

intm,k;

LinkListp;

LinkListnew_node;

new_node=(LinkList)malloc(sizeof(LNode));

p=L;

printf("输入进程号:

");

scanf("%d",&new_node->f);

j=0;

while(p!

=NULL&&j<3)//查找进程号是否重复

{

if(p->f!

=new_node->f)

p=p->next;

else

{

printf("\n该进程已存在,重新输入:

");

scanf("%d",&new_node->f);

p=L;//p重新指向头结点

j++;

}

}

if(j<3)

{printf("输入进程名称:

");

scanf("%s",new_node->name);

printf("输入进程的大小:

");

scanf("%d",&new_node->size);

new_node->n=new_node->size/1024;

k=new_node->size%1024;

if(k!

=0)

new_node->n=new_node->n+1;

printf("所需要的页数为:

");

printf("%d\n",new_node->n);

if(new_node->n>count)

{

printf("\n内存物理块不足,新建进程失败\n\n");

}

else

{

count-=new_node->n;

m=0;

for(i=0;i<=max;i++)

if(A[i]==0&&mn)

{

A[i]=new_node->f;

new_node->ye[m]=i;

m++;

}

if(L==NULL)

L=new_node;

else

{

p=L;//查找最后一个节点

while(p->next!

=NULL)

{

p=p->next;

}

p->next=new_node;

}

new_node->next=NULL;

}

}

else

{

printf("\n错误次数过多,返回主菜单:

");

}

}//回收进程,释放内存

voidFreeNode(LinkList&L)

{

LinkListp,q;intz;

printf("请输入要删除的进程号:

");

scanf("%d",&z);

p=L;//查找进程;用p记录

q=p;

while(p!

=NULL)

{

if(p->f==z)

{

printf("该进程已删除");

break;

}

else

{

q=p;

p=p->next;

}

}

if(p==NULL)

{

printf("\n该进程不存在\n");

}

else

{

for(inti=0;in;i++)

A[p->ye[i]]=0;

count+=p->n;

if(p->f==q->f)//要删除的是头结点

{

L=p->next;

}

else

{

q->next=p->next;

}

}

}//显示所有进程占用的物理块

voidPrintf(LinkListL)

{

inti=0;

printf("\n内存物理块分配情况:

\n");

LinkListp=L;

printf("该进程信息:

\n");

printf("进程号\t\t进程名称\t进程页数\t所用物理块\n");

while(p!

=NULL)

{

printf("%d\t\t",p->f);

printf("%s\t\t",p->name);

printf("%d\t\t",p->n);

inti;

for(i=0;in;i++)

printf("%d,",p->ye[i]);

printf("\n");

p=p->next;

}

}//查看进程

voidlook(LinkListL)

{

intz;

printf("输入要查询的进程号");

scanf("%d",&z);

LinkListp=L;

while(p!

=NULL)

{

if(p->f==z)

{

printf("进程号\t\t进程名称\t进程页数\t所用物理块\n");

printf("%d\t\t",p->f);

printf("%s\t\t",p->name);

printf("%d\t\t",p->n);

inti;

for(i=0;in;i++)

printf("%d,",p->ye[i]);

printf("\n");

break;

}

elsep=p->next;

}

if(p==NULL)

printf("要查询的进程不存在\n");

}//显示内存块使用情况,不分进程

voidshowit()

{

inti=0;

printf("内存物理块分配情况\n");

for(i=0;i<=max;i++)

{printf("%d\t",A[i]);

if(i%10==9)

printf("\n");

}

}

voidmain()

{

CreatA();

LinkListL=NULL;

inti=0;

do

{

printf("\t\t基本分页存储管理算法\n");

printf("\t\t******************************\n");

printf("\t\t*1.添加进程2.删除进程*\n");

printf("\t\t*3.内存使用情况4.查看进程*\n");

printf("\t\t******************************\n");

printf("请选择(select):

");

scanf("%d",&i);

switch(i){

case1:

NewNode(L);

Printf(L);

break;

case2:

FreeNode(L);

Printf(L);

break;

case3:

showit();

break;

case4:

look(L);

break;

}

}while(i!

=0);

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2