1.连续内存分配方式会造成许多“碎片”,虽然能够经过“紧凑”方法将许多碎片拼接成可用的大块空间,但须为之付出很大开销。若是容许将一个进程直接分散地装入到许多不相邻接的分区中,则无需再进行“紧凑”。基于这一思想而产生了离散分配方式。算法
2.若是离散分配的基本单位是页,则称为分页存储管理方式;若是离散分配的基本单位是段,则称为分段存储管理方式。 oop
3.在分页存储管理方式中,若是不具有页面兑换功能,则称为基本的分页存储管理方式,或称为纯分页存储管理方式,它不具有支持虚拟存储器的功能,它要求把每一个做业所有装入内存后方能运行。this
4.本实验经过程序模拟操做系统的基本分页存储管理方式,进一步理解这一内存分配方式的原理和特色,加深对理论知识的掌握。spa
实验内容:本实验假定内存空间已经按块划分,目标程序无需关心内存块大小等底层细节,只需按算法对内存块进行分配便可。程序应该实现如下功能:操作系统
一、内存初始化。假定内存块共有N个,初始化后的内存空间应该有一部分已经被使用,这能够用随机数或程序内部的其余算法完成。3d
二、程序应该能接受用户输入的进程信息,并为之分配内存,返回分配结果(成功或失败),注意,此处应该考虑到不合法的输入并进行相应处理。code
三、程序能回收用户指定的进程所占用的内存空间,所以,程序可能须要为每一个进程分配一个惟一的进程号并给出详细的提示信息。blog
四、能直观合理地显示内存分配状况。进程
五、程序界面友好,便于操做和查看运行结果。内存
实验要求:
一、用C语言或Java语言编写程序模拟操做系统对内存的基本分页存储管理方式
二、程序要能正确对“内存”进行“分配”和“回收”,能接受用户的输入,显示内存的分配状况,并有必定的容错能力。
三、每一个人独立按时完成实验内容。
#include <stdio.h> #include <stdlib.h> #include <time.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ struct wuli{ int wuli_number; char pname; //已分配区表登记栏标志,用"0"表示空栏目 }; //内存表 struct wuli wuli_table[20]={0}; struct page{ char pname; //进程名称 int psize; //进程大小 int pagetable[10];//进程页表 };//页表 struct page page_table[10]={0}; void output(); int allocate(int wulisize,int i,int pagesize);//为进程分配内存空间 int reclaim(int wulisize,char pname);//释放进程占用的空间 void output(){ int i; printf("-------------------内存分配状况------------------------\n"); printf("\t物理块号(PBN)\t\t进程名(PN)\n"); for(i=0;i<20;i++){ printf("\t %d",wuli_table[i].wuli_number); printf("\t\t\t %c\n",wuli_table[i].pname); } } int allocate(int wulisize,int i,int pagesize) { int k; int j; for(k=0;k<(page_table[i].psize/pagesize);k++){ for( j=0;j<20;j++){ if(wuli_table[j].pname=='0'){ wuli_table[j].pname=page_table[i].pname; page_table[i].pagetable[k]=j; wulisize--; break; } } } return wulisize; } int reclaim(int wulisize,char pname) { int j; int k; for( j=0;j<20;j++){ if(wuli_table[j].pname==pname){ wuli_table[j].pname='0'; wulisize++; } } for (j=0;j<10;j++){ if(page_table[j].pname==pname){ page_table[j].pname='0'; page_table[j].psize=0; for(k=0;k<10;k++){ page_table[j].pagetable[k]=0; } break; } } return wulisize; } int main(int argc, char *argv[]) { int pagesize;//分页大小 int wulisize=80;//内存大小 char pname; int xuanze;//操做选择 int i; printf("Please input the process size:"); scanf("%d",&pagesize); //初始化 for(i=0;i<20;i++) { wuli_table[i].wuli_number=i; wuli_table[i].pname='0'; } for(i=0;i<10;i++) { page_table[i].pname='0'; } //初始化后的内存空间有一部分已经被使用 srand((unsigned)time(NULL)); for(i=0;i<7;i++) { int number=rand()%19+1; wuli_table[number].pname='a'; wulisize--; } output(); //进入存储分配 while(wulisize!=0){ printf("\n 1.分配 2.回收\n Please choose to operate:"); scanf("%d",&xuanze); if(xuanze==1){ for( i=0;i<10;i++){ if(page_table[i].pname=='0'){ getchar(); printf("Please input the process name:"); scanf("%c",&page_table[i].pname); getchar(); printf("Please input the process size:"); scanf("%d",&page_table[i].psize); break; } } wulisize=allocate(wulisize,i,pagesize); }else{ printf("Please input the process name:"); getchar(); scanf("%c",&pname); wulisize=reclaim(wulisize,pname); } output(); } return 0; }
此次实验参考了同窗的代码,本身对着代码一点一点理解,仍是能作出来的。