#include"stdio.h" #include"stdlib.h" #include"time.h" 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}; int allocate(int wulisize,int i,int pagesize);//为进程分配内存空间 int reclaim(int wulisize,char pname);//释放进程占用的空间 void output(); int main() { int pagesize;//分页大小 int wulisize=80;//内存大小 char pname; int xuanze;//操作选择 int i; printf("输入页面大小: "); 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("选择操作 1.分配 2.回收 "); scanf("%d",&xuanze); if(xuanze==1) { for( i=0;i<10;i++) { if(page_table[i].pname=='0') { getchar(); printf("输入进程名称:"); scanf("%c",&page_table[i].pname); getchar(); printf("输入进程大小:"); scanf("%d",&page_table[i].psize); break; } } wulisize=allocate(wulisize,i,pagesize); }else { printf("输入进程名称:"); getchar(); scanf("%c",&pname); wulisize=reclaim(wulisize,pname); } output(); } return 0; } 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; } void output(){ int i; printf("————————内存分配情况—————————— "); printf("物理块号 进程名 "); for(i=0;i<20;i++) { printf("%d %c ",wuli_table[i].wuli_number , wuli_table[i].pname); } }