4-基本分页管理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验报告
一、实验题目
基本分页存储管理
二、实验目的
弄明白基本分页管理算法的工作原理。了解分页存储管理在内存空间分配的作用。
三、实验要求
页表的设置以及初始化;
页块的分配与回收;
四、实验内容
分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号,相应的,也把内存空间分成与
页面相同大小的若干个存储块,称为物理块,同样加以编号,在为进程
分配内存时,以块为单位将进程的若干个也分别装入到多个可以不相邻
的物理块中。系统为每个进程建立了一张页面映像表,简称页表。位示
图是利用二进制的一位来表示磁盘中的一个盘块的使用情况,这里用位
示图来表示内存分配情况。
1. 页表
页表由页号与块号组成。页表的大小由进程或作业的长度决定。例如,对于一个每页长1k,大小为20k的进程来说,如果一个内存单元存
放一个页表项,则只要分配给该页表20个存储单元即可。页式管理是每
个进程至少拥有一个页表。实验中对页表的定义如下typedef struct node
{ datatype pageNum,blockNum;(页号和块号)
struct node *next;}linknode;
2.存储页面表(本实验中采用位示图法)
位示图也是整个系统一张,它指出内存各页面是否已被分配出去,以及未分配页面的总数。在内存中划分一块固定区域,每个单元的
每个比特代表一个页面,如果该页面已被分配,则对应比特位置为1,
否则为0。
3.作业回收
键盘输入所要回收的作业名(如有重名,则都撤销),搜索作业申请表,每遇到作业名相同的,则将作业大小及状态改为0(表示撤销),搜索页表,
当作业名相同时,根据页表修改位示图中相应单元为未分配(0).
五、实验结果:
六、实验小结
本次试验是关于基本分页管理的,主要是能够实现物理块的分配与回收,在架构修改实验代码的过程中确实遇到了不少的问题,比如,分配不到指定的物理块,或者是有的分配到了而有的没有分配到,这个原因已经找到,是因为在求位示图的行和列时,行号和列号老是出错,如,blockNum%N求列号时,是否该-1操作,在那-1操作等。总之在系统设计时能够想到应该用怎样方法来模拟实现页面分配以及相关函数所用的算法思想,但在实际研究修改代码的时候却遇到不少困难,不能把自己的设计通过代码实现出来,费了很多周折,暴露了自己在学习中眼高手低,实践能力差的问题。这让我
认识到课本上的基本知识在实际应用中的重要作用,以后在学习过程中一定要克服自己的浮躁心理,把最最基本的知识彻底掌握,这样才能不断的提高和进步,最基本的总是最有用的。
附录:
#include
#include
typedef int datatype;
typedef struct node
{
datatype pageNum,blockNum;
struct node *next;
}linknode;
typedef linknode *linklist;
/*尾插法创建带头结点的单链表*/
linklist creatlinklist(int n)
{
linklist head,r,s;
int x,y,i=0;
head=r=(linklist)malloc(sizeof(linknode));
printf("***********创建页表***********\n");
printf("\n请分别输入页表的页号及块号(-1表示空):\n");
printf("\n页号| 块号\n");
while (i { scanf("%d %d",&x,&y); s=(linklist)malloc(sizeof(linknode)); s->pageNum=x; s->blockNum=y; r->next=s; r=s; i++; } r->next=NULL; return head; } /*输出带头结点的单链表*/ void print(linklist head) { linklist p; p=head->next; printf("\n该页表为:\n"); printf("\n"); printf("\n页号| 块号\n"); while(p) { printf("%d%7d\n",p->pageNum,p->blockNum ); p=p->next; } printf("\n"); } /*初始化位示图,将值全置为零,0表示空闲状态*/ void init(int g[100][100],int N) { int i,j; for(i=0;i<100;i++) { for(j=0;j<100;j++) { g[i][j]=0; //全置为零 } } g[N+1][0]=N*N; //在数组最后一个数的后面设置一个空间用来存放剩余空闲块数} /*对作业的每一个页进行分配对应位示图里的块*/ linklist Dis(linklist head,int g[100][100],int n,int N) { linklist p; int i,j; p=head->next;