加深对内存分配与使用操作的直观认识; 掌握Linux操作系统的内存分配与使用的编程接口; 了解Linux操作系统中进程的逻辑编程地址和物理地址间的映射; 可以使用Linux或其它Unix类操作系统; 学习该操作系统提供的分配、释放的函数使用方法; 学习该操作系统提供的进程地址映射情况的工具。 硬件:桌面PC 软件:Linux 或其他操作系统 借助google工具查找资料,学习使用Linux进程的内存分配、释放函数,完成以下实验操作 操作部分:
要求:借助Linux上的crash工具完成展示。记录该进程的页表起始地址;然后将打印出的全局变量地址,用rd、rd -p、pte命令获得的信息手工完成地址的逐级转换形成物理地址。重复上述过程,对函数地址进行变换,对比两者pte的不同。
要求:记录该进程的虚存空间变化(/proc/pid/maps),每次操作前后检查/proc/pid/status文件中关于内存的情况,简要说明虚拟内存变化情况。推测此时再分配64M内存将出现在什么位置,实测后是否和你的预测一致?解释说明用户进程空间分配属于课本中的离散还是连续分配算法?首次适应还是最佳适应算法?用户空间存在碎片问题吗?
要求:用/proc/PID/maps展示此时进程空间使用情况,指出所分配空间在什么区域,检查进程剩余可用空间有多少。
要求:展示两个进程的物理页帧竞争的动态变化过程,即第二个进程抢占第一个进程原来所分配的物理页帧。使用/proc/PID/smap展示第一个进程分配和使用物理页帧前后的变化。使用/proc/PID/status记录两个进程的物理内存总量的变化。用/proc/meminfo记录系统整体使用情况的变化。 实验报告要求:
选作部分:
实验结果
要求:借助Linux上的crash工具完成展示。记录该进程的页表起始地址;然后将打印出的全局变量地址,用rd、rd -p、pte命令获得的信息手工完成地址的逐级转换形成物理地址。重复上述过程,对函数地址进行变换,对比两者pte的不同。
![]() 图 1‑1 安装crash ![]() 图 1‑2 查看当前版本号
![]() 图 1‑3 下载内核rpm包 ![]() 图 1‑4 下载rpm包
![]() 图 1‑5 安装rpm包
![]() 图1 程序思路 ![]() 图 1‑6 crashdemo.c代码
![]() 图 1‑7 运行crashdemo ![]() 图 1‑8 crash切换到目的进程
![]() 图 1‑9 px指令 ![]() 图 1‑10 求物理地址
![]() 图 1‑11 rd查看pgd页表首地址
![]() 图 1‑12 pte求pgd物理地址
![]() 图 1‑13 rd -p查看pud页表首地址
![]() 图 1‑14 查看pud物理地址
![]() 图 1‑15 rd-p查看pmd页表首地址 ![]() 图 1‑16 pte查看pmd物理地址
![]() 图 1‑17 得到pte物理地址
![]() 图 1‑18 pte计算page页表首地址
![]() 图 1‑19 rd-p读取int值
![]() 图 1‑20 999999全局变量 ![]() 图 1‑21 vtop检查
![]() 图 1‑22 rd-p查看pmd物理地址 ![]() 图 1‑23 pte查看pte首页地址
![]() 图 1‑24 rd-p查看page页表首地址
![]() 图 1‑25 pte查看page物理地址 ![]() 图 1‑26 vtop查看结果
要求:记录该进程的虚存空间变化(/proc/pid/maps),每次操作前后检查/proc/pid/status文件中关于内存的情况,简要说明虚拟内存变化情况。推测此时再分配64M内存将出现在什么位置,实测后是否和你的预测一致?解释说明用户进程空间分配属于课本中的离散还是连续分配算法?首次适应还是最佳适应算法?用户空间存在碎片问题吗?
![]() 图2程序思路 ![]() 图 2‑1 allocation.c代码 |
![]() 图 2‑2 执行allocation
![]() 图 2‑3 maps查看heap区 ![]() 图 2‑4 status查看虚拟内存
![]() 图 2‑5 打印地址与计算
![]() 图 2‑6 观察maps打印信息 ![]() 图 2‑7 换算得到内存大小
![]() 图 2‑8 status查看内存变化
![]() 图 2‑9 释放缓冲区 ![]() 图 2‑10 status显示虚存变化
![]() 图 2‑11 maps显示heap区变化
![]() 图 2‑12 maps排布规律
![]() 图 2‑13 分配1024mb空间 ![]() 图 2‑14 对比maps发现拓展情况
![]() 图 2‑15 分配64MB内存 ![]() 图 2‑16 第二块缓冲区内存被重新占用
![]() 图3 程序思路 ![]() 图 2‑17 修改后代码
![]() 图 2‑18 内存信息对应 ![]() 图 2‑19 140MB映射到了缓冲区2
要求:用/proc/PID/maps展示此时进程空间使用情况,指出所分配空间在什么区域,检查进程剩余可用空间有多少。
![]() 图4 程序思路 ![]() 图 3‑1 maxmemory代码 ![]() 图 3‑2 分配打印情况 ![]() 图 3‑3 虚拟机内存
![]() 图5 程序思路 ![]() 图 3‑4 循环23次分配内存
![]() 图 3‑5 free查看剩余可用内存 ![]() 图 3‑6 maps查看heap区
![]() 图6 程序思路 ![]() 图 3‑7 maxmalloc代码 ![]() 图 3‑8 maxmalloc输出结果分析
![]() 图7 程序思路 ![]() 图 4‑1 firstrthenw.c代码 ![]() 图 4‑2 status查看
![]() 图 4‑3 分配内存 ![]() 图 4‑4 status观察变化
![]() 图 4‑5 读数据 ![]() 图 4‑6 status观察变化
![]() 图 4‑7 写数据操作 ![]() 图 4‑8 status显著变化
要求:展示两个进程的物理页帧竞争的动态变化过程,即第二个进程抢占第一个进程原来所分配的物理页帧。使用/proc/PID/smap展示第一个进程分配和使用物理页帧前后的变化。使用/proc/PID/status记录两个进程的物理内存总量的变化。用/proc/meminfo记录系统整体使用情况的变化。
![]() 图 5‑1 free查看交换区与内存情况
![]() 图8 程序思路 ![]() 图 5‑2 exchangememory.c代码
![]() 图 5‑3 2进程ps查看 ![]() 图 5‑4 meminfo查看可用内存
![]() 图 5‑5 meminfo查看可用内存 ![]() 图 5‑6 2487进程所占内存 ![]() 图 5‑7 status查看2487进程
![]() 图 5‑8 free-m查看内存 ![]() 图 5‑9 status查看2487进程 ![]() 图 5‑10 status查号进程
1)按4KB的间隔逐个单元进行写操作,重复访问数遍(使得程序运行时间可测量);2)与前面访问总量和次数不便,但是将访问分成16个连续页为一组,逐组完成访问,记录运行时间。观察系统的状态,比较两者运行时间,给出判断和解释。
![]() 图9 程序思路 ![]() 图 6‑1 free查看空闲页 ![]() 图 6‑2 TLBtest.c代码
![]() 图 6‑3 运行TLBtest |
四、实验体会:(根据自己情况填写) 通过本次实验,我受益匪浅:
|
深圳大学操作系统实验三内存分配与回收
于 2023-11-29 04:08:10 首次发布