《linux内存管理实验报告》由会员分享,可在线阅读,更多相关《linux内存管理实验报告(13页珍藏版)》请在人人文库网上搜索。

1、操作系统实验报告院别:XXXXXX班级:XXXXXX学号:XXXXXX姓名:稻草人实验题目:内存管理实验一、 实验目的1、 通过本次试验体会操作系统中内存的分配模式;2、 掌握内存分配的方法(FF,BF,WF);3、 学会进程的建立,当一个进程被终止时内存是如何处理被释放块,并当内存不满足进程申请时是如何使用内存紧凑;4、 掌握内存回收过程及实现方法;5、 学会进行内存的申请释放和管理;二、 实验内容附源代码:/*宏定义*/#include#include#include#define PROCESS_NAME_LEN 32 /*进程名称的最大长度*/#define MIN_SLICE 10 。

2、/*最小碎片的大小*/#define DEFAULT_MEM_SIZE 1024 /*默认内存的大小*/#define DEFAULT_MEM_START 0 /*默认内存的起始位置*/* 内存分配算法 */#define MA_FF 1#define MA_BF 2#define MA_WF 3int mem_size=DEFAULT_MEM_SIZE; /*内存大小*/int ma_algorithm = MA_FF; /*当前分配算法*/int flag = 0; /*设置内存大小标志*/static int pid = 0; /*初始pid*/int algorithm;/*描述每一个。

3、空闲块的数据结构*/struct free_block_typeint size;int start_addr;struct free_block_type *next; /*指向内存中空闲块链表的首指针*/struct free_block_type *free_block;/*每个进程分配到的内存块的描述*/struct allocated_blockint pid;int size;int start_addr;char process_namePROCESS_NAME_LEN;struct allocated_block *next;/*进程分配内存块链表的首指针*/struct al。

4、located_block *allocated_block_head = NULL; struct allocated_block *find_process(int id)struct allocated_block *p;p=allocated_block_head;while(p!=NULL)if (p-pid=id)return p;return NULL;void swap(int *p,int *q)int temp;temp = *p;*p = *q;*q = temp;return;void do_exit()exit(0);/*初始化空闲块,默认为一块,可以指定大小及起始地。

5、址*/struct free_block_type* init_free_block(int mem_size)struct free_block_type *fb;fb=(struct free_block_type *)malloc(sizeof(struct free_block_type);if(fb=NULL)printf(No memn);return NULL;fb-size = mem_size;fb-start_addr = DEFAULT_MEM_START;fb-next = NULL;return fb;/*显示菜单*/display_menu()printf(n);p。

6、rintf(1 - Set memory size (default=%d)n, DEFAULT_MEM_SIZE);printf(2 - Select memory allocation algorithmn);printf(3 - New process n);printf(4 - Terminate a process n);printf(5 - Display memory usage n);printf(0 - Exitn);/*设置内存的大小*/set_mem_size()int size;if(flag!=0) /防止重复设置printf(Cannot set memory si。

7、ze againn);return 0;printf(Total memory size =);scanf(%d, &size);if(size0) mem_size = size;free_block-size = mem_size;flag=1; return 1;/*按FF算法重新整理内存空闲块链表*/rearrange_FF()struct free_block_type *tmp, *work;printf(Rearrange free blocks for FF n);tmp = free_block;while(tmp!=NULL) work = tmp-next;while(w。

8、ork!=NULL)if ( work-start_addr start_addr) /*地址递增*/swap(&work-start_addr, &tmp-start_addr);swap(&work-size, &tmp-size);work=work-next; tmp = tmp - next;/*按BF最佳适应算法重新整理内存空闲块链表*/rearrange_BF()struct free_block_type *tmp, *work;printf(Rearrange free blocks for BF n);tmp = free_block;while(tmp!=NULL) wo。

9、rk = tmp-next;while(work!=NULL)if ( work-size tmp-size) /*地址递增*/swap(&work-start_addr, &tmp-start_addr);swap(&work-size, &tmp-size);work=work-next; tmp = tmp - next;/*按WF算法重新整理内存空闲块链表*/rearrange_WF()struct free_block_type *tmp, *work;printf(Rearrange free blocks for WF n);tmp = free_block;while(tmp!。

10、=NULL) work = tmp-next;while(work!=NULL)if ( work-size size) /*地址递增*/swap(&work-start_addr, &tmp-start_addr);swap(&work-size, &tmp-size);else work=work-next; tmp = tmp - next;/*按指定的算法整理内存空闲块链表*/rearrange(int algorithm)switch(algorithm)case MA_FF: rearrange_FF(); break;case MA_BF: rearrange_BF(); bre。

11、ak;case MA_WF: rearrange_WF(); break;/* 设置当前的分配算法 */set_algorithm()printf(t1 - First Fitn);printf(t2 - Best Fit n);printf(t3 - Worst Fit n);scanf(%d, &algorithm);if(algorithm=1 & algorithm size;fbt = free_block;while(fbt!=NULL)if(fbt-size=request_size)if (fbt-size - request_size = MIN_SLICE) /*分配后空闲。

12、空间足够大,则分割*/mem_size -= request_size;fbt-size -= request_size; ab-start_addr= fbt-start_addr;fbt-start_addr += request_size; else if (fbt-size - request_size) size - request_size) 0)/*分割后空闲区成为小碎片,一起分配*/mem_size -= fbt-size;pre = fbt-next;ab-start_addr= fbt-start_addr;fbt-start_addr += fbt-size;free(f。

13、bt);else temp = free_block;while(temp!=NULL)work = temp-next;if(work!=NULL)/*如果当前空闲区与后面的空闲区相连,则合并*/ if (temp-start_addr+temp-size = work-start_addr) temp-size += work-size;temp-next = work-next;free(work);continue;temp = temp-next;fbt = free_block;break;rearrange(algorithm); /*重新按当前的算法排列空闲区*/ return。

14、 1;pre = fbt;fbt = fbt-next;return -1;/*创建新的进程,主要是获取内存的申请数量*/new_process()struct allocated_block *ab;int size;int ret;ab=(struct allocated_block *)malloc(sizeof(struct allocated_block);if(!ab) exit(-5);ab-next = NULL;pid+;sprintf(ab-process_name, PROCESS-%02d, pid);ab-pid = pid;printf(Memory for %s:。

15、, ab-process_name);scanf(%d, &size);if(size0) ab-size=size;ret = allocate_mem(ab); /* 从空闲区分配内存,ret=1表示分配ok*/*如果此时allocated_block_head尚未赋值,则赋值*/if(ret=1) &(allocated_block_head = NULL) allocated_block_head=ab;return 1;/*分配成功,将该已分配块的描述插入已分配链表*/else if (ret=1) ab-next=allocated_block_head;allocated_blo。

16、ck_head=ab;return 2;else if(ret=-1) /*分配不成功*/printf(Allocation failn);free(ab);return -1;return 3;/*将ab所表示的已分配区归还,并进行可能的合并*/int free_mem(struct allocated_block *ab)int algorithm = ma_algorithm;struct free_block_type *fbt, *work;fbt=(struct free_block_type*) malloc(sizeof(struct free_block_type);if(!。

17、fbt) return -1;fbt-size = ab-size;fbt-start_addr = ab-start_addr;/*插入到空闲区链表的头部并将空闲区按地址递增的次序排列*/fbt-next = free_block;free_block=fbt;rearrange(MA_FF);fbt=free_block;while(fbt!=NULL)work = fbt-next;if(work!=NULL)/*如果当前空闲区与后面的空闲区相连,则合并*/if(fbt-start_addr+fbt-size = work-start_addr) fbt-size += work-siz。

18、e;fbt-next = work-next;free(work);continue;fbt = fbt-next;rearrange(algorithm); /*重新按当前的算法排列空闲区*/return 1;/*释放ab数据结构节点*/int dispose(struct allocated_block *free_ab)struct allocated_block *pre, *ab;if(free_ab = allocated_block_head) /*如果要释放第一个节点*/allocated_block_head = allocated_block_head-next;free(。

19、free_ab);return 1;pre = allocated_block_head; ab = allocated_block_head-next;while(ab!=free_ab) pre = ab; ab = ab-next; pre-next = ab-next;free(ab);return 2;/* 显示当前内存的使用情况,包括空闲区的情况和已经分配的情况 */display_mem_usage()struct free_block_type *fbt=free_block;struct allocated_block *ab=allocated_block_head;if(。

20、fbt=NULL) return(-1);printf(-n);/* 显示空闲区 */printf(Free Memory:n);printf(%20s %20sn, start_addr, size);while(fbt!=NULL)printf(%20d %20dn, fbt-start_addr, fbt-size);fbt=fbt-next; /* 显示已分配区 */printf(nUsed Memory:n);printf(%10s %20s %10s %10sn, PID, ProcessName, start_addr, size);while(ab!=NULL)printf(%。

21、10d %20s %10d %10dn, ab-pid, ab-process_name, ab-start_addr, ab-size);ab=ab-next;printf(-n);return 0;/*删除进程,归还分配的存储空间,并删除描述该进程内存分配的节点*/kill_process()struct allocated_block *ab;int pid;printf(Kill Process, pid=);scanf(%d, &pid);ab=find_process(pid);if(ab!=NULL)free_mem(ab); /*释放ab所表示的分配区*/dispose(ab)。

22、; /*释放ab数据结构节点*/main()char choice;pid=0;free_block = init_free_block(mem_size); /初始化空闲区for(;)display_menu();/显示菜单fflush(stdin);choice=getchar();/获取用户输入switch(choice)case 1: set_mem_size(); break; /设置内存大小case 2: set_algorithm(); flag=1; break; /设置分配算法case 3: new_process(); flag=1; break; /创建新进程case 4。

23、: kill_process(); flag=1; break; /删除进程case 5: display_mem_usage(); flag=1; break /显示内存使用case 0: do_exit(); exit(0); break; /释放链表并退出default: break; 三、 实验结果实验界面:提示输入以后,输入 1,显示如下:紧接着输入: 3,设置内存空间为 256,显示如下:重复一次上一操作。再输入 : 5,显示如下:再输入 : 4后,杀死2号进程,显示如下:四、 实验心得体会通过本次上机实验让我进一步理解了操作系统对内存分配的相关知识,也使我意识到C语言的重要性,对于内存的分配方法以及思想都能理解,但是在具体实现时就受到了感觉有点困难,通过与同学的交流和查阅相关资料才找到了问题所在,这些都是C语言基础不扎实以及长时间不练习造成的,以后得加大编程方面的练习了。。

Linux系统内存管理实验报告,linux内存管理实验报告相关推荐

  1. Linux系统中消息队列,共享内存、信号和线程的基本操作使用方法

    Linux系统中消息队列,共享内存.信号和线程高级操作 第十一章 消息队列 10.1消息队列定义 10.2 消息队列特点 10.3 key值 10.4 创建消息队列 10.4.1 发送消息 10.4. ...

  2. python 监控linux硬盘,Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例...

    由于项目的需要,需要做一个简单监控服务器的CPU利用率.CPU负载.硬盘使用率.内存利用率和服务器的各个端口的开启情况的程序,并把结果通知到监控平台,如果出现异常,监控平台打电话或者发短信通知给具体的 ...

  3. Linux系统查看当前主机CPU、内存、机器型号及主板信息

    Linux系统查看当前主机CPU.内存.机器型号及主板信息: 查看CPU信息(型号) # cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 查 ...

  4. Linux命令:dpkg【dpkg命令的英文全称是“Debian package”,故名意思是Debian Linux系统用来安装、创建和管理软件包的实用工具】

    dpkg命令的英文全称是"Debian package",故名意思是Debian Linux系统用来安装.创建和管理软件包的实用工具. 语法格式 dpkg [参数] 常用参数: - ...

  5. 【 linux系统入门管理篇-第三章权限管理】

    [ linux系统入门管理篇-第三章权限管理] 本章介绍 一.基本权限UGO 二.基本权限 ACL 三.特殊权限 本章介绍 本章讲述了,Linux系统CentOS7中关于权限的相关概念.以及用户和组的 ...

  6. 一文带你学会linux系统 史上最全linux命令大全

    一文带你学会linux系统 史上最全linux命令大全 文章目录 linux系统简介 linux命令 1.启动网络命令 2.pwd命令 2.ls命令 3.cd命令 4.mkdir命令 5.rmdir命 ...

  7. Linux系统入门之如何安装Linux系统

    题目:Linux系统入门之如何安装Linux系统 一.准备工具: 1.Linux 镜像文件(Linux iso文件),直接的在 百度里面输入下载Linux系统版本即可 例如: 2.虚拟机模拟工具,例如 ...

  8. 一站式:虚拟机安装Linux系统(CentOS_7),多节点Linux环境打造,XShell的使用

    目录 01.Linux环境装在哪 02.虚拟机的下载与安装:Vmware 2.1.Vmware下载 2.2.Vmware安装 03.CentOS镜像下载 3.1.CentOS介绍(了解) 3.2.Ce ...

  9. 大连东软信息学院linux系统编程,大连东软信息学院Linux系统编程考试资料

    大连东软信息学院Linux系统编程考试资料 Linux系统程序设计 第1章 Linux操作系统基础 1.1 Unix/Linux操作系统简介 1.2 相关术语 1.3 库函数与系统调用 1.4 项目构 ...

  10. linux系统怎么重启网卡?linux重启网卡的三种教程

    在实际工作中,经常会遇到Linux系统进行重启网卡的操作.在这里整理一下,进行多种方法的网卡重启. 一.service network restart 1.首先用CRT工具连接到Linux命令行界面. ...

最新文章

  1. 1291 火车线路(区间修改,区间最值)
  2. 解决cmd命令查看python版本“python不是内部命令或外部命令,也不是可执行程序解决方案”的问题
  3. python学习笔记 day25 封装
  4. 解读Cardinality Estimation算法(第四部分:HyperLogLog Counting)
  5. 【转】5亿个数找中位数
  6. tomcat用户配置
  7. uC/OS-II OS_TASK.C中有关任务管理的函数
  8. rj45管脚定义_rj45接口定义,rj45插座引脚定义
  9. Redis 的 string
  10. 数据分析必备的统计学(二):假设检验
  11. 如何从SQL Server查找指定的临时表
  12. ubuntu忘记密码,忘记root密码的解决方法!【转载】
  13. 【SimpleITK】坐标次序问题
  14. 如何搞定纸上代码环节?
  15. 获取listview当前滚动的高度
  16. 求链表是否有环,及环入口,环长度
  17. 学计算机推荐电脑,计算机专业笔记本电脑推荐
  18. SQL注入入侵动网站(MSSQL)
  19. 信息学奥赛一本通 1296:开餐馆 | OpenJudge NOI 2.6 6045:开餐馆
  20. 第二集 第一魂环 第十三章

热门文章

  1. rabbitmq php类库,RabbitMQ客户端的PHP库
  2. Mac Os 安装github上的开源软件
  3. 大学计算机基础模拟,模拟练习系统
  4. 软件测试 黑盒白盒测试方法总结
  5. 计蒜客2019蓝桥杯省赛 B 组模拟赛(一)轻重搭配|
  6. 跑步(【CCF】NOI Online能力测试 入门组第二题)
  7. sqli-labs在线网站
  8. Default process group has not been initialized, please make sure to call init_process_group
  9. [排版题] 例4.1 输出梯形
  10. 模版 ----- 一维指数型枚举 排列型枚举 组合型枚举