操作系统实验内存分配(链表实现)
更新时间:2024-04-26 05:31:01 阅读量: 综合文库 文档下载
- 操作系统有哪些推荐度:
- 相关推荐
#include
memory *base; //代表内存,一个头指针,内存总大小为256k void init(int manage) //内存的初始化 { memory *p,*q; if(base!=NULL) //这一块是释放链表 { p=base; while(p) { q=p->next; delete p; p=q; } } base=new memory; //操作系统,大小5k,起始地址是0k base->begin=0; base->pro='o'; base->size=5; if(manage==0) //静态内存,初始化7个内存块,第一个内存块是操作系统 { p=base; q=new memory; //空闲块1,大小20,起始地址5k q->begin=5; q->pro=0; q->size=20; p->next=q; p=q; q=new memory; //空闲块2,大小50,起始地址25k q->begin=25; q->pro=0;
q->size=50; p->next=q; p=q; q=new memory; //空闲块3,大小30,起始地址75k q->begin=75; q->pro=0; q->size=30; p->next=q; p=q; q=new memory; //空闲块4,大小45,起始地址105k q->begin=105; q->pro=0; q->size=45; p->next=q; p=q; q=new memory; //空闲块5,大小54,起始地址150k q->begin=150; q->pro=0; q->size=54; p->next=q; p=q; q=new memory; //空闲块6,大小52,起始地址204k q->begin=204; q->pro=0; q->size=52; p->next=q; q->next=NULL; } else //动态内存,只有一个大的内存块 { p=new memory; //空闲块251k,起始地址是5k p->begin=5; p->pro=0; p->size=251; p->next=NULL; base->next=p; } }
void assign(memory *q,char pro,int size) //动态,给进程pro在内存块q->next上分配size大小,q不为空且q->next不为空
{ //因为要进行插入操作,所以传的是要分配内存块的前指针 memory *p=q->next; memory *temp=new memory; temp=new memory; //代表进程pro的内存块 temp->begin=p->begin; temp->size=size; temp->pro=pro; q->next=temp; if(p->size!=size) //插入的内存块小于空闲区块 { p->size=p->size-size; p->begin=temp->begin+temp->size; temp->next=p; } else //插入的内存块等于空闲区块 { temp->next=p->next; delete p; } }
int ff(int manage,char pro,int size) //最先适应法 { memory *p=base; memory *q=p; while(p) //遍历内存找到第一个适合进程pro的内存块,保存它的前指针 { if(p->size
int bf(int manage,char pro,int size) //最佳适应法
{ memory *p=base,*temp=NULL,*q,*front; int min=256; while(p) //遍历内存找到最佳的内存块,保存它的前指针 { if(p->pro==0&&p->size>=size&&min>p->size) { min=p->size; front=q; temp=p; } q=p; p=p->next; } if(temp==NULL)return 0; //没找到,返回0 else { if(manage==0)temp->pro=pro; //静态,直接让进程进驻内存 else assign(front,pro,size); //动态,调用assign来给进程pro分配 } return 1; }
int wf(int manage,char pro,int size) //最坏适应法 { memory *p=base,*temp=NULL,*q,*front; int max=0; while(p) //遍历内存,找到最大的一块内存 { if(p->pro==0&&p->size>=size&&max
}
int delpro(int manage,char pro) //撤销进程,可能要进行内存块的合并 { memory *p=base,*q; while(p) //遍历内存,寻找进程pro { if(p->pro!=pro) { q=p; p=p->next; } else break; } if(p==NULL)return 0; //没找到,返回0 else //找到了,返回1 { if(manage==0)p->pro=0; //静态内存,直接撤销进程,不用内存块合并 else //动态内存,可能要进行内存合并,分4种情况 { if(q->pro!=0) { if(p->next==NULL||p->next->pro!=0) //前后内存块都不是空闲块 p->pro=0; else //前内存块不是空闲块,后内存块是空闲块 { q->next=p->next; p->next->begin=p->begin; p->next->size=p->size+p->next->size; delete p; } } else { if(p->next==NULL||p->next->pro!=0) //前内存块是空闲块,后内存块不是空闲块 { q->next=p->next; q->size=q->size+p->size; delete p; } else //前后内存块都是空闲块 { q->next=p->next->next;
q->size=q->size+p->size+p->next->size; delete p->next; delete p; } } } } return 1; }
void print(char ch,int begin,int size) //根据内存块内容,格式化输入一块内存块 { switch(ch) { case 'o':printf(\操作系统区\\t=k\\t=k~=k\\n\ case 0 :printf(\空闲区 \\t=k\\t=k~=k\\n\ default :printf(\进程%c \\t=k\\t=k~=k\\n\ } }
void show() //格式化显示内存的储存情况 { memory *p=base; int count=1; cout<<\内存现在的储存情况是:\ printf(\块号\\t 内容\\t\\t大小\\t起始-结束地址\\n\ while(p) { printf(\ \ print(p->pro,p->begin,p->size); p=p->next; } }
void del_pro(int manage) //撤销进程pro,调用delpro { memory *p=base; char pro,result; cout<<\请输入你要撤销的进程的名字:\ cin>>pro; if(pro=='o')cout<<\操作系统不可撤销\ else { result=delpro(manage,pro); if(result==0)cout<<\没有找到进程\撤销失败\ else cout<<\进程\撤销成功\ }
}
void assign_pro(int manage) //给进程pro根据选择情况分配内存 { int size,result=-1; char choose ,pro; cout<<\请输入进程的名字:\ cin>>pro; cout<<\请输入进程请求的内存大小:\ cin>>size; cout<<\请选择分配算法:1,最先适应法。2,最佳适应法。3,最坏适应法\ cin>>choose; switch(choose) { case '1': result=ff(manage,pro,size); break; case '2': result=bf(manage,pro,size); break; case '3': result=wf(manage,pro,size); break; } if(result==0)cout<<\进程\分配失败\ else if(result==1)cout<<\进程\分配成功\ else cout<<\输入错误\}
void childmenu(int manage) //子菜单 { char choice; init(manage); while(1) { system(\ if(manage==0)cout<<\静态分配\ else cout<<\动态分配\ show(); cout<<\请选择操作:\\n1、建立进程并分配\\n2、撤销进程\\n3、返回上一目录(内存将被初始化)\ cin>>choice; if(choice=='1') { assign_pro(manage);system(\ }
else if(choice=='2') { del_pro(manage);system(\ } else if(choice=='3')break; } }
void main() { char choice; int manage; while(1) //主菜单 { system(\ cout<<\内存分配算法演示\ cout<<\、静态分配\\n2、动态分配\\n3、退出程序\ cin>>choice; if(choice=='1')manage=0; else if(choice=='2')manage=1; else if(choice=='3')break; childmenu(manage); } }
正在阅读:
操作系统实验内存分配(链表实现)04-26
普通高中地质版通用技术教材分析12-06
百田石油 2018 中期报告05-28
运行命令大全12-22
世界无人机简介05-09
11.1营销管理人员实战讲义09-06
气力输灰培训03-06
企业内部控制具体规范 - 销售与收款10-27
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 分配
- 操作系统
- 内存
- 实验
- 实现
- 数据库应用学习指导讲义
- 新当选的妇代会主任表态发言
- A匝道支架预压指导书- 复制
- 企业文化知识题答案
- 高中物理纸带类问题经典例题
- 基于ARM处理器S3C2440的越界检测预警系统设计 - 图文
- 中国的宪政历史、现状及改革
- 计算机网络及Internet基础
- 用友U890-VPN接入解决方案(win2003VPN服务器架设步骤)
- 超星尔雅大学生安全教育7 期末考试
- 上海桃浦中学16届和谐校园材料
- 博科300光纤交换机的配置 - 图文
- 水中钙、镁含量的测定—配位滴定法
- CPA会计所得税习题及答案
- 指纹识别的历史与发展前景
- 计算机二级c语言历年常考知识点精粹
- 关于对拟被评为优秀乡村教师 - 图文
- 2016年高考数学(文)五年真题 考点分类汇编:考点44 直线与圆锥
- 公务员初任培训简报
- WCDMA开站手册 - 图文