资源预览内容
第1页 / 共15页
第2页 / 共15页
第3页 / 共15页
第4页 / 共15页
第5页 / 共15页
第6页 / 共15页
第7页 / 共15页
第8页 / 共15页
第9页 / 共15页
第10页 / 共15页
亲,该文档总共15页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
深 圳 大 学 实 验 报 告 课程名称: 操作系统 实验项目名称: 内存管理实验 学院: 计算机与软件学院 专业: 计算机科学与技术 指导教师: 罗秋明 报告人: 学号: 班级: 实验时间: 2014-11-21 实验报告提交时间: 2014-11-30 教务部制实验目的与要求:加深对内存分配与使用操作的直观认识;掌握Linux操作系统的内存分配与使用的编程接口;了解Linux操作系统中进程的逻辑编程地址和物理地址间的映射;实验内容:可以使用Linux或其它Unix类操作系统;学习该操作系统提供的分配、释放的函数使用方法;学习该操作系统提供的进程地址映射情况的工具;实验过程、方法、步骤:操作部分:1) 借助google工具查找资料,学习使用Linux进程的内存分配、释放函数;2) 借助google工具查找资料,学习Linux proc文件系统中关于内存影射的部分内容(了解/proc/pid/目录下的maps、status、smap等几个文件内部信息的解读);3) 编写程序,连续申请分配三个512MB空间,然后释放第二个512MB空间。然后再分配1024MB,记录该进程的虚存空间变化(/proc/pid/maps),每次操作前后检查/proc/pid/status文件中关于内存的情况,简要说明虚拟内存变化情况。4) 设计一个程序测试出你的系统单个进程所能分配到的最大虚拟内存空间为多大。5) 编写一个程序,分配256M内存空间(或其他足够大的空间),检查分配前后/proc/pid/status文件中关于虚拟内存和物理内存的使用情况,然后每隔4KB间隔将相应地址的字节数值增1,再次检查/proc/pid/status文件中关于内存的情况,对比前后两次内存情况,说明所分配物理内存(物理内存块)的变化。(3) 在mem3.c中编写相关程序,对指针a,b,c分别分配512M内存,然后释放b的512MB空间。然后再分配1024MB。代码如下:#include#include#include#includeint main() printf(PID=%dn,getpid(); int *d,*a,*b,*c;printf(Program begins.n);getchar(); a=(int*)malloc(pow(2,27)*sizeof(int); b=(int*)malloc(pow(2,27)*sizeof(int); c=(int*)malloc(pow(2,27)*sizeof(int); printf(3 new space has already created.Type to free space b.n); getchar(); free(b); printf(Space b is free.Type to create new space d.n); getchar(); d=(int*)malloc(pow(2,28)*sizeof(int); printf(Space d has been created.n); getchar(); return 0;运行代码,查看虚存空间。在释放空间b前,存储空间如下:用maps查看:用status查看:释放b空间后:Maps:Status:建立新空间d后:Maps:Status:由以上结果可以看到,在分配内存空间前,程序的虚拟内存大小为3836kB,即3M,分配连续三个512M 的空间后,虚拟内存变成1576712kB=1539M=512M*3+3M,等于理论值。释放空间b后,内存空间大小变成1052420kB=1027M=512M*2+3M,等于理论值。再建立一个1024M的空间后,虚存为2101000kB=2051M=1027M+1024M,等于理论值。而物理内存大小基本不变。Maps查看:分配内存前:34f457a000-34f457f000 rw-p 00000000 00:00 07f9df8004000-7f9df8007000 rw-p 00000000 00:00 7f9df801a000-7f9df801d000 rw-p 00000000 00:00 0分配3个512M内存后:34f457a000-34f457f000 rw-p 00000000 00:00 07f9d98001000-7f9df8007000 rw-p 00000000 00:00 07f9df801a000-7f9df801d000 rw-p 00000000 00:00 0释放中间内存后:34f457a000-34f457f000 rw-p 00000000 00:00 07f9d98001000-7f9db8002000 rw-p 00000000 00:00 07f9dd8003000-7f9df8007000 rw-p 00000000 00:00 07f9df801a000-7f9df801d000 rw-p 00000000 00:00 0创建1024M内存后:34f457a000-34f457f000 rw-p 00000000 00:00 07f9d58000000-7f9db8002000 rw-p 00000000 00:00 07f9dd8003000-7f9df8007000 rw-p 00000000 00:00 07f9df801a000-7f9df801d000 rw-p 00000000 00:00 0再由maps内存分配的情况看,在分配内存前,虚存地址为7f9df8004000-7f9df8007000连续分配3个512M空间后,虚存地址变成了7f9d98001000-7f9df8007000,显然首地址增加了。释放中间的512M空间后,虚存地分成了址7f9d98001000-7f9db8002000和7f9dd8003000-7f9df8007000两个地址,虚存空间从中间截断,一分为二。此时再创建1024M空间后,虚存空间变成7f9d58000000-7f9db8002000和7f9dd8003000-7f9df8007000,结果正确。 (4)建立文件mem4.c,代码实现如下:#include#include#include#includeint main() int i; char *a100000; printf(The pid is:%dn,getpid(); ai=(char*)malloc(pow(2,30)*sizeof(char);/每次分配1G内存 if(ai=NULL) printf(The max virtual memory is %d Gn,i);/输出内存 getchar(); break; return 0;输出结果:用status查看更详细的内存使用情况:(5)代码如下:#include#include#include#includeint main() printf(The id is %d .n,getpid(); int *a; int i,n,k; n=(int)pow(2,30); k=(int)pow(2,12); a=(int*)malloc(n*sizeof(int);/分配4G空间 /for(i=0;in;i+) / ai=0; / getchar(); printf(Type to value.n); getchar(); for(i=0;in;i+=k) ai+; printf(Type to end the program.n); getchar();return 0;运行:分配空间前分配空间后数值加1后:由第五题截图可以知道,在对数值进行增一操作前,程序的物理内存基本没有变化,在444kB左右。隔一定的距离给数值进行增一操作后,物理内存迅速增大到2045244kB。分配空间后,在增一操作前后虚拟内存基本没有变化,都是4198144kB。附:在maps文件中,一共有6列数据,其中:第一列代表内存段的虚拟地址第二列代表执行权限,r=可读,w=可写,x=可执行,p=私有 s=共享第三列代表在进程地址里的偏移量第四列映射文件的主设备号和次设备号第五列映像文件的节点号,即inode第六列是映像文件的路径实验结论:通过这次实验,我了解了用maps, status, smap查看相关的文件信息以及能比较熟练地对文件内容进行解读。对数组中的数据进行运算时,程序的物理内存有相应的增加。用malloc对指针进行内存分配时,物理内存增加,虚存地址会相应地增加。随着空间的释放和新的分配,虚存地址出现相应的增减情况。95完成了本实验的全部内容,截图丰富,分析详细准确。 指导教师签字: 年 月 日备注:注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。 2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号