「 操作系统 」
来源:互联网 发布:手机淘宝上的免费开店 编辑:程序博客网 时间:2024/05/16 02:31
实现程序内存的动态分配
首次适应算法:
找到第一个满足程序的内存块,并将其分配给程序
最佳适应算法:
找到所有的满足程序的内存块,并将其中最小的内存块分配给程序
#include <iostream>#include <string.h>#include <stdio.h>using namespace std;struct node{ int st,size,num; bool work; node *next,*pre; node(){ work = false; st = 0; next = NULL; pre = NULL; }}*add,*mem;int work_num,oper,Size;void show(){ printf("------------------------------------------------------------------------\n\n"); printf("\t\t当前的内存分配情况如下:\n\n"); node *now = mem; printf("\t起始地址\t空间大小\t工作状态\t作业号\t\n\n"); while(true){ printf("\t%d\t\t%d kb\t\t%s\t\t",now->st,now->size,now->work?"Busy":"Free"); if(now->work) printf("%d\t",now->num); printf("\n\n"); if(now->next==NULL){ break; } now = now->next; } printf("------------------------------------------------------------------------\n\n"); }bool find1(){ //找最小的 node *now = mem; node *get = NULL; while(true){ if(!now->work){ if(now->size>=Size){ //找出所有的可放置内存块中内存最小的 if(get==NULL){ get = now; }else{ if(get->size > now->size){ get = now; } } } } if(now->next==NULL) break; now = now->next; } // 若找不到放置位置 返回不可放置 if(get==NULL) return false; // 更新内存情况 get->work = true; get->num = work_num; if(get->size>Size){ add = new node(); add->size = get->size - Size; get->size = Size; add->st = get->st + get->size; add->next = get->next; get->next = add; add->pre = get; } return true;}bool find2(){ //找最前面的 node *now = mem; while(true){ if(!now->work){ if(now->size>=Size){ //找到第一个可放置的内存空间 更新内存状况 返回分配结果 now->work = true; now->num = work_num; if(now->size>Size){ add = new node(); add->size = now->size - Size; now->size = Size; add->st = now->st + now->size; add->next = now->next; now->next = add; add->pre = now; } return true; } } if(now->next==NULL) break; now = now->next; } return false;}bool find(int ope){ // 分配内存操作 if(ope){ //最佳适应算法 return find1(); }else{ //首次适应算法 return find2(); }}bool reget(){ // 回收内存操作 node *now = mem; while(true){ if(now->num==work_num&&now->work){ //找到对应工作号且在工作的内存区 node *pre = now,*next = now->next; int pre_unused_memSize = 0,next_unused_memSize = 0; //将空闲的内存区合并 while(pre->pre!=NULL&&!pre->pre->work){ pre_unused_memSize += pre->size; pre = pre->pre; } while(next!=NULL&&!next->work){ next_unused_memSize += next->size; next = next->next; } now = pre; now->next = next; now->size += pre_unused_memSize + next_unused_memSize; now->work = false; if(next!=NULL) next->pre = now; return true; } if(now->next==NULL){ break; } now = now->next; } return false;}void work(int ope){ // 执行操作 while(true){ printf("\n\t1: 分配内存 2: 回收内存 0: 退出\n\n请输入操作:"); scanf("%d",&oper); printf("\n"); if(oper==1){ // 分配内存 printf("请输入作业号: "); scanf("%d",&work_num); printf("\n"); printf("请输入需要分配的内存大小(kb): "); scanf("%d",&Size); printf("\n"); if(find(ope)){ printf("内存分配成功!\n\n"); }else{ printf("内存分配失败!\n\n"); } show(); }else if(oper==2){ // 回收内存 printf("请输入作业号: "); scanf("%d",&work_num); printf("\n"); if(reget()){ printf("\t\t内存回收成功!\n\n"); }else{ printf("\t\t内存回收失败!\n\n"); } show(); }else{ // 操作结束 break; } }}void delete_mem(node *now){ // 清空内存 if(now->next!=NULL) delete_mem(now->next); delete now;}int main(){ int ope; while(true){ printf("\t\t请选择需要模拟的分配算法\n\n\t\t0\t首次适应算法\n\n\t\t1\t最佳适应算法\n\n"); printf("\t\t你的选择是 : "); scanf("%d",&ope); printf("\n"); mem = new node(); mem->size = 1000; if(ope){ //最佳适应算法 找到最小可存储空间 work(ope); printf("\t\t最佳适应算法模拟结束\n\n\n"); printf("-----------------------------------------------------------------------\n\n"); }else{ //首次适应算法 找到第一个可存储空间 work(ope); printf("\t\t首次适应算法模拟结束\n\n\n"); printf("-----------------------------------------------------------------------\n\n"); } delete_mem(mem); } return 0;}
阅读全文
0 0
- 「 操作系统 」
- 操作系统~
- 操作系统
- 操作系统
- 操作系统
- 操作系统
- 操作系统
- 操作系统
- 操作系统
- 操作系统
- 操作系统
- 操作系统
- 操作系统
- 操作系统
- 操作系统
- 操作系统
- 操作系统
- 操作系统
- 小菜鸟的第一个爬虫:豆瓣爬取电影信息
- SpringMVC之拦截器
- uva 1225
- mysql进阶
- 16D
- 「 操作系统 」
- 抓包工具的配置
- 【sql】oracle运维sql之event
- Java打包找不到资源文件问题
- 功能
- Web项目中使用Spring 3.x + Quartz 2.x实现作业调度详解
- 面向对象--简单的内部类
- Ciclop开源3D扫描仪软件---Horus源码分析之src\horus\engine\calibration\Pattern.py
- Python中MySQLdb执行插入操作时