一,实验目的
1.连续内存分配方式会形成许多“碎片”,虽然可以通过“紧凑”方法将许多碎片拼接成可用的大块空间,但须为之付出很大开销。如果允许将一个进程直接分散地装入到许多不相邻接的分区中,则无需再进行“紧凑”。基于这一思想而产生了离散分配方式。
2.如果离散分配的基本单位是页,则称为分页存储管理方式;如果离散分配的基本单位是段,则称为分段存储管理方式。
3.在分页存储管理方式中,如果不具备页面兑换功能,则称为基本的分页存储管理方式,或称为纯分页存储管理方式,它不具备支持虚拟存储器的功能,它要求把每个作业全部装入内存后方能运行。
4.本实验通过程序模拟操作系统的基本分页存储管理方式,进一步理解这一内存分配方式的原理和特点,加深对理论知识的掌握。
二,实验内容和要求
实验内容:本实验假定内存空间已经按块划分,目标程序无需关心内存块大小等底层细节,只需按算法对内存块进行分配即可。程序应该实现以下功能:
1、内存初始化。假定内存块共有N个,初始化后的内存空间应该有一部分已经被使用,这可以用随机数或程序内部的其他算法完成。
2、程序应该能接受用户输入的进程信息,并为之分配内存,返回分配结果(成功或失败),注意,此处应该考虑到不合法的输入并进行相应处理。
3、程序能回收用户指定的进程所占用的内存空间,因此,程序可能需要为每个进程分配一个唯一的进程号并给出详细的提示信息。
4、能直观合理地显示内存分配情况。
5、程序界面友好,便于操作和查看运行结果。
实验要求:
1、用C语言或Java语言编写程序模拟操作系统对内存的基本分页存储管理方式
2、程序要能正确对“内存”进行“分配”和“回收”,能接受用户的输入,显示内存的分配情况,并有一定的容错能力。
3、每个人独立按时完成实验内容。
三、主要程序及其解释
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 struct memory{ 5 int memory_number; 6 char proname; 7 }; 8 struct memory memory_table[20]={0}; 9 struct page{ 10 11 char proname;//进程名称 12 int prosize;//进程大小 13 int pagetable[10];//进程页表 14 };//页表 15 struct page page_table[10]={0}; 16 17 int allocate(int memorysize,int i,int pagesize);//为进程分配内存空间 18 int reclaim(int memorysize,char proname);//释放进程占用的空间 19 20 void output(); 21 int main() 22 { 23 int pagesize;//分页大小 24 int memorysize=80;//内存大小 25 char proname; 26 int choice;//操作选择 27 int i; 28 29 printf("Please enter the page size:"); 30 scanf("%d",&pagesize); 31 //初始化 32 for(i=0;i<20;i++) 33 { 34 memory_table[i].memory_number=i; 35 memory_table[i].proname='0'; 36 } 37 for(i=0;i<10;i++) 38 { 39 page_table[i].proname='0'; 40 41 } 42 srand((unsigned)time(NULL)); 43 for(i=0;i<7;i++) 44 { 45 46 int number=rand()%19+1; 47 memory_table[number].proname='a'; 48 memorysize--; 49 } 50 output(); 51 //进入存储分配 52 while(memorysize!=0) 53 { 54 printf("Selecting Operation 1.Allocate 2.Reclaim "); 55 scanf("%d",&choice); 56 if(choice==1) 57 { 58 for( i=0;i<10;i++) 59 { 60 if(page_table[i].proname=='0') 61 { 62 getchar(); 63 printf("Please enter process name:"); 64 scanf("%c",&page_table[i].proname); 65 getchar(); 66 printf("Please enter process size:"); 67 scanf("%d",&page_table[i].prosize); 68 break; 69 } 70 } 71 memorysize=allocate(memorysize,i,pagesize); 72 }else 73 { 74 printf("Please enter process name:"); 75 getchar(); 76 scanf("%c",&proname); 77 memorysize=reclaim(memorysize,proname); 78 } 79 80 output(); 81 } 82 83 84 return 0; 85 } 86 87 88 89 int allocate(int memorysize,int i,int pagesize) 90 { 91 int k; 92 int j; 93 for(k=0;k<(page_table[i].prosize/pagesize);k++) 94 { 95 for( j=0;j<20;j++) 96 { 97 if(memory_table[j].proname=='0') 98 { 99 memory_table[j].proname=page_table[i].proname; 100 page_table[i].pagetable[k]=j; 101 memorysize--; 102 break; 103 104 } 105 } 106 107 } 108 return memorysize; 109 } 110 111 int reclaim(int memorysize,char proname) 112 { 113 int j; 114 int k; 115 for( j=0;j<20;j++) 116 { 117 if(memory_table[j].proname==proname) 118 { 119 memory_table[j].proname='0'; 120 121 memorysize++; 122 123 124 } 125 } 126 for (j=0;j<10;j++) 127 { 128 if(page_table[j].proname==proname) 129 { 130 page_table[j].proname='0'; 131 page_table[j].prosize=0; 132 for(k=0;k<10;k++) 133 { 134 page_table[j].pagetable[k]=0; 135 } 136 137 break; 138 139 } 140 } 141 return memorysize; 142 } 143 144 145 146 void output(){ 147 int i; 148 printf("————————memory allocation—————————— "); 149 printf(" Physical Block No. Process Name "); 150 for(i=0;i<20;i++) 151 { 152 153 printf(" %d %c ",memory_table[i].memory_number , memory_table[i].proname); 154 } 155 }
运行结果如下:
四,实验总结
这个实验是这学期最后一个实验了,发现有些松懈,没有太用心去写思考,直接参考其他人的代码,这是很不好的习惯。不过有去看代码理解代码。而这个实验是存储管理的,理解代码后也加深了课本知识的理解。