分页氏存储管理实验报告
分页存储实验报告
一、实验目的1. 理解分页存储的基本原理和作用。
2. 掌握分页存储的实现方法。
3. 分析分页存储对系统性能的影响。
4. 提高对虚拟内存管理的理解。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3. 实验工具:IDLE三、实验内容1. 分页存储的基本原理分页存储是将程序的逻辑地址空间划分为若干个大小相等的页,并将这些页存储在物理内存中。
在分页存储中,页表用于记录每个页在物理内存中的位置。
2. 分页存储的实现方法(1)定义数据结构首先,定义一个类来表示页表,该类包含以下属性:- 页号:表示页在逻辑地址空间中的编号。
- 物理页号:表示页在物理内存中的编号。
- 是否在内存:表示页是否在物理内存中。
(2)初始化页表在程序开始时,初始化页表,将所有页都标记为不在内存。
(3)处理页表请求当程序访问一个逻辑地址时,首先检查页表,如果该页在内存中,则直接访问;如果不在内存,则需要执行页面置换算法,将一个页替换出内存,并将需要访问的页加载到内存中。
(4)页面置换算法本实验采用LRU(最近最少使用)算法作为页面置换算法。
LRU算法的基本思想是:当一个页需要被替换出内存时,选择最近最少被访问的页进行替换。
3. 分析分页存储对系统性能的影响(1)提高内存利用率分页存储可以将程序中不常用的页存储在磁盘上,从而提高内存利用率。
(2)减少内存碎片分页存储可以减少内存碎片,因为每个页的大小是固定的,不会出现大小不一的内存碎片。
(3)降低系统性能分页存储会降低系统性能,因为每次访问一个页时,都需要查询页表,如果页不在内存中,还需要执行页面置换操作,这将增加系统的开销。
四、实验步骤1. 编写程序实现分页存储的基本功能。
2. 设置不同大小的页,观察对内存利用率的影响。
3. 设置不同的页面置换算法,比较其对系统性能的影响。
4. 分析实验结果,得出结论。
五、实验结果与分析1. 设置不同大小的页当页的大小较小时,内存利用率较低,因为每个页只包含少量数据。
存储管理调度_实验报告
一、实验目的1. 理解操作系统存储管理的基本概念和原理。
2. 掌握分页式存储管理中地址转换和缺页中断的产生。
3. 学习并分析常见的页面调度算法,如先进先出(FIFO)算法、最近最少使用(LRU)算法等。
4. 比较不同页面调度算法的性能,提高对虚拟存储技术特点的理解。
二、实验环境1. 操作系统:Linux2. 编程语言:C语言3. 实验工具:gdb、gcc三、实验内容1. 模拟分页式存储管理中硬件的地址转换和产生缺页中断。
2. 使用先进先出(FIFO)页面调度算法处理缺页中断。
3. 使用最近最少使用(LRU)页面调度算法处理缺页中断。
4. 比较FIFO和LRU算法的性能。
四、实验步骤1. 定义虚拟页和实页的结构体,包括页号、物理页号、时间戳等。
2. 模拟地址转换过程,当访问的虚拟页不在内存时,产生缺页中断。
3. 使用FIFO算法处理缺页中断,将最早的页面替换出内存。
4. 使用LRU算法处理缺页中断,将最近最少使用的页面替换出内存。
5. 比较FIFO和LRU算法的性能,包括页面命中率、页面置换次数等。
五、实验结果与分析1. 实验结果(1)地址转换过程在模拟实验中,我们使用了一个简单的地址转换过程。
当访问一个虚拟页时,系统会检查该页是否在内存中。
如果在内存中,则直接返回对应的物理地址;如果不在内存中,则产生缺页中断。
(2)FIFO算法在FIFO算法中,当产生缺页中断时,系统会将最早进入内存的页面替换出内存。
实验结果显示,FIFO算法在页面访问序列较长时,页面命中率较低。
(3)LRU算法在LRU算法中,当产生缺页中断时,系统会将最近最少使用的页面替换出内存。
实验结果显示,LRU算法在页面访问序列较长时,页面命中率较高。
2. 实验分析(1)FIFO算法的缺点FIFO算法简单,但性能较差。
当页面访问序列较长时,FIFO算法可能会频繁地发生页面置换,导致页面命中率较低。
(2)LRU算法的优点LRU算法可以较好地适应页面访问模式,提高页面命中率。
分页存储管理实验报告(可打印修改)
四.实验代码 #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) {
for(j=0;j<100;j++) {
g[i][j]=0; } } g[N+1][0]=N*N; }
1
/*对作业的每一个页进行分配对应位示图 里的块*/ 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]) {
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;
虚拟页面管理实验报告(3篇)
第1篇一、实验目的1. 理解虚拟存储器的概念和作用。
2. 掌握分页式存储管理的基本原理和地址转换过程。
3. 熟悉几种常见的页面置换算法,并比较其优缺点。
4. 通过实验,加深对虚拟存储器管理机制的理解。
二、实验内容1. 模拟分页式存储管理中的地址转换过程。
2. 比较几种常见的页面置换算法:FIFO、LRU、LFU和OPT。
三、实验原理虚拟存储器是一种将内存和磁盘结合使用的存储管理技术,它允许程序使用比实际物理内存更大的地址空间。
虚拟存储器通过将内存划分为固定大小的页(Page)和相应的页表(Page Table)来实现。
1. 分页式存储管理分页式存储管理将内存划分为固定大小的页,每个页的大小相同。
程序在运行时,按照页为单位进行内存访问。
分页式存储管理的主要优点是内存碎片化程度低,便于实现虚拟存储器。
2. 页面置换算法当内存中没有足够的空间来存放新请求的页面时,需要将某个页面从内存中移除,这个过程称为页面置换。
以下介绍几种常见的页面置换算法:(1)FIFO(先进先出):优先淘汰最早进入内存的页面。
(2)LRU(最近最少使用):优先淘汰最近最少被访问的页面。
(3)LFU(最不频繁使用):优先淘汰最不频繁被访问的页面。
(4)OPT(最佳置换):优先淘汰未来最长时间内不再被访问的页面。
四、实验步骤1. 模拟分页式存储管理中的地址转换过程(1)创建一个模拟内存的数组,表示物理内存。
(2)创建一个模拟页表的数组,用于存放虚拟页号和物理页号之间的映射关系。
(3)模拟进程对内存的访问,将访问的虚拟页号转换为物理页号。
2. 比较几种常见的页面置换算法(1)创建一个模拟进程的数组,包含访问的虚拟页号序列。
(2)对每个页面置换算法,模拟进程的运行过程,记录缺页中断次数。
(3)计算不同页面置换算法的缺页率,并比较其性能。
五、实验结果与分析1. 分页式存储管理中的地址转换过程实验结果表明,分页式存储管理能够有效地将虚拟地址转换为物理地址,实现虚拟存储器。
(实验4)基于分页式管理方式的内存管理的设计与实现
实验4 内存管理一、实验内容在分页式管理方式下采用位示图来表示主存分配情况,实现主存空间的分配和回收。
二、实验目的掌握可变分区内存管理方式,能熟练运用内存管理的各种算法对内存进行分配和回收。
三、实验题目基于分页式管理方式的内存管理的设计与实现[提示]:(1) 分页式存储器把主存分成大小相等的若干块,作业的信息也按块的大小分页,作业装入主存时可把作业的信息按页分散存放在主存的空闲块中,为了说明主存中哪些块已经被占用,哪些块是尚未分配的空闲块,可用一张位示图来指出。
位示图可由若干存储单元来构成,其中每一位与一个物理块对应,用0/1表示对应块为空闲/已占用。
(2) 假设某系统的主存被分成大小相等的64块,则位示图可用8个字节来构成,另用一单元记录当前空闲块数。
如果已有第0,1,4,5,6,9,11,13,24,31,共10图4-1 最先适应分配模拟算法图4-2 主存回收算法(3) 当要装入一个作业时,根据作业对主存的需要量,先查当前空闲块数是否能满足作业要求,若不能满足则输出分配不成功。
若能满足,则查位示图,找出为“0”的一些位,置上占用标志“1”,从“当前空闲块数”中减去本次占用块数。
按找到的计算出对应的块号,其计算公式为:块号= j 8+i其中,j表示找到的是第n个字节,I表示对应的是第n位。
根据分配给作业的块号,为作业建立一张页表,页表格式:(4) 当一个作业执行结束,归还主存时,根据该作业的页表可以知道应归还的块号,由块号可计算出在位示图中的对应位置,把对应位的占用标志清成“0”,表示对应的块已成为空闲块。
归还的块数加入到当前空闲块数中。
由块号计算在位示图中的位置的公式如下:字节号 j=[块号/8] ([ ]表示取整)位数 i={块号/8} ({ }表示取余)(5) 设计实现主存分配和回收的程序。
假定位示图的初始状态如(2)所述,现有一信息量为5页的作业要装入,运行你所设计的分配程序,为作业分配主存且建立页表(格式如(3)所述)。
分页存储管理
页式存储管理实验报告姓名:xx 学号 xx 班级:xx一、实验目的:掌握分页式存储管理的基本概念和实现方法。
要求编写一个模拟的分页式管理程序,并能对分页式存储的页面置换算法进行编写和计算各个算法的缺页率。
二、程序设计:假定一个能够存放M个页面的内存,当发生缺页时,调入一个页面,通过LRU算法求出应该置换出的页面号。
输入一连串的页面号,程序自动选择调出的页面并计算缺页率。
设计页面置换算法,这里采用最近最久未使用置换算法LRU。
LRU算法的实现要归功于一个8位的寄存器的实现。
三、算法说明:执行程序时,当主存没有可用页面时,为了选择淘汰主存中的哪一页面,腾出1个空闲块以便存放新调入的页面。
淘汰哪个页面的首要问题是选择何种置换算法。
该程序采用LRU方法选择,依置换策略选择一个可置换的页面并计算它们的缺页率以便比较。
四、源程序:#define M 3#include<math.h>#include<stdio.h>int reg[2][M];int count;int num;int N;/********初始化函数,数组reg[0][i]存放页面号,初始化为-1,reg[1][i]当作寄存器,初始化为0*********/void init(){int i;count=0;num=0;N=pow(2,7); /********二进制数10000000**********/for(i=0;i<M;i++){reg[0][i]=-1;reg[1][i]=0;}}/*********寻找数组a中的最小值,返回最小值对应的下标***********/int min(int a[]){int i,index=0;int min=a[0];for(i=1;i<M;i++){if(min>a[i]){min=a[i];index=i;}}return index;}/***判断页面号x是否在数组中,如果在,返回对应的下标;否则返回-1***/ int isIn(int x,int a[]){int i;int index=-1;for(i=0;i<M;i++){if(a[i]==x){index=i;break;}}return index;}/**********判断虚拟的内存中是否已经存满了页面,如果满了,则返回-1,没有满则返回找到空的对应的第一个下标**************/int isFull(int a[]){int i,index=-1;for(i=0;i<M;i++){if(a[i]==-1){index=i;break;}}return index;}/*************页面置换方法*****************/void swap(int x){int i,k,temp,temp0;int index=isIn(x,reg[0]); /****判断x是否在reg[0]数组中*******/ if(index!=-1){reg[1][index]=reg[1][index]^N; /**reg[1][index]异或二进制数10000000**/}else{temp=isFull(reg[0]);if(temp!=-1){ /*******内存没有满,直接调入页面************/ reg[0][temp]=x;reg[1][temp]=reg[1][temp]^N;}else if(temp==-1){k=min(reg[1]); /**置换出寄存器中数值最小的对应的下标的页面***/temp0=reg[0][k]; /*********临时保留要换出的页面号*****/reg[0][k]=x;reg[1][k]=reg[1][k]^N;printf("the page %d is exchanged out!\n",temp0);/******打印要置换出的页号**************/count++; /*********置换次数加1**************/}}for(i=0;i<M;i++){reg[1][i]=reg[1][i]>>1; /********寄存器中的所有数右移一位*****/}}main(){int x;clrscr();init();printf("Input a sort of pages\n");printf("while you input -1 ,it will stop!\n");scanf("%d",&x);/********输入页面号,直到页面号为-1*********/while(x!=-1){num++; /*******输入的页面次数加1*******/swap(x);scanf("%d",&x);}/***************打印缺页数和缺页率**********************/printf("the count of Exchanged is: %d \n",count);printf("the rate of exchanged is: %f\n",count*1.0/num);getch();}五、实验结果:Input a sort of pageswhile you input -1 ,it will stop!712the page 7 is exchanged out!3the page 1 is exchanged out!4the page 2 is exchanged out!2the page 3 is exchanged out!43the page 0 is exchanged out!the page 2 is exchanged out!-1The count of exchange is: 6The rate of exchange is: 0.500000六、实验心得:通过这次实验,让我了解了页式存储管理的过程。
分页存储管理实验报告(word文档良心出品)
操作系统实验三报告一.实验名称:分页存储管理二.实验目的:了解分页存储管理在内存空间分配的作用三.实验内容:分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号,相应的,也把内存空间分成与页面相同大小的若干个存储块,称为物理块或页框,同样加以编号,在为进程分配内存时,以块为单位将进程的若干个也分别装入到多个可以不相邻的物理块中。
系统为每个进程建立了一张页面映像表,简称页表。
位示图是利用二进制的一位来表示磁盘中的一个盘块的使用情况,这里用位示图来表示内存分配情况。
四.实验代码#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);}}五.实验截图:六.实验心得:通过这次实验,了解到分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号,相应的,也把内存空间分成与页面相同大小的若干个存储块,称为物理块或页框,同样加以编号,在为进程分配内存时,以块为单位将进程的若干个也分别装入到多个可以不相邻的物理块中。
分页管理实验报告
一、实验目的1. 理解分页存储管理的基本原理和实现方法。
2. 掌握分页存储管理的优缺点。
3. 分析分页存储管理在实际应用中的效果。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3. 开发工具:PyCharm三、实验内容1. 分页存储管理的基本原理分页存储管理是一种虚拟存储管理技术,将程序的逻辑地址空间划分为若干个固定大小的页,并将物理内存也划分为同样大小的页帧。
程序在执行时,只将当前需要的页加载到内存中,其余页面则在需要时再进行加载,从而实现程序的虚拟存储。
2. 分页存储管理实现方法(1)分页地址转换分页地址转换通过页表实现。
页表记录了逻辑地址与物理地址的对应关系。
当程序访问内存时,需要根据页表将逻辑地址转换为物理地址。
(2)页面置换算法页面置换算法用于解决内存中已满,而新页面需要加载时如何选择页面替换的问题。
常见的页面置换算法有:FIFO(先进先出)、LRU(最近最少使用)、OPT(最优页面置换)等。
(3)缺页中断当程序访问的页面不在内存中时,会发生缺页中断。
操作系统会根据页面置换算法选择一个页面进行替换,并将所需的页面加载到内存中。
3. 实验步骤使用Python编写分页存储管理程序,实现分页地址转换、页面置换算法和缺页中断等功能。
(2)测试程序编写测试用例,模拟程序运行过程中的分页操作,观察分页存储管理的效果。
(3)分析实验结果根据实验结果,分析分页存储管理的优缺点,以及在实际应用中的效果。
四、实验结果与分析1. 分页存储管理程序实现通过Python编写分页存储管理程序,实现分页地址转换、页面置换算法和缺页中断等功能。
2. 实验结果(1)分页地址转换当程序访问内存时,分页存储管理程序能够正确地将逻辑地址转换为物理地址。
(2)页面置换算法通过FIFO、LRU和OPT等页面置换算法,程序能够有效地处理内存中的页面替换问题。
(3)缺页中断程序在访问未在内存中的页面时,能够正确地发生缺页中断,并将所需的页面加载到内存中。
实验六-分页存储器管理
上海应用技术学院程序设计语言实验报告实验名称分页存储器管理实验序号实验六实验日期姓名学号指导教师专业计算机科学与技术班级成绩一、实验目的及要求学习i386处理器的二级页表硬件机制,理解分页存储器管理原理。
查看EOS应用程序进程和系统进程的二级页表映射信息,理解页目录和页表的管理方式。
编程修改页目录和页表的映射关系,理解分页地址变换原理。
二、实验环境Windows XP;Tevation OS Lab。
三、实验内容1 准备实验按照下面的步骤准备本次实验:1.启动OS Lab。
2.新建一个EOS应用程序项目,如图1。
图12 查看EOS应用程序进程的页目录和页表使用OS Lab打开本实验文件夹中的memory.c和getcr3.asm文件如图2(将文件拖动到OS Lab窗口中释放即可打开)。
按照下面的步骤查看EOS应用程序进程的页目录和页表:图21.使用memory.c文件中的源代码替换之前创建的EOS应用程序项目中EOSApp.c文件中的源代码,如图3。
图32.右键点击“项目管理器”窗口中的“源文件”文件夹节点,在弹出的快捷菜单中选择“添加”中的“添加新文件”。
3.在弹出的“添加新文件”对话框中选择“asm 源文件”模板。
4.在“名称”中输入文件名称“func”。
5.点击“添加”按钮添加并自动打开文件func.asm,如图4。
图46.将getcr3.asm文件中的源代码复制到func.asm文件中,如图5。
图57.按F7生成修改后的EOS应用程序项目,如图6。
图68.按F5启动调试,如图7。
图79.应用程序执行的过程中,会将该进程的二级页表映射信息输出到虚拟机窗口和OS Lab“输出”窗口中。
10.将“输出”窗口中的内容复制到一个文本文件中。
3 查看应用程序进程和系统进程并发时的页目录和页表需要对EOS应用程序进行一些修改:1.结束之前的调试。
2.取消EOSApp.c第121行语句(该语句会等待10秒)的注释。
页式存储管理实验报告
页式存储管理一、实验目的:掌握分页式存储管理的基本概念和实现方法。
要求编写一个模拟的分页式管理程序,并能对分页式存储的页面置换算法进行编写和计算各个算法的缺页率。
二、程序设计:首先创建页面链指针数据结构,并设计页面映像表,采用数组的方法给定页面映像。
申请缓冲区,将一个进程的逻辑地址空间划分成若干个大小相等的部分,每一部分称做页面或页。
每页都有一个编号,叫做页号,页号从0开始依次编排,如0,1,2……。
设置等大小的内存块。
初始状态:将数据文件的第一个页面装入到该缓冲区的第0块。
设计页面置换算法,这里分别采用最佳页面置换算法OPT和最近最久未使用置换算法LRU,并分别计算它们的缺页率,以比较它们的优劣。
三、算法说明:执行程序时,当主存没有可用页面时,为了选择淘汰主存中的哪一页面,腾出1个空闲块以便存放新调入的页面。
淘汰哪个页面的首要问题是选择何种置换算法。
该程序采用人工的方法选择,依置换策略选择一个可置换的页,并计算它们的缺页率以便比较。
/*分页式管理实验-源程序*/#include"stdio.h"#define N 16#define num 5 /*进程分配物理块数目*/int A[N]={1,2,3,4,5,6,7,8,5,2,3,2,7,8,1,4}; /*页表映像*/typedef struct page{ int address; /*页面地址*/struct page *next;}page;struct page *head,*run,*rear;void jccreat() /*进程分配物理块*/{ int i=1;page *p,*q;head=(page *)malloc(sizeof(page)); p=head;for(i=1;i<=num;i++) { q=(page *)malloc(sizeof(page));p->next=q; q->address=0; q->next=NULL; p=q; }rear=p;}int search(int n){page *p;int i=0;p=head;while(p->next){if(p->next->address==n){printf("Get it at the page %d\n",i+1);run=p;return 1;}p=p->next;i++;}return 0;}void changeOPT(int n,int position){int i;int total=0;int flag=1;int distance[num];int MAX;int order=0;page *p,*q;p=head->next;q=head->next;for(i=0;i<num;i++)distance[i]=100;i=0;while(p){if(p->address==0){flag=0;break;}p=p->next;i++;}if(!flag){p->address=n;printf("Change the page %d\n",i+1);}else{while(q){for(i=position;i<N;i++){if(q->address==A[i])distance[total]=i-position;}total++;q=q->next;}MAX=distance[0];for(i=0;i<num;i++){if(distance[i]>MAX){MAX=distance[i];order=i;}}printf("Change the page %d\n",order+1);i=0;while(p){if(i==order)p->address=n;i++;p=p->next;}}}void changeLRU(int n){int i=0;int flag=1;page *p,*delect;p=head->next;while(p){if(p->address==0){flag=0;p->address=n;printf("Change the page %d\n",i+1);break;}p=p->next;i++;}if(flag){delect=head->next;head->next=delect->next;printf("Delect from the head, and add new to the end.\n");delect->address=n;rear->next=delect;rear=delect;rear->next=NULL;}}float OPT(){int i;int lose=0;float losef;float percent;for(i=0;i<N;i++){if(search(A[i])==0){lose++;changeOPT(A[i],i);}}losef=lose;percent=1-(losef/N);return percent;}float LRU(){int i;int lose=0;float losef;float percent;page *p;for(i=0;i<N;i++){if(search(A[i])==0){lose++;changeLRU(A[i]);}else{p=run->next;run->next=p->next;rear->next=p;rear=p;rear->next=NULL;printf("Move it to end of queue.\n");}}losef=lose;percent=1-(losef/N);return percent;}main() /*主函数部分*/{float percent;int choice;printf("Select the arithmetic:\n(1)OPT\n(2)LRU\nyour choice is:"); scanf("%d",&choice);/*选择页面置换算法*/jccreat(); /*创建进程*/if(choice==1) /*采用OPT算法置换*/{percent=OPT(); /*计算OPT时的缺页率*/ printf("The percent of OPT is %f",percent);}else if(choice==2) /*采用LRU算法置换*/ {percent=LRU(); /*计算LRU时的缺页率*/ printf("The percent of OPT is %f",percent);}else printf("Your choice is invalid.");getch();}四.运行结果:最佳(Optimal)置换算法:最近最久未使用(LRU)置换算法:五、心得体会掌握分页式存储管理的基本概念和实现方法。
分页存储实验报告
分页存储实验报告分页存储实验报告一、引言分页存储是计算机系统中一种常见的内存管理技术。
它将主存分成固定大小的页框,并将进程的地址空间划分为相同大小的页面。
本实验旨在通过设计和实现一个简单的分页存储系统,深入理解分页存储的原理和实现方式。
二、实验目标1. 设计并实现一个简单的分页存储系统;2. 理解分页存储的工作原理;3. 掌握分页存储的实现方法。
三、实验内容1. 设计页表结构页表是分页存储系统中的关键数据结构,用于记录页框与页面之间的映射关系。
在本实验中,我们可以使用一个简单的二维数组来表示页表。
其中,每一行表示一个页框,每一列表示一个页面,数组元素的值表示页面所在的页框号。
2. 实现地址转换地址转换是分页存储系统中的核心操作,它将逻辑地址转换为物理地址。
在本实验中,我们可以通过将逻辑地址的高位作为页号,低位作为页内偏移量,根据页表中的映射关系计算出物理地址。
3. 模拟页面置换算法页面置换算法是分页存储系统中解决内存不足问题的关键。
在本实验中,我们可以选择一种简单的页面置换算法,如FIFO(先进先出)算法或LRU(最近最少使用)算法,并在实验中模拟其运行过程。
四、实验步骤1. 设计页表结构根据实验要求,设计一个合适的页表结构,并初始化页表。
2. 实现地址转换根据页表的映射关系,实现逻辑地址到物理地址的转换函数。
3. 编写测试程序编写一个简单的测试程序,生成一系列逻辑地址,并通过地址转换函数将其转换为物理地址。
4. 模拟页面置换算法选择一种页面置换算法,并在测试程序中模拟其运行过程。
记录每次页面置换的情况,包括被置换出的页面和被置换入的页面。
五、实验结果与分析通过实验,我们可以得到一系列的物理地址,并根据页面置换算法的运行情况进行分析。
可以观察到不同页面置换算法对系统性能的影响,如命中率、缺页率等指标的变化。
六、实验总结通过本次实验,我们深入理解了分页存储的原理和实现方式。
通过设计和实现一个简单的分页存储系统,我们掌握了页表的结构和地址转换的方法,并熟悉了页面置换算法的运行过程。
实验四 分页式存储管理
实验四分页式存储管理自动化1203 张千伟201203870323一、实验目的1.熟悉分页式存储管理2.掌握最久未使用算法以及FIFO算法二、实验内容1.实验代码#include<conio.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#define bsize 4 //物理块大小#define psize 16 //进程大小typedef struct page{int num; /*记录页面号*/int time; /*记录调入内存时间*/}Page; /* 页面逻辑结构,结构为方便算法实现设计*/Page b[bsize]; /*内存单元数*/int c[bsize][psize]; /*暂保存内存当前的状态:缓冲区*/int queue[100]; /*记录调入队列*/int K; /*调入队列计数变量*/int phb[bsize]={0}; //物理块标号int pro[psize]={0}; //进程序列号int flag[bsize] = {0}; //进程等待次数(存放最久未被使用的进程标志)int i = 0, j = 0,k = 0; //i表示进程序列号,j表示物理块号int m = -1, n = -1; //物理块空闲和进程是否相同判断标志int max = -1,maxflag = 0; //标记替换物理块进程下标int count = 0; //统计页面缺页次数//**************************************************************//随机产生序列号函数int* build(){printf("随机产生一个进程序列号为:\n");int i = 0;for(i=0; i<psize; i++){pro[i] = 10*rand()/(RAND_MAX+1)+1;printf("%d ",pro[i]);}printf("\n");return(pro);}//查找空闲物理块int searchpb(){for(j=0; j<bsize; j++){if(phb[j] == 0){m = j;return m;break;}}return -1;}int searchpro()//查找相同进程{for(j = 0; j < bsize; j++){if(phb[j] == pro[i]){n = j;return j;}}return -1;}void empty()//初始化内存{for(i=0;i<bsize;i++)phb[i]=0;count=0; //计数器置零}void FIFO()//先进先出页面置换算法{for(i = 0; i<psize; i++){m=searchpb();n=searchpro(); //找flag值最大的for(j = 0; j < bsize;j++){if(flag[j]>maxflag){maxflag = flag[j];max = j;}}if(n == -1) //不存在相同进程{if(m != -1) //存在空闲物理块{phb[m] = pro[i]; //进程号填入该空闲物理块count++;flag[m] = 0;for(j = 0;j <= m; j++){flag[j]++;}m = -1;}else//不存在空闲物理块{phb[max] = pro[i];flag[max] = 0;for(j = 0;j < bsize; j++){flag[j]++;}max = -1;maxflag = 0;count++;}}else//存在相同的进程{phb[n] = pro[i];for(j = 0;j < bsize; j++){flag[j]++;}n = -1;}for(j = 0 ;j < bsize; j++){printf("%d ",phb[j]);}printf("\n");}printf("缺页次数为:%d\n",count);printf("\n");}void Init(Page *b,int c[bsize][psize]) /*初始化内存单元、缓冲区*/{int i,j;for(i=0;i<psize;i++){b[i].num=-1;b[i].time=psize-i-1;}for(i=0;i<bsize;i++)for(j=0;j<psize;j++)c[i][j]=-1;}int GetMax(Page *b) /*取得在内存中停留最久的页面,默认状态下为最早调入的页面*/ {int i;int max=-1;int tag=0;for(i=0;i<bsize;i++){if(b[i].time>max){max=b[i].time;tag=i;}}return tag;}int Equation(int fold,Page *b) /*判断页面是否已在内存中*/{int i;for(i=0;i<bsize;i++){if (fold==b[i].num)return i;}return -1;}/*LRU核心部分*/void Lruu(int fold,Page *b){int i;int val;val=Equation(fold,b);if (val>=0){b[val].time=0;for(i=0;i<bsize;i++)if (i!=val)b[i].time++;}else{queue[++K]=fold;/*记录调入页面*/val=GetMax(b);b[val].num=fold;b[val].time=0;for(i=0;i<bsize;i++)if (i!=val)b[i].time++;}}void LRU(){int i,j;K=-1;Init(b, c);for(i=0;i<psize;i++){Lruu(pro[i],b);c[0][i]=pro[i];/*记录当前的内存单元中的页面*/for(j=0;j<bsize;j++)c[j][i]=b[j].num;}/*结果输出*/printf("内存状态为:\n");printf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n");for(j=0;j<psize;j++)printf("|%2d ",pro[j]);printf("|\n");printf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n");for(i=0;i<bsize;i++){ for(j=0;j<psize;j++){if(c[i][j]==-1)printf("|%2c ",32);elseprintf("|%2d ",c[i][j]);}printf("|\n");}printf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n"); printf("\n调入队列为:");for(i=0;i<K+1;i++)printf("%3d",queue[i]);printf("\n缺页次数为:%6d\n缺页率:%16.6f",K+1,(float)(K+1)/psize);}// 主函数void main(){int sel ;do{printf("**********************************************************************\n");printf("\t欢迎进入操作系统界面\n");printf("\t1、产生随机序列\n");printf("\t2、最久未使用算法LRU\n");printf("\t3、先进先出算法FIFO\n");printf("\t4、比较两种算法\n");printf("\t0、退出\n");printf("请选择所要执行的操作0~5:\n");scanf("%d",&sel);switch(sel){case 0:printf("\n");system("pause");break;case 1:build();break;case 2:printf("最久未使用算\n");LRU();empty();printf("\n");break;case 3:printf("先进先出算\n");FIFO();empty();printf("\n");break;case 4:printf("先进先出算法\n");FIFO();empty();printf("最久未使用算法\n");LRU();empty();break;default: printf("请输入正确的选项号!");printf("\n\n");break;}}while(sel!=0);}2.实验结果三、实验总结本次实验使用c语言让我熟悉了分页置换存储管理的几种算法,理解了书上长篇幅的文字,形象的展示出两种算法的优缺点,加深了我对存储管理这一章内容的理解。
分页存储管理实验报告
分页存储管理实验报告分页存储管理实验报告引言在计算机科学领域,存储管理是一个重要的课题。
随着计算机应用的不断发展,对存储管理的要求也越来越高。
本实验旨在通过实践,深入了解分页存储管理的原理和实现方式,以及其在计算机系统中的应用。
一、实验目的本实验的主要目的是通过实践,加深对分页存储管理的理解。
具体目标如下:1. 理解分页存储管理的原理和概念;2. 掌握分页存储管理的实现方式;3. 熟悉分页存储管理在计算机系统中的应用。
二、实验原理分页存储管理是一种将物理内存划分为固定大小的页框,并将逻辑地址空间划分为相同大小的页的存储管理方式。
其主要原理如下:1. 将逻辑地址划分为页号和页内偏移两部分;2. 通过页表将逻辑地址映射到物理地址;3. 利用页表中的页表项实现地址映射。
三、实验过程1. 初始化页表:根据系统的物理内存大小和页框大小,计算出页表的大小,并进行初始化。
2. 地址映射:根据逻辑地址的页号,查找页表中对应的页表项,获取物理页框号,并将页内偏移与物理页框号组合得到物理地址。
3. 存储管理:根据物理地址,将数据存储到物理内存中的相应位置,或从物理内存中读取数据。
4. 内存分配:根据应用程序的需要,分配合适大小的物理内存页框,并更新页表。
四、实验结果通过实验,我们成功实现了分页存储管理,并进行了一系列测试。
实验结果表明,分页存储管理具有以下优点:1. 提高了内存利用率:通过将逻辑地址划分为固定大小的页,可以更好地利用物理内存空间。
2. 简化了内存管理:通过页表的使用,可以方便地进行地址映射和内存分配。
3. 提高了系统的稳定性:分页存储管理可以有效隔离不同进程之间的内存空间,提高了系统的稳定性和安全性。
五、实验总结本实验通过实践,深入了解了分页存储管理的原理和实现方式,并通过一系列测试验证了其在计算机系统中的应用效果。
实验结果表明,分页存储管理是一种高效、稳定的内存管理方式,可以提高系统的性能和稳定性。
存储器管理实验报告
一、实验目的1. 理解存储器管理的概念和作用。
2. 掌握虚拟存储器的实现原理。
3. 熟悉存储器分配策略和页面置换算法。
4. 提高动手实践能力,加深对存储器管理知识的理解。
二、实验环境1. 操作系统:Linux2. 编程语言:C/C++3. 开发环境:GCC编译器三、实验内容1. 虚拟存储器实现原理(1)分页式存储管理:将内存划分为固定大小的页,进程的逻辑地址空间也划分为相应的页。
内存与外存之间通过页表进行映射,实现虚拟存储器。
(2)页表管理:包括页表建立、修改和删除等操作。
(3)页面置换算法:包括FIFO、LRU、LRU时钟等算法。
2. 存储器分配策略(1)固定分区分配:将内存划分为若干个固定大小的分区,每个分区只能分配给一个进程。
(2)可变分区分配:根据进程需求动态分配内存,分为首次适应、最佳适应和最坏适应等策略。
(3)分页存储管理:将内存划分为固定大小的页,进程的逻辑地址空间也划分为相应的页,通过页表进行映射。
3. 页面置换算法(1)FIFO算法:根据进程进入内存的顺序进行页面置换,最早进入内存的页面将被淘汰。
(2)LRU算法:淘汰最近最少使用的页面。
(3)LRU时钟算法:结合LRU算法和FIFO算法的优点,通过一个时钟指针实现页面置换。
四、实验步骤1. 编写程序实现虚拟存储器的基本功能,包括分页式存储管理、页表管理、页面置换算法等。
2. 编写测试程序,模拟进程在虚拟存储器中的运行过程,观察不同页面置换算法的效果。
3. 分析实验结果,比较不同页面置换算法的性能差异。
五、实验结果与分析1. 实验结果通过模拟实验,验证了虚拟存储器的基本功能,包括分页式存储管理、页表管理、页面置换算法等。
实验结果显示,不同页面置换算法对系统性能的影响较大。
2. 实验分析(1)FIFO算法:实现简单,但可能导致频繁的页面置换,影响系统性能。
(2)LRU算法:性能较好,但实现复杂,需要额外的硬件支持。
(3)LRU时钟算法:结合LRU算法和FIFO算法的优点,在性能和实现复杂度之间取得平衡。
存储管理实验报告
一、实验目的1. 理解操作系统存储管理的概念和作用。
2. 掌握存储管理的基本算法和策略。
3. 通过实验,加深对存储管理原理的理解,提高实际操作能力。
二、实验环境1. 操作系统:Windows 102. 软件环境:虚拟机软件VMware Workstation 153. 实验平台:Linux系统三、实验内容1. 存储管理概述2. 页式存储管理3. 段式存储管理4. 分段分页存储管理5. 存储管理算法四、实验步骤1. 页式存储管理实验(1)设置虚拟内存:在Linux系统中,使用`cat /proc/meminfo`命令查看内存信息,然后使用`vmstat`命令查看虚拟内存的使用情况。
(2)编写实验程序:使用C语言编写一个简单的程序,模拟页式存储管理过程。
(3)运行实验程序:编译并运行实验程序,观察程序运行过程中页面的分配、置换和回收过程。
2. 段式存储管理实验(1)设置虚拟内存:同页式存储管理实验。
(2)编写实验程序:使用C语言编写一个简单的程序,模拟段式存储管理过程。
(3)运行实验程序:编译并运行实验程序,观察程序运行过程中段页的分配、置换和回收过程。
3. 分段分页存储管理实验(1)设置虚拟内存:同页式存储管理实验。
(2)编写实验程序:使用C语言编写一个简单的程序,模拟分段分页存储管理过程。
(3)运行实验程序:编译并运行实验程序,观察程序运行过程中段页的分配、置换和回收过程。
4. 存储管理算法实验(1)编写实验程序:使用C语言编写一个简单的程序,模拟不同的存储管理算法(如FIFO、LRU、LFU等)。
(2)运行实验程序:编译并运行实验程序,观察不同算法在页面分配、置换和回收过程中的表现。
五、实验结果与分析1. 页式存储管理实验实验结果表明,页式存储管理可以将大程序离散地存储在内存中,提高内存利用率。
但页式存储管理也存在页面碎片问题,导致内存碎片化。
2. 段式存储管理实验实验结果表明,段式存储管理可以将程序按照逻辑结构划分为多个段,提高了内存的利用率。
分页存储管理实验报告
一、实验目的1. 理解分页存储管理的基本原理和方法;2. 掌握分页存储管理中的页面置换算法;3. 熟悉分页存储管理的实现过程;4. 培养动手实践能力,提高对操作系统内存管理的认识。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019三、实验原理分页存储管理是一种将内存划分为固定大小的页面,并将进程的地址空间划分为同样大小的逻辑页的内存管理方式。
分页存储管理的主要优点是消除了外部碎片,提高了内存的利用率。
以下是分页存储管理的关键概念:1. 页面:内存划分为固定大小的块,称为页面。
页面大小通常为4KB或8KB。
2. 逻辑页:进程的地址空间划分为同样大小的块,称为逻辑页。
3. 页表:用于记录逻辑页与物理页的映射关系。
四、实验内容1. 初始化内存:创建一个模拟的内存空间,用数组表示。
初始化时,内存中的一部分页面被占用,其他页面为空闲状态。
2. 进程调度:模拟进程的调度过程,包括进程的创建、销毁和页面请求。
3. 页面置换算法:实现不同的页面置换算法,如先进先出(FIFO)、最近最少使用(LRU)等。
4. 页面映射:根据进程的页面请求,查找页表,将逻辑页映射到物理页。
5. 页面回收:当进程销毁或页面不再需要时,回收对应的物理页。
五、实验步骤1. 初始化内存:创建一个大小为1024的数组,模拟内存空间。
其中,前256个元素表示被占用的页面,其余元素表示空闲页面。
2. 创建进程:模拟进程的创建过程,包括进程的编号、所需页面数和页面请求序列。
3. 页面置换算法:实现FIFO和LRU两种页面置换算法。
FIFO算法按照进程创建的顺序进行页面置换;LRU算法根据页面在内存中驻留时间的长短进行页面置换。
4. 页面映射:根据进程的页面请求,查找页表,将逻辑页映射到物理页。
如果请求的页面已在内存中,则直接返回物理页号;如果请求的页面不在内存中,则根据页面置换算法替换一个页面,并将请求的页面加载到内存中。
分页存储管理实验报告
分页存储管理实验报告分页存储管理实验报告篇一:分页存储管理的模拟实验上机报告分页存储管理的模拟实验上机报告页面管理的基本原理及方法:各进程的虚拟空间被划分成若干个长度相等的页(page)。
页长的划分和内存外存之间的数据传输速度以及内存大小等有关。
页式管理还把内存空间也按也的大小划分为页面(page frame)。
然后把页式虚拟地址与内存页面物理地址建立一一对应页表,并用相应的硬件地址变换机构,来解决离散地址变换问题。
在作业或进程开始执行之前,把该作业或进程的程序段和数据全部装入内存的各个页面中,并通过页表(page mapping table)和硬件地址变换机构实现虚拟地址到内存物理地址的地址映射。
1. 内存页面分配静态页面管理的第一步是为要求内存的作业或进程分配足够的页面。
系统依靠存储页面表,请求表及页表来完成内存的分配工作。
a. 页表页表由页号与页面号组成。
如右图所示页表的大小由进程或作业的长度决定。
例如,对于一个每页长1k,大小为20k的进程来说,如果一个内存单元存放一个页表项,则只要分配给该页表20个存储单元即可。
页式管理是每个进程至少拥有一个页表。
实验中对页表的定义如下(采用数组形式,数组下标表示页号,数组单元存放与数组下标(页号)相应的页面号):int pagetable[100] b.请求表(作业申请表)请求表用来确定作业或进程的虚拟空间的各页在内存中的对应位置。
为了完成这个认为,系统必须知道每个作业或进程的页表起始地址(本实验中假定为0)和长度,以进行内存分配和地址变换。
另外请求表中还包括每个作业或进程所要求的页面数。
请求表整个系统一张,实验中对请求表的定义如下(采用结构体数组形式,并将页表也作为其中一个成员(即域)):#define u 5 struct application_table{char name[8];/*作业名*/int size;/*作业大小――即将上表中的请求页面数改用字节表示*/int paddress; /*页表起始地址*/ int length;/*页表长度――以页面数表示*/int state; /*内存的分配状态,以分配的用1表示,未分配的用0表示*/int pagetable[100];/*页表,放在这里是为了方便虚地址转换及作业撤销的操作*/ }application[u];c.存储页面表(本实验中采用位示图法)位示图也是整个系统一张,它指出内存各页面是否已被分配出去,以及未分配页面的总数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分页存储管理实验报告姓名:何绍金班级:自动化1202学号:201203870408指导教师:张健2014年12月30日一.实验题目编写程序模拟操作系统的基本分页存储管理方式,进一步理解这种内存分配方式的原理和特点,加深对理论知识的掌握。
二. 实验内容1.实验要求(1)编写模拟操作系统对内存分页存储管理方式的程序。
(2)程序能正确对主存空间进行“分配”和“回收”。
(3)能接受用户的输入,显示内存的分配情况,并有一定的容错能力。
2.实现功能:(1)内存初始化(2)程序应该能接受用户输入的进程信息,并为之分配内存,返回分配结果注意:此处考虑到不合法的输入并进行相应处理。
(3)程序能回收用户指定的进程所占用的内存空间程序需要为每个进程分配一个唯一的进程号并给出详细的提示信息。
(4)能直观合理地显示内存分配情况三.实验流程图四.程序运行结果运行程序得到如下结果:五.实验小结这次实验让我清楚地认识到分页存储管理的基本原理和实现流程,特别是对主存空间的分配与回收的深层次理解,在编制程序是只需使用顺序的地址而不必去考虑如何去分页,因为分页存储管理时作业的地址是连续的。
更让我体会了页氏存储管理方式的优点就是没有外部碎片,程序不必连续存放在内存空间,而缺点是程序要全部装入内存。
此外,还增强了动手编程和分析解决问题的能力。
附:程序源代码按流程图编制的源代码如下所示:#include <stdio.h>#include <windows.h>#define N 100 // 共有100个内存块int process[N][N+1]; // 存放每个进程的页表int block[N]; // 内存块状态标志数组,0:空闲,1:使用int blockCount; // 记录当前内存剩余空间int processCount; // 记录当前进程数bool flag = true;void init();void output();bool createProcess();bool endProcess();void init(){int i, j;// 初始化内存状态标志数组for (i=0; i<N; i++)block[i] = 0;for (i=0; i<20; i++)block[rand()%(N-1)] = 1;blockCount = 0;for (i=0; i<N; i++)if (block[i] == 0)blockCount++;// 初始化存放进程的数组for (i=0; i<N; i++){process[i][0] = 0;for (j=1; j<N; j++)process[i][j] = -1;}processCount = 0;printf("初始化结果如下:");output();flag = false;}void output(){printf("\n内存总量:%d 块, 已用空间:%d 块, 剩余空间:%d 块, 进程总数:%d 个\n", N, N-blockCount, blockCount, processCount);if (flag && blockCount < N){printf("已使用的内存块(%d):\n", N-blockCount);for (int k=0,count=0; k<N; k++){if (block[k] == 1)printf("%2d ", k, ++count);if (count == 15){putchar('\n');count = 0;}}putchar('\n');}// 输出各进程占用内存详细情况if (processCount > 0){printf("内存详细使用情况如下:\n");for (int i=0; i<N; i++){if (process[i][0] > 0){printf("进程号:%d \n占用内存块(%2d):", i, process[i][0]);for (int j=1,count=0; j<=process[i][0]; j++){printf("%2d ", process[i][j], count++);if (count == 15){putchar('\n');printf(" ");count = 0;}}putchar('\n');}}}elseprintf("当前内存无进程!\n");/*// 输出空闲内存块if (blockCount > 0){printf("空闲内存块(%d):\n", blockCount);for (int k=0,count=0; k<N; k++){if (block[k] == 0)printf("%2d ", k, ++count);if (count == 15){putchar('\n');count = 0;}}putchar('\n');}*/putchar('\n');}bool createProcess(){int pid, pages, k = 0;loop:printf("请输入进程号(小于%d)和所需页面数:", N);scanf("%d%d", &pid, &pages);if (pid > 99){printf("错误!进程号过大!\n");goto loop;}if (pages > blockCount)return false;blockCount -= pages;process[pid][0] = pages;for (int i=1; i<=pages; i++){while (block[k]==1 && k<100)k++;process[pid][i] = k;block[k] = 1;k++;}processCount++;return true;}bool endProcess(){int pid, pages;if (processCount < 1){printf("当前内存没有进程!\n\n");return false;}printf("当前内存中的进程有 %d 个,进程号为:", processCount);for (int i=0; i<N; i++)if (process[i][0] > 0)printf("%2d ", i);putchar('\n');printf("请输入您要结束的进程号(小于%d):", N);scanf("%d", &pid);pages = process[pid][0];if (pages == 0){printf("对不起!该进程不存在!\n");return false;}for (int j=1; j<pages; j++){block[process[pid][j]] = 0;process[pid][j] = -1;}process[pid][0] = 0;processCount--;blockCount += pages;return true;}void menu(){int choice;while (true){printf("操作菜单:\n");printf(" 1 --> 创建进程\n 2 --> 结束进程\n 3 --> 查看内存\n 0 --> 退出程序\n");printf("请输入您要进行的操作:");scanf("%d", &choice);switch (choice){case 1:if (createProcess())printf("创建新进程成功!\n\n");elseprintf("抱歉!内存空间不足,创建新进程失败!\n\n");break;case 2:if (endProcess())printf("进程已结束!\n\n");elseprintf("进程结束失败!\n\n");break;case 3:output();break;case 0:return ;default:printf("对不起!您的选择有误!请重新选择!\n\n");}}}void main(){init();menu();}。