操作系统实验五

  • 格式:docx
  • 大小:39.92 KB
  • 文档页数:8

实习报告(1) 实习题目用先进先出(FIFO)页面调度算法处理缺页中断(2) 程序中使用的数据结构及符号说明。

struct Page//创建页表的每一页的结构体{int number;//定义页号int flag;//定义标志int area;//定义块号int position;//定义在磁盘上的位置int unit;//定义单元号Page *next;};typedef Page ElemType;typedef struct CLNode//定义结点类型{ElemType Page;//结点的数据域为进程结构体struct CLNode *next;} CLNode, *CLinkList;//*CLinkList为结构指针类型(3) 打印一份源程序并附上注释。

#include <stdio.h>#include <malloc.h>#include <stdlib.h>#define TRUE 1#define FALSE -1struct Page//创建页表的每一页的结构体{int number;//定义页号int flag;//定义标志int area;//定义块号int position;//定义在磁盘上的位置int unit;//定义单元号Page *next;};typedef Page ElemType;typedef struct CLNode//定义结点类型{ElemType Page;//结点的数据域为进程结构体struct CLNode *next;} CLNode, *CLinkList;//*CLinkList为结构指针类型//函数声明int InitPage(Page *P,int number,int flag,int area,int position,int unit); void Executive(int nMax,CLinkList *tail);CLinkList crt_clinklist(Page *P1,Page *P2,Page *P3,Page *P4,Page *P5,Page *P6,Page *P7);CLinkList ExchangePage(CLinkList page_linklist,int n);CLinkList PutInPage(CLinkList page_linklist,int n);int main(){//定义页表的每一行Page P1,P2,P3,P4,P5,P6,P7;int n;int address;//初始化页表的每一行InitPage(&P1,0,1,5,11,070);InitPage(&P2,1,1,8,12,050);InitPage(&P3,2,1,9,13,015);InitPage(&P4,3,1,1,21,021);InitPage(&P5,4,0,-1,22,053);InitPage(&P6,5,0,-1,23,023);InitPage(&P7,6,0,-1,121,040);CLinkList page_linklist;//定义一个链表page_linklist=crt_clinklist(&P1,&P2,&P3,&P4,&P5,&P6,&P7);CLNode *p;char c;int i;c='Y';p=page_linklist;//输出初始页表情况printf("初始页表内容如下:\n");printf("页号标志主存块号在磁盘上的位置\n");for(i=0;i<7;i++){printf(" %d %d %d %d\n",p->Page.number, p->Page.flag,p->Page.area,p->Page.position);//打印初始页表p=p->next;}while(c=='Y'){printf("请输入需要访问的页号:\n");scanf("%d",&n);//读入访问的页号p=page_linklist;while(p->Page.number!=n)//找出所要访问的一页p=p->next;if(p->Page.flag==1){address=p->Page.area*100+p->Page.unit;printf("该指令的绝对地址为:%d\n",address);page_linklist=ExchangePage(page_linklist,n);p=page_linklist;//输出执行指令后的页表情况printf("页号标志主存块号在磁盘上的位置\n");for(i=0;i<7;i++){printf(" %d %d %d %d\n",p->Page.number, p->Page.flag,p->Page.area,p->Page.position);p=p->next;}}else{printf("%d页发生缺页中断.\n",p->Page.number);printf("已将%d页装入主存.\n",p->Page.number);page_linklist=PutInPage(page_linklist,n);p=page_linklist;//输出执行指令后的页表情况printf("页号标志主存块号在磁盘上的位置\n");for(i=0;i<7;i++){printf(" %d %d %d %d\n",p->Page.number,p->Page.flag,p->Page.area,p->Page.position);p=p->next;}}printf("是否继续访问:\n");//输入Y或N选择是否继续c=getchar();c=getchar();}return 0;}int InitPage(Page *P,int number,int flag,int area,int position,int unit)//初始化页表的一行{P->number=number;P->flag=flag;P->area=area;P->position=position;P->unit=unit;return (TRUE);}CLinkList crt_clinklist(Page *P1,Page *P2,Page *P3,Page *P4,Page *P5,Page *P6,Page *P7)/* 建立一个不带头结点的、采用尾指针的单向循环链表*/{CLinkList tail=NULL;CLNode *s;CLNode *head=NULL;//申请新的结点s=(CLNode *)malloc(sizeof(CLNode));s->Page=*P1;head=s;tail=s;s=(CLNode *)malloc(sizeof(CLNode));s->Page=*P2;tail->next=s;tail=s;s=(CLNode *)malloc(sizeof(CLNode));s->Page=*P3;tail->next=s;tail=s;s=(CLNode *)malloc(sizeof(CLNode));s->Page=*P4;tail->next=s;tail=s;s=(CLNode *)malloc(sizeof(CLNode));s->Page=*P5;tail->next=s;tail=s;s=(CLNode *)malloc(sizeof(CLNode));s->Page=*P6;tail->next=s;tail=s;s=(CLNode *)malloc(sizeof(CLNode));s->Page=*P7;tail->next=s;tail=s;tail->next=head;//构成循环链表return (tail->next);}CLinkList ExchangePage(CLinkList page_linklist,int n)//未发生缺页中断,将页号为n的页面放在页表第一行{CLNode *r,*s,*q;q=page_linklist;s=page_linklist;while(q->next!=s)q=q->next;s=q;r=s->next;while(r->Page.number!=n){s=s->next;r=r->next;}//判断所调用的页面是否为最后一页if(r!=q)//不是最后一页{s->next=r->next;r->next=q->next;q->next=r;page_linklist=q->next;}else//是最后一页{page_linklist=q;}if(r->Page.flag==0)//如果是标志位位0的页面,则将其标志位置为1r->Page.flag=1;return page_linklist;}CLinkList PutInPage(CLinkList page_linklist,int n){//发生缺页中断时,将页号为n的页面调入主存page_linklist=ExchangePage(page_linklist,n);//调用函数更改页表顺序CLNode *r,*s;r=page_linklist;s=r->next;while(s->Page.flag!=0){r=r->next;s=s->next;}r->Page.flag=0;//将调出主存的页面标志位置为0return page_linklist;}(4)流程图(5) 打印初始页表、每次调出(要调出一页时)和装入的页号、执行最后一条指令后在主存中的页面号(即数组的值)。