操作系统实验3 请求分页式存储管理
- 格式:docx
- 大小:61.72 KB
- 文档页数:5
实验3 请求分页存储管理实验目的(1)熟悉主存的分配与回收;(2)了解虚拟存储技术的特点;(3)掌握请求页式存储管理的页面置换算法;实验内容与步骤1、实验准备知识(1) 通过随机数产生一个指令序列(2) 将指令序列变换成为页地址流设:(3) 计算并输出下述各种算法在不同内存容量下的命中率a) 先进先出的算法(FIFO);b) 最近最少使用算法(LRU);c) 最佳淘汰算法(OPT);(4)所涉及的算法1)FIFO算法定义变量ptr。
一开始先预调页填满内存。
在这一部分,ptr指向下一个要存放的位置。
之后继续执行剩下的指令。
此时,ptr表示队列最前面的位置,即最先进来的位置,也就是下一个要被替换的位置。
ptr用循环加,即模拟循环队列。
2)LRU算法定义数组ltu[],即last_time_use来记录该页最近被使用的时间。
定义变量ti模拟时间的变化,每执行一次加一。
这个算法,我没有预调页,而是直接执行所有指令。
若当前需要的页没在内存里,就寻找最近最少使用的页,也就是ltu[]最小的页,即最近一次使用时间离现在最久的页,然后替换掉它。
或者在内存还未满时,直接写入,这个我以初始化内存里所有页为-1来实现。
若已经在内存里了,则只遍历内存内的页,把当前页的最近使用时间改一下即可。
3)OPT算法定义数组ntu[], 即next_time_use来记录下一次被使用的时间,即将来最快使用时间。
初始化为-1.开始时预调页填满内存里的页。
同样利用变量ptr来表示下一个要存放的位置从而控制预调页的过程。
接着初始化ntu数组为-1。
然后求出每一页下一次被使用的指令号,以此代替使用时间。
如果所有剩下的序列都没有用该页时,则还是-1.这种值为-1的页显然是最佳替换对象。
然后执行所有剩下的指令。
当该页不在内存里时,遍历ntu数组,遇到-1的直接使用该页,没有则用ntu[]值最大的,也就是最晚使用的。
无论该页在不在内存里,因为这一次已经被使用了,所以都应该更新这个页的ntu[],只需往前看要执行的页流,记录下第一个遇到的该页即可。
任务四、请求分页存储管理(虚拟存储)一、实验目的通过请求分页存储管理的设计,让学生了解虚拟存储器的概念和实现方法。
进行运行时不需要将所有的页面都调入内存,只需将部分调入内存,即可运行,在运行的过程中若要访问的页面不在内存时,则需求有请求调入的功能将其调入。
假如此时若内存没有空白物理块,则通过页面置换的功能将一个老的不用的页面淘汰出来,其中淘汰的算法有多种。
二、实验内容模拟仿真请求分页调度算法,其中淘汰的算法可选下列其一1、先进先出算法2、最近最久算法3、CLOCK算法三、实验代码#include<iostream>#include<vector>using namespace std;int n;typedef struct Queue{int time;int data;struct Queue *next;}Queue,*QueuePtr;typedef struct {QueuePtr front;QueuePtr rear;}LinkQueue;//fifo=======================================void InitQueue(LinkQueue &Q);void FiFoEnQueueRear(LinkQueue &Q,int e,vector<int> &v);void FiFoDeQueueFront(LinkQueue &Q);inline void PrintQueue(LinkQueue &Q);void FiFoFiFoDoQueueEarly(LinkQueue &Q,int a,vector<int> &v);void FiFoDoQueue(LinkQueue &Q,int a,vector<int> &v);inline int PanDuan(LinkQueue &Q,int a);inline int YeMianCount(LinkQueue &Q);void fifo();//lru=============================================void InitQueue(LinkQueue &Q);void EnQueueMid(LinkQueue &Q,int e,QueuePtr p,vector<int> &v);void EnQueueTheFist(LinkQueue &Q,int e);void PrintQueue(LinkQueue &Q);//void ZhiZhenInit(int n);void DoQueueEarly(LinkQueue &Q,int e,vector<int> &v);void EnQueueRear(LinkQueue &Q,int e,QueuePtr p,vector<int> &v);//void DeQueueFront(LinkQueue &Q);QueuePtr ZhiZhen(LinkQueue &Q,int e);void EnQueue(LinkQueue &Q,int e,vector<int> &v);//void DeQueue(LinkQueue &Q,QueuePtr p);int PanDuan(LinkQueue &Q,int a);int YeMianCount(LinkQueue &Q);void lru();QueuePtr OptimalZhiZhen(LinkQueue &Q,int e);//求出需要置换的页面的上一个页面的位置void EnQueue(LinkQueue &Q,int e,vector<int> &v,int i,vector<int> &vc);inline int YeMianCount(LinkQueue &Q);//使用内敛函数,提高性能inline int Destance(vector<int> &v,int i);inline void SubbDestance(LinkQueue &Q);//=================================================int main(){int k;for(;;){cout<<"请选择!"<<endl;cout<<"1——FiFo算法"<<endl;cout<<"2——LRU算法"<<endl;cout<<"0——退出"<<endl;cin>>k;if(k==0)break;else{switch(k){case 1:fifo();break;case 2:lru();break;default:cout<<" 请从以上的选择中选择一个选项!!"<<endl;}}}}//fifo========================================void InitQueue(LinkQueue &Q){Q.front=Q.rear=(QueuePtr)malloc(sizeof(Queue));if(!Q.front)cout<<"initqueue worng!"<<endl;Q.front->next=NULL;//return OK;}void FiFoEnQueueRear(LinkQueue &Q,int e,vector<int> &v){ QueuePtr p;p=(QueuePtr)malloc(sizeof(Queue));if(!p)cout<<"cannot malloc EnQueue of the p"<<endl;p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;v.push_back(e);//cout<<p->data;//return OK;}void FiFoDeQueueFront(LinkQueue &Q){QueuePtr p;if(Q.front==Q.rear)cout<<"the Queue is empty,cannot delete !!"<<endl;p=Q.front->next;Q.front->next=p->next;free(p);if(Q.rear==p)Q.rear=Q.front;//return OK}void PrintQueue(LinkQueue &Q){QueuePtr p;if(Q.front==Q.rear)cout<<"the Queue is empty,cannot print!"<<endl;p=Q.front;for(p=Q.front;p->next!=NULL;p=p->next){cout<<p->next->data<<" ";}cout<<endl;//retrun OK;}void FiFoFiFoDoQueueEarly(LinkQueue &Q,int a,vector<int> &v){ QueuePtr p;int count=0;//设置标志位,记录重复的个数。
简述请求分页存储管理方式请求分页存储管理方式是一种非常实用的存储管理方式,它可以将大量数据分成多页存储,从而增加系统的可扩展性和可维护性。
本文将分步骤阐述请求分页存储管理方式的实现过程。
1. 设计数据库表结构首先,我们需要设计出适合分页存储的数据库表结构。
通常,我们需要将数据表按照某种规则分成多个页面,每个页面中包含相同数量的数据。
例如,如果需要将1000条数据分成10页,那么每个页面应该包含100条数据。
2. 编写查询语句在设计好数据库结构之后,我们需要编写查询语句来查询数据并将其分页。
我们可以使用LIMIT关键字来限制查询结果的数量,并使用OFFSET关键字来指定从哪个位置开始查询。
例如,如果需要查询第2页的数据,那么我们可以使用以下SQL语句:SELECT * FROM table_name LIMIT 100 OFFSET 100;这将返回第101到第200条数据。
3. 编写分页控件分页控件是实现分页存储的重要组成部分。
它通常包含一个页面选择器和一个数据显示区域。
我们可以使用JavaScript和CSS来创建翻页效果和样式。
例如,我们可以使用以下代码创建一个简单的页面选择器:```<div class="pagination"><a href="#">1</a><a href="#">2</a><a href="#">3</a><a href="#">4</a><a href="#">5</a></div>```4. 实现异步加载异步加载是将页面动态加载到用户界面中的一种技术。
它可以大大提高页面加载速度和用户体验。
我们可以使用AJAX等技术来实现异步加载。
操作系统-请求页式存储管理实验报告分析解析实验背景在计算机系统中,内存是一项很重要的资源。
其中,操作系统需要管理内存,以便为用户进程和内核提供适当的内存空间。
页式内存管理是操作系统能够管理和维护内存的一种方式。
在页式内存管理中,主存分为固定大小的框架,称为页框,而进程的地址空间被分割为固定大小的页。
页式内存管理系统采用了一种称为“请求页式存储”的技术,允许进程只存取正在使用的那些页面。
这样可以节省空间,并且提高了处理器访问内存的速度。
实验环境本次实验使用的操作系统是 Ubuntu 20.04 LTS 操作系统。
实验目标本次实验的主要目标是通过模拟请求页式内存管理系统,来了解和深入理解页式内存管理技术。
本次实验需要完成以下任务:1.编写一个简单的请求页式存储模拟器;2.使用该模拟器对作业和内存进行模拟;3.分析模拟结果并撰写实验报告。
实验过程阅读并理解作业说明在开始实验之前,我们首先需要阅读和了解具体的作业说明。
在本次实验中,我们需要完成一个请求页式存储模拟器,以及使用该模拟器对作业与内存进行模拟。
编写模拟器在了解了作业说明后,我们开始按照作业的要求,编写请求页式内存管理模拟器。
在这里,我们需要使用到Python 编程语言。
实际上,我们在编写该模拟器时,主要分为以下几步:1.文件操作:首先,我们需要通过读取文件中的数据来模拟进程对内存的请求。
在输入文件中,每一行表示一个请求,包含了进程 ID、请求的地址和访问类型。
2.内存分配:接着,我们需要模拟请求页式内存管理系统中对于内存分配的操作,即在访问时,将需要的页加载到内存中,如果内存已满,则需要选择一个页面将其从内存中移除,为新的页面腾出空间。
3.页面置换:如果进行页面置换,则需要选出最久未访问的页面并移出内存,空出空间用于新的页面,这就是所谓的“最久未使用”(LRU)策略。
进行模拟有了模拟器之后,我们就可以针对不同的作业和内存大小进行实验。
在实验的过程中,我们可以观察不同大小的内存和不同的作业怎样影响模拟的结果。
《网络操作系统》课程设计报告书题目:请求调页存储管理方式的模拟学号:学生姓名:指导教师:年月日目录一. 实验内容................................................... 错误!未定义书签。
二. 实验目的................................................... 错误!未定义书签。
三. 设计思想................................................... 错误!未定义书签。
四. 程序流程图................................................. 错误!未定义书签。
五. 程序清单................................................... 错误!未定义书签。
六. 运行结果及分析............................................. 错误!未定义书签。
七. 总结....................................................... 错误!未定义书签。
一、实验内容1.假设每个页面中可存放10条指令,分配给作业的内存块数为4。
2.用C语言或C++语言模拟一个作业的执行过程,该作业共有320条指令,即它的地址空间为32页,目前它的所有页都还未调入内存。
在模拟过程中,如果所访问的指令已在内存,则显示其物理地址,并转下一条指令。
如果所访问的指令还未装入内存,则发生缺页,此时需记录缺页的次数,并将相应页调入内存。
如果4个内存块均已装入该作业,则需进行页面置换,最后显示其物理地址,并转下一条指令。
在所有320指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。
3.置换算法:请分别考虑最佳置换算法(OPT)、先进先出(FIFO)算法和最近最久未使用(LRU)算法。
请求分页式存储管理一、问题描述设计一个请求页式存储管理方案,为简单起见。
页面淘汰算法采用 FIFO 页面淘汰算法,并且在淘汰一页时,只将该页在页表中修改状态位。
而不再判断它是否被改写过,也不将它写回到辅存。
二、基本要求页面尺寸 1K ,输入进程大小(例如 5300bytes),对页表进行初始化页表结构如下:页号物理块号状态位0 2 True (在主存 )1 12 False (在辅存 )3 04 False (在辅存 )5 False (在辅存 )系统为进程分配 3 个物理块(页框),块号分别为 0、1、 2,页框管理表(空闲块表):物理块号是否空闲0 true1 true2 true任意输入一个需要访问的指令地址流(例如:3635、 3642、 1140、 0087、 1700、 5200、4355,输入负数结束),打印页表情况。
每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页框未满(查空闲块表,找到空闲块),则调入该页并修改页表,打印页表情况;如果该页不在主存且页框已满,则按 FIFO 页面淘汰算法淘汰一页后调入所需的页,修改页表,打印页表情况。
存储管理算法的流程图见下页。
三、实验要求完成实验内容并写出实验报告,报告应具有以下内容:1、实验目的。
2、实验内容。
3、程序及运行情况。
4、实验过程中出现的问题及解决方法。
#include<stdio.h>#include<stdlib.h>int PUB[20][3];int ABC[3][2]={{0,1},{1,1},{2,1}};//物理块int key=0;void output(int size){//打印int i,j;printf(" 页号 \t\t 物理块号 \t\t 状态位 \n\n");for(i=0;i<size;i++){printf(" %d\t\t%d\t\t\t%d\n\n",PUB[i][0],PUB[i][1],PUB[i][2]);}printf(" 物理块号 \t\t 是否空闲 \n\n");for(i=0;i<3;i++){printf(" %d\t\t\t%d\n\n",ABC[i][0],ABC[i][1]);}}void main(){int size;int i,j;int address=0;int select=0;printf(" 请输入进程大小\n");scanf("%d",&size);if(size<=0 || size>20000){printf(" 进程大小超出范围\n");exit(0);}size%1000==0 ? size=size/1000 : size=size/1000+1;for(i=0;i<size;i++){PUB[i][0]=i;//页号PUB[i][1]=0; //物理块号PUB[i][2]=0; //状态位}output(size);while(1){printf(" 输入指令地址\n");scanf("%d",&address);if(address<0 || address>20000){printf(" 地址超出范围 \n");exit(0);}address%1000==0 ? address=address/1000 : address=address/1000;if(PUB[address][2]==0) //不在主存{if(ABC[2][1]==0)//满了{printf(" 满了 \n");key++;if(select!=address)for(i=0;i<size;i++){if(PUB[i][1]==key){PUB[i][1]=0;PUB[i][2]=0;}}PUB[address][1]=key;PUB[address][2]=1;key++;if(key>3) key=1;}if(ABC[2][1]==1)//没满{printf(" 没满 \n");for(i=0;i<3;i++){if(ABC[i][1]==1){ABC[i][1]=0;PUB[address][1]=i+1;PUB[address][2]=1;break;}}}output(size);}else{printf(" 该页已在内存 \n");output(size);}select=address;}}开始输入进程大小,对页表进行初始化输入要访问的地址0<= 地址 <=进程大小结束是计算页号 , 查页表是该页已是否在主存页框未满是调入该页并修改页表淘汰一页后调入所需的页,修改页表打印页表。
操作系统实验三报告一.实验名称:分页存储管理二.实验目的:了解分页存储管理在内存空间分配的作用三.实验内容:分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号,相应的,也把内存空间分成与页面相同大小的若干个存储块,称为物理块或页框,同样加以编号,在为进程分配内存时,以块为单位将进程的若干个也分别装入到多个可以不相邻的物理块中。
系统为每个进程建立了一张页面映像表,简称页表。
位示图是利用二进制的一位来表示磁盘中的一个盘块的使用情况,这里用位示图来表示内存分配情况。
四.实验代码#include <stdafx.h>#include <stdlib.h>#include <stdio.h>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("请分别输入页表的页号及块号(-1表示空):\n");printf("\n页号块号\n");while (i<n){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该页表为:");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;if(n<=g[N+1][0]){while(p){for(i=0;i<N;i++){for(j=0;j<N;j++){if(g[i][j]==0){p->blockNum=N*i+j;g[i][j]=1;g[N+1][0]--;break;}}break;}p=p->next;}return head;}}/*回收已经完成的页*/linklist Recy(linklist head,int g[100][100],int n,int N){int i,j;linklist p;p=head->next;while(p&&p->pageNum!=n){p=p->next;}if(p){i=p->blockNum/N;j=p->blockNum%N;g[i][j]=0;g[N+1][0]++;p->blockNum=-1;}return head;}/*打印位示图*/void printStr(int g[100][100],int N) {int i,j;printf("此时位示图为:\n ");for(i=0;i<N;i++){printf(" ");printf("%d",i);}printf("\n");for(i=0;i<N;i++){printf("%d",i);for(j=0;j<N;j++){printf(" ");printf("%d",g[i][j]);}printf("\n");}}void main(){int n,N,x,y;int graph[100][100];linklist head;printf("输入位示图的字长:");scanf("%d",&N);printf("输入作业的页数:");scanf("%d",&n);head=creatlinklist(n);print(head);init(graph,N);printStr(graph,N);printf("\n现在进行作业分配:");head=Dis(head,graph,n,N);print(head);printStr(graph,N);printf("是否回收已完成的页,“是”1,“否”0:");scanf("%d",&x);if(x) //判断是否要回收{printf("\n请输入您要回收的页号:");scanf("%d",&y);head=Recy(head,graph,y,N);print(head);printStr(graph,N);}}五.实验截图:六.实验心得:通过这次实验,了解到分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号,相应的,也把内存空间分成与页面相同大小的若干个存储块,称为物理块或页框,同样加以编号,在为进程分配内存时,以块为单位将进程的若干个也分别装入到多个可以不相邻的物理块中。
操作系统实验报告三存储器管理实验操作系统实验报告三:存储器管理实验一、实验目的本次存储器管理实验的主要目的是深入理解操作系统中存储器管理的基本原理和方法,通过实际操作和观察,掌握内存分配与回收的算法,以及页面置换算法的工作过程和性能特点,从而提高对操作系统资源管理的认识和实践能力。
二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 C++,开发工具为 Visual Studio 2019。
三、实验内容1、内存分配与回收算法实现首次适应算法(First Fit)最佳适应算法(Best Fit)最坏适应算法(Worst Fit)2、页面置换算法模拟先进先出页面置换算法(FIFO)最近最久未使用页面置换算法(LRU)时钟页面置换算法(Clock)四、实验原理1、内存分配与回收算法首次适应算法:从内存的起始位置开始,依次查找空闲分区,将第一个能够满足需求的空闲分区分配给进程。
最佳适应算法:在所有空闲分区中,选择能够满足需求且大小最小的空闲分区进行分配。
最坏适应算法:选择空闲分区中最大的分区进行分配。
2、页面置换算法先进先出页面置换算法:选择最早进入内存的页面进行置换。
最近最久未使用页面置换算法:选择最近最长时间未被访问的页面进行置换。
时钟页面置换算法:给每个页面设置一个访问位,在页面置换时,从指针指向的页面开始扫描,选择第一个访问位为0 的页面进行置换。
五、实验步骤1、内存分配与回收算法实现定义内存分区结构体,包括分区起始地址、大小、是否已分配等信息。
实现首次适应算法、最佳适应算法和最坏适应算法的函数。
编写测试程序,创建多个进程,并使用不同的算法为其分配内存,观察内存分配情况和空闲分区的变化。
2、页面置换算法模拟定义页面结构体,包括页面号、访问位等信息。
实现先进先出页面置换算法、最近最久未使用页面置换算法和时钟页面置换算法的函数。
编写测试程序,模拟页面的调入和调出过程,计算不同算法下的缺页率,比较算法的性能。
【操作系统】请求分页储存管理⽅式常规存储器管理⽅式(基本分页、基本分段)的特征(1) ⼀次性。
都要求将作业所有装⼊内存后⽅能执⾏。
很多作业在每次执⾏时,并不是其所有程序和数据都要⽤到。
假设⼀次性地装⼊其所有程序,造成内存空间的浪费。
(2) 驻留性。
作业装⼊内存后,便⼀直驻留在内存中,直⾄作业执⾏结束。
虽然执⾏中的进程会因I/O⽽长期等待,或有的程序模块在执⾏过⼀次后就不再须要(执⾏)了,但它们都仍将继续占⽤宝贵的内存资源。
虚拟存储器的定义应⽤程序在执⾏之前,没有必要所有装⼊内存,仅须将那些当前要执⾏的少数页⾯或段先装⼊内存便可执⾏,其余部分暂留在盘上。
程序在执⾏时,假设它所要訪问的页(段)已调⼊内存,便可继续执⾏下去;但假设程序所要訪问的页(段)尚未调⼊内存(称为缺页或缺段),此时程序应利⽤OS所提供的请求调页(段)功能,将它们调⼊内存,以使进程能继续执⾏下去。
假设此时内存已满,⽆法再装⼊新的页(段),则还须再利⽤页(段)的置换功能,将内存中临时不⽤的页(段)调⾄盘上,腾出⾜够的内存空间后,再将要訪问的页(段)调⼊内存,使程序继续执⾏下去。
虚拟存储器是指具有请求调⼊功能和置换功能,能从逻辑上对内存容量加以扩充的⼀种存储器系统。
其逻辑容量由内存容量和外存容量之和所决定,其执⾏速度接近于内存速度,⽽每位的成本却⼜接近虚拟存储器于外存。
可见,虚拟存储技术是⼀种性能很优越的存储器管理技术,故被⼴泛地应⽤于⼤、中、⼩型机器和微型机中。
请求分页存储管理⽅式1、定义:请求分页系统是建⽴在基本分页系统的基础上,为了能⽀持虚拟存储器功能⽽添加了请求调页功能和页⾯置换功能。
2、页表机制在请求分页系统中所须要的主要数据结构是页表。
其基本作⽤仍然是将⽤户地址空间中的逻辑地址变换为内存空间中的物理地址。
因为仅仅将应⽤程序的⼀部分调⼊内存,另⼀部分仍在盘上,故须在页表中再添加若⼲项,供程序(数现对当中各字段说明例如以下:(1) 状态位P:⽤于指⽰该页是否已调⼊内存,供程序訪问时參考。
请求分页式存储管理
为简单起见。
页面淘汰算法采用 FIFO 页面淘汰算法, 只将该页在页表中修改状态位。
而不再判断它是否被改写过, 也不
将它
输入进程大小(例如 5300bytes ),对页表进行初始化
系统为进程分配3个物理块(页框),块号分别为0、1、2,页框管理表(空闲块表)
任意输入一个需要访问的指令地址流(例如:
4355,输入负数结束),打印页表情况。
每访问一个地址时, 首先要计算该地址所在的页的页号, 然后查页表,判断该页是否在
主存 ——如果该页已在主存,则打印页表情况;如果该页不在主存且页框未满 (查空闲块表, 找到空闲块),则调入该页并修改页表,打印页表情况;如果该页不在主存且页框已满,则 按FIFO 页面淘汰算法淘汰一页后调入所需的页,修改页表,打印页表情况。
存储管理算法的流程图见下页。
三、实验要求
完成实验内容并写出实验报告,报告应具有以下内容:
1、 实验目的。
2、 实验内容。
3、 程序及运行情况。
4、 实验过程中出现的问题及解决方法。
#in clude<stdio.h>
#in clude<stdlib.h> int P UB[20][3];
int ABC[3][2]={{0,1},{1,1},{2,1}};// 物理块 int key=0;
一、 问题描述
设计一个请求页式存储管理方案, 并且在淘汰一页时, 写回到辅存。
二、 基本要求 页面尺寸1K , 页表结
构如下:
3635、 3642、 1140、 0087、 1700、 5200、
void output(int size){
//打印int i,j;
printf(”页号\t\t物理块号\t\t状态位\n\n");
for(i=0;i<size;i++)
{
printf(" %d\t\t%d\t\t\t%d\n\n",PUB[i][0],PUB[i][1],PUB[i][2]); }
printf(" 物理块号\t\t 是否空闲\n\n"); for(i=0;i<3;i++)
{
printf(" %d\t\t\t%d\n\n",ABC[i][0],ABC[i][1]);
}
}
void main(){ int size; int i,j; int address=0; int select=0;
printf(" 请输入进程大小\n"); scanf("%d",&size); if(size<=0 || size>20000) { printf(" 进程大小超出范围\n"); exit(0);
}
size%1000==0 ? size=size/1000 : size=size/1000+1;
for(i=0;i<size;i++) {
PUB[i][0]=i;
PUB[i][1]=0;
PUB[i][2]=0; } output(size);
while(1)
{//页号//物理块号//状态位
printf(" 输入指令地址\n"); scanf("%d",&address); if(address<0 || address>20000) { printf(" 地址超出范围\n");
exit(0);
}
address%1000==0 ? address=address/1000 : address=address/1000;
if(PUB[address][2]==0) // 不在主存{
if(ABC[2][1]==0)
//满了
{
printf(" 满了\n");
key++;
if(select!=address)
for(i=0;i<size;i++)
{
if(PUB[i][1]==key) {
PUB[i][1]=0;
PUB[i][2]=0;
}
}
PUB[address][1]=key;
PUB[address][2]=1; key++;
if(key>3) key=1;
}
if(ABC[2][1]==1)
//没满
{
printf(" 没满
\n");
for(i=0;i<3;i++)
{
if(ABC[i][1]==1)
{
ABC[i][1]=0;
PUB[address][1]=i+1;
PUB[address][2]=1;
break;
}
}
} output(size);
} }} else
{
printf(" 该页已在内存\n"); output(size); } select=address;。