您的当前位置:首页厦门理工学院操作系统实验7

厦门理工学院操作系统实验7

2020-02-02 来源:小侦探旅游网


《操作系统》实验报告

实验序号:7 实验项目名称:内存分配与空间分布 学 号 实验地点 姓 名 指导教师 ZRZ 李远敏 专业、班 实验时间 18计卓1班 2020.6.5 一、实验目的及要求 1.加深对进程同步与通信概念的理解。 2.学习并掌握利用信号量进行相关编程,熟悉函数semget()、semopt()和semctl()的使用。 3.学习并掌握利用消息队列进行通信操作,熟悉函数msgget()、msgsnd()、msgrcv()、msggctl()等与消息有关的操作调用 4.学习并掌握利用共享内存进行相关应用,熟悉函数shmget()、shmat()、shmdt()和shmctl()的使用 二、实验设备(环境)及要求 1.Ubuntu操作系统环境 2.搭建Ubuntu操作系统下的C语言编程环境。 三、实验内容与步骤 1. 使用malloc() free() 动态分配与回收内存,并查看堆区(heap)大小变化: (1)使用vi将程序清单程序输入 (2)利用gcc编译这个程序,写出编译命令和执行结果;如果不成功,尝试利用gdb调试。运行编译后的目标程序。 (3)仔细阅读程序,并画出程序流程图。 (4)分析程序:在该程序中查看动态内存(堆)大小变化有两种方式:一是通过编写程序计数;一个是通过调用系统函数来显示,根据程序结果说明两种方式得到动态内存的大小是否一致。 2. 程序中代码、各种变量、常量在内存空间中分布 (1)使用vi将以下程序输入。 (2)利用gcc编译这个程序,写出编译命令和执行结果;如果不成功,尝试利用gdb调试。 (3)运行两次编译后的目标程序。 (4)仔细阅读程序,并画出程序流程图。 (5)根据程序两次运行结果进行分析: a. 两个初始化的全局变量和一个初始化的静态局部变量在什么段进行分配,该段处于位置? b. 两个未初始化的全局变量和一个未初始化的静态局部变量在什么段进行分配,该段处于位置?

c. 三个局部变量在什么段进行分配,该段起始地址,分配是从高地址向低地址增长还是低地址向高地址增长? d. 使用malloc分配的三个小于128K大小的内存区域,在什么段进行分配,该段处于位置?分配是从高地址向低地址增长还是低地址向高地址增长? e. 使用malloc分配的三个大于128K大小的内存区域,在那两个段之间进行空间分配 f. 在两次运行结果中,哪些段中变量的地址是不变,而哪些段中变量的地址是变化的 (6)本程序的打印每段的顺序是有编程来确定,但假如编程者不知道每段在内存的分布情况,需在编程时根据在该段的成员所在地址高低来确定打印顺序,即低地址成员及对应地址先打印,且打印同一段的第一成员时,要同时要打印对应段的名称相关信息。为适应这一需求,应如何修改程序。 四、实验结果与数据处理 1.使用malloc() free() 动态分配与回收内存,并查看堆区(heap)大小变化: (1)实验结果:

图1:代码

图2:程序运行结果 (2)结果分析: 运行结果:通过程序计数的方法得到的动态内存大小和通过调用系统函数获得的动态内存大小不一致,计数的大小会小于系统所给出的大小。 原因:在这个实验中,由于在系统的运行中由于某些变量的大小是会发生变化的,系统在运行程序时通常会产生一些内零头,也就是一些变量直接的未定义区域,而不是简单地各变量大小相加,所以就可以看到存在计数小于系统给出数据大小的情况;同时另外系统分配内存算法也会影响占用内存的大小。 (3)流程图: 图3:流程图

2.程序中代码、各种变量、常量在内存空间中分布 (1)实验结果: 图4:代码

图5:程序运行结果 (2)结果分析: 1) 两个初始化的全局变量和一个初始化的静态局部变量在data段进行分配,该段处于可执行文件中。 2) 两个未初始化的全局变量和一个未初始化的静态局部变量在bss段进行分配,该段处于可执行文件外的内存中。 3) 三个局部变量在stack段进行分配,该段起始地址,分配是从高地址向低地址增长。 4) 使用malloc分配的三个小于128K大小的内存区域,在heap段进行分配,该段处于可执行文件外的内存中,分配是从低地址向高地址增长。 5) 使用malloc分配的三个大于128K大小的内存区域,在mmap段和bss段之间进行空间分配 6) 在两次运行结果中,text段、data段和bss段中变量的地址是不变,而stack段、heap段和mmap段中变量的地址是变化的。

(3)程序修改:

图6:修改后代码 图7:修改后运行结果

(4)流程图: 图8:流程图 五、分析与讨论 通过这一次的实验,我对进程的中各种变量在内存的区域有了更多的了解,也学会了了解了data段、bss段、text段、heap段、stack段和mmap段的所处位置、分配对象和分配方式,也懂得使用malloc ()和free()进行内存动态分配的原理和使用方法,同时也掌握了堆内内存和mmap的使用情况查看。 总而言之,通过这次实验,我对于进程的整个运行过程和运行方式有了更加深入地体会,让我对linux系统的内存分配和回收有了更深的理解。 六、教师评语 签名: 日期: 成绩

因篇幅问题不能全部显示,请点此查看更多更全内容