内存分配模拟算法源代码

合集下载

计算机操作系统内存分配源码

计算机操作系统内存分配源码

#include<stdio.h>#include<iostream>usingnamespace std;#define MEM_SIZE 200staticchar mem[MEM_SIZE];#define MINBLK 16struct block {struct block * next;size_t length;char data[0];};staticstruct block * free_list = NULL;//free_list为空void malloc_init(void){free_list = (struct block *)mem;free_list->next = NULL;//next指向空free_list->length = MEM_SIZE - sizeof(struct block);//data段的长度}//字节对齐void * malloc(size_t size){size = (size + 7) & ~7;struct block * prev = (struct block *) &free_list;//block首段struct block * cur = free_list;//cur 指向空闲的块while (cur != NULL) {if (cur->length >= size) //判断cur指向的块是否满足所要求的大小break;prev = cur;cur = cur->next;}if (cur == NULL)return NULL;//cur->length(data段的长度)-size后的大小可不可以放下blockif ((cur->length - size) >= MINBLK) {struct block * temp = (struct block *)(cur->data + size);//temp指向新block的头temp->next = cur->next;//新block指向下一个空白temp->length = cur->length - size - sizeof(struct block);prev->next = temp;cur->length = size;}else {prev->next = cur->next;}return cur->data;}void free(void * ptr){if (ptr == NULL)return;struct block * temp = (struct block *)((char *)ptr - sizeof(struct block));char * tempn = (char *)ptr + temp->length; // 和temp物理上相邻的下一个block的地址struct block * prev = (struct block *) &free_list;struct block * cur = free_list;char * curn; // 和cur物理上相邻的下一个block的地址// 考虑多种情况,完成free函数// ... ...if (free_list > temp)//空块地址大于要释放的块的地址,直接将释放的块放入空白块头部(第一种情况){if (((char*)temp + sizeof(block)+temp->length) == (char*)free_list) {temp->length += sizeof(block)+free_list->length;free_list = temp;}else {temp->next = free_list;free_list = temp;}ptr = NULL;return;}//若不一定插入头部,寻找插入块while (cur != NULL && (char*)cur < (char*)temp){prev = cur;cur = cur->next;}//temp与前段free_list相邻if (((char *)prev + sizeof(struct block) + prev->length) == (char*)temp){prev->length =prev->length + sizeof(struct block) + temp->length;temp = prev;ptr = NULL;}else{prev->next = temp;ptr = NULL;}//free_list在比temp地址大的地方且两者相邻if ((char *)tempn == (char *)cur || cur == NULL){temp->next = cur->next;temp->length = sizeof(struct block) + cur->length + temp->length;ptr = NULL;}else{temp->next = cur;ptr = NULL;}}void malloc_state(void){printf("free blocks:\n");struct block * ptr;for (ptr = free_list; ptr != NULL; ptr = ptr->next) {int i;printf("%p:", ptr);//printf("%d", ptr->length);for (int i = 0; i < ptr->length; i++) {printf("=");}printf(" ");}printf("\n");}void malloc_test(void){//定义abcdef为分配状态char* a = (char*)malloc(sizeof(char));malloc_state();char* b = (char*)malloc(sizeof(char));malloc_state();char* c = (char*)malloc(sizeof(char));malloc_state();char* d = (char*)malloc(sizeof(char));malloc_state();char* e = (char*)malloc(sizeof(char));malloc_state();char* f = (char*)malloc(sizeof(char));//按照adbfec的顺序进行释放会将所有的情况包含进去malloc_state();free(a);malloc_state();free(d);malloc_state();free(b);malloc_state();free(f);malloc_state();free(e);malloc_state();free(c);malloc_state();}int main(int argc, constchar *argv[]) {malloc_init();malloc_test();system("pause");return 0;}。

内存分配---FF、BF、WF三种算法

内存分配---FF、BF、WF三种算法

内存分配---FF、BF、WF三种算法动态分区分配是根据进程的实际需要,动态的为之分配内存空间。

⽽在实现可变分区分配时,将涉及到分区分配中所⽤的数据结构、分区分配算法和分区的分配与内存回收的过程。

分区分配中的数据结构:(1)描述空闲块的数据结构。

(2)内存块的描述。

#define PROCESS_NAME_LEN 32 //进程名长度#define MIN_SLICE 10 //最⼩碎⽚的⼤⼩#define DEFAULT_MEM_SIZE 1024 //内存⼤⼩#define DEFAULT_MEM_START 0 //起始位置//内存分配算法#define MA_FF 1#define MA_BF 2#define MA_WF 3//描述每⼀个空闲块的数据结构struct free_block_type{int size; //空闲块⼤⼩int start_addr; //空闲块起始位置struct free_block_type *next; //指向下⼀个空闲块};//指向内存中空闲块链表的⾸地址struct free_block_type *free_block= NULL;//每个进程分配到的内存块的描述struct allocated_block{int pid;int size; //进程⼤⼩int start_addr; //进程分配到的内存块的起始地址char process_name[PROCESS_NAME_LEN]; //进程名struct allocated_block *next; //指向下⼀个进程控制块};//进程分配内存块链表的⾸指针struct allocated_block *allocated_block_head= NULL;int free_block_count= 0; //空闲块的个数int mem_size= DEFAULT_MEM_SIZE; //内存⼤⼩int current_free_mem_size= 0; //当前空闲内存⼤⼩int ma_algorithm= MA_FF; //当前分配算法static int pid= 0;int flag= 0; //设置内存⼤⼩标志,表⽰内存⼤⼩是否设置分区分配算法:(1)⾸次适应算法(First Fit):从空闲分区表的第⼀个表⽬起查找该表,把最先能够满⾜要求的空闲区分配给作业,这种⽅法的⽬的在于减少查找时间。

内存分配实验代码 -回复

内存分配实验代码 -回复

内存分配实验代码-回复内存分配实验代码:探索动态内存分配的原理与过程引言在计算机程序设计中,内存分配是至关重要的一环。

动态内存分配是指在程序运行时根据需要分配和释放内存空间。

它可以帮助开发人员灵活地管理资源,提高程序的效率和性能。

本文将以实验代码为主题,一步一步解释内存分配的原理与过程,并介绍常用的动态内存分配函数。

读者可以通过这篇文章理解内存分配的机制,并在实际开发过程中更好地进行内存管理。

1. 实验代码介绍实验代码是一个简单的C语言程序,用于模拟内存分配的过程。

以下是代码的核心部分:#include <stdio.h>#include <stdlib.h>int main() {int *ptr;int size;printf("请输入需要分配的内存大小:");scanf("d", &size);ptr = (int*)malloc(size * sizeof(int)); 动态内存分配if (ptr == NULL) {printf("内存分配失败!\n");return 1;}printf("成功分配了d个int型变量的内存\n", size);printf("内存地址:0xp\n", ptr);free(ptr); 释放内存printf("释放了d个int型变量的内存\n", size);return 0;}以上代码通过调用`malloc`函数动态分配了一个指定大小的内存空间,并通过`free`函数释放了分配的内存。

通过运行这段代码,我们可以观察内存分配的过程和结果,了解内存分配的实现细节。

2. 动态内存分配原理动态内存分配是通过在程序运行时从操作系统获取一块连续的内存空间。

C语言中,我们可以通过调用`malloc`函数来进行动态内存分配。

计算机操作系统内存分配实验源代码

计算机操作系统内存分配实验源代码

#define OK 1 // 完成#define ERROR 0 // 出错 typedef int Status; typedef struct free_table// 定义一个空闲区说明表结构{int num; // 分区序号 long address; // long length; //int state; // }ElemType; typedef struct Node// { ElemType data; struct Node *prior; // struct Node *next; // 起始地址分区大小 分区状态 线性表的双向链表存储结构 前趋指针 后继指针}Node,*LinkList;LinkList first; // 头结点LinkList end; // 尾结点int flag;// 记录要删除的分区序号Status Initblock()// 开创带头结点的内存空间链表{first=(LinkList)malloc(sizeof(Node));end=(LinkList)malloc(sizeof(Node));first->prior=NULL;first->next=end;end->prior=first;end->next=NULL;end->=1;end->=40;end->=600;end->=0;return OK;void sort()// 分区序号重新排序{Node *p=first->next,*q;q=p->next;for(;p!=NULL;p=p->next) {for(q=p->next;q;q=q->next){if(p->>=q->{q->+=1;}}}}// 显示主存分配情况void show(){ int flag=0;// 用来记录分区序号Node *p=first;p->=0;p->=0;p->=40;p->=1;sort();printf("\n\t\t 》主存空间分配情况《\n");printf("**********************************************************\n\n");printf(" 分区序号\t 起始地址\t 分区大小\t 分区状态\n\n");while(p){printf("%d\t\t%d\t\t%d",p->,p->,p->;if(p->==0) printf("\t\t 空闲\n\n");else printf("\t\t 已分配\n\n");{p=p->next; printf("**********************************************************\n\n"); }// 首次适应算法Status First_fit(int request){// 为申请作业开辟新空间且初始化Node *p=first->next;LinkList temp=(LinkList)malloc(sizeof(Node));temp->=request;temp->=1;p->=1;while(p)if((p->==0)&&(p->==request)){// 有大小恰好合适的空闲块p->=1;return OK;break;}else if((p->==0) && (p->>request)){// 有空闲块能满足需求且有剩余temp->prior=p->prior; temp->next=p;temp->=p->;temp->=p->;p->prior->next=temp; p->prior=temp;p->=temp->+temp->;p->=request;p->+=1;return OK;break;}p=p->next;}return ERROR;}// 最佳适应算法Status Best_fit(int request){int ch; // 记录最小剩余空间Node *p=first;Node *q=NULL; // 记录最佳插入位置LinkList temp=(LinkList)malloc(sizeof(Node)); temp->=request;temp->=1;p->=1;while(p) // 初始化最小空间和最佳位置{if((p->==0) && (p->>=request) ){if(q==NULL){q=p;ch=p->;}else if(q-> > p->{q=p;ch=p->;}p=p->next;}if(q==NULL) return ERROR;//没有找到空闲块else if(q->==request){q->=1;return OK;}else{temp->prior=q->prior;temp->next=q;temp->=q->;temp->=q->;q->prior->next=temp;q->prior=temp;q->+=request;q->=ch;q->+=1;return OK;}return OK;}// 最差适应算法Status Worst_fit(int request){int ch; // 记录最大剩余空间Node *p=first->next;Node *q=NULL; // 记录最佳插入位置LinkList temp=(LinkList)malloc(sizeof(Node));temp->=request;temp->=1;p->=1;while(p) // 初始化最大空间和最佳位置{if(p->==0 && (p->>=request) ){if(q==NULL){q=p;ch=p->;}else if(q-> < p->{q=p;ch=p->;}p=p->next;}if(q==NULL) return ERROR;//没有找到空闲块else if(q->==request){q->=1;return OK;}else{temp->prior=q->prior;temp->next=q;temp->=q->;temp->=q->;q->prior->next=temp;q->prior=temp;q->+=request;q->=ch;q->+=1;return OK;}return OK;}// 分配主存Status allocation(int a){int request;// 申请内存大小printf(" 请输入申请分配的主存大小(单位:KB):"); scanf("%d",&request);if(request<0 ||request==0){printf(" 分配大小不合适,请重试!");return ERROR;}switch(a){case 1: // 默认首次适应算法if(First_fit(request)==OK) printf("\t**** 分配成功!****");else printf("\t**** 内存不足,分配失败!****");return OK;break;case 2: // 选择最佳适应算法if(Best_fit(request)==OK) printf("\t**** 分配成功!****");else printf("\t**** 内存不足,分配失败!****");return OK;break;case 3: // 选择最差适应算法if(Worst_fit(request)==OK) printf("\t**** else printf("\t****分配成功!****");内存不足,分配失败!****"); return OK;break;}}Status deal1(Node *p)// 处理回收空间{Node *q=first;for(;q!=NULL;q=q->next){if(q==p){if(q->prior->==0&&q->next->!=0){q->prior->+=q->;q->prior->next=q->next;q->next->prior=q->prior;q=q->prior;q->=0;q->=flag-1;}if(q->prior->!=0&&q->next->==0) {q->+=q->next->;q->next=q->next->next;q->next->next->prior=q;q->=0;q->=flag;}if(q->prior->==0&&q->next->==0) {q->prior->+=q->;q->prior->next=q->next; q->next->prior=q->prior; q=q->prior;q->=0;q->=flag-1;}if(q->prior->!=0&&q->next->!=0){q->=0;}}}return OK;}Status deal2(Node *p)// 处理回收空间Node *q=first;for(;q!=NULL;q=q->next){if(q==p){if(q->prior->==0&&q->next->!=0){q->prior->+=q->;q->prior->next=q->next;q->next->prior=q->prior;q=p->prior;q->=0;q->=flag-1;}if(q->prior->!=0&&q->next->==0)q->=0;} if(q->prior->==0&&q->next->==0){q->prior->+=q->;q->prior->next=q->next;q->next->prior=q->prior;q=q->prior;q->=0;q->=flag-1;}if(q->prior->!=0&&q->next->!=0){q->=0;}}return OK;}// 主存回收Status recovery(int flag){Node *p=first;for(;p!=NULL;p=p->next){if(p->==flag){if(p->prior==first){if(p->next!=end)// 当前P 指向的下一个不是最后一个时{if(p->next->==0) // 与后面的空闲块相连{p->+=p->next->;p->next->next->prior=p;p->next=p->next->next;p->=0;p->=flag;}else p->=0;}if(p->next==end)// 当前P 指向的下一个是最后一个时{p->=0;}}// 结束if(p->prior==block_first) 的情况else if(p->prior!=first)if(p->next!=end){deal1(p);}else{deal2(p);}}// 结束if(p->prior!=block_first)的情况}// 结束if(p->==flag) 的情况}printf("\t**** 回收成功****");return OK;}// 主函数void main(){int i; // 操作选择标记int a;// 算法选择标记printf(" f******************************************************** **\n");printf("\t\t 用以下三种方法实现主存空间的分配\n");printf("\t(1) 首次适应算法\t(2) 最佳适应算法\t(3) 最差适应算法\n");printf(" f********************************************************* *\n");printf("\n");printf(" 请输入所使用的内存分配算法:");scanf("%d",&a);while(a<1||a>3){printf(" 输入错误,请重新输入所使用的内存分配算法:\n");scanf("%d",&a);}switch(a)case1:printf("\n\t**** case 2:printf("\n\t**** case 3:printf("\n\t**** 使用首次适应算法:使用最佳适应算法:使用最坏适应算法:}Initblock(); // 开创空间表while(1){show();printf("\t1: 分配内存\t2: 回收内存\t0: printf(" 请输入您的操作:");scanf("%d",&i);if(i==1)allocation(a); // 分配内存****\n");break; ****\n");break; ****\n");break;退出\n");else if(i==2) // 内存回收printf(" 请输入您要释放的分区号:"); scanf("%d",&flag);recovery(flag);}else if(i==0){printf("\n 退出程序\n");break; // 退出}else // 输入操作有误{printf(" 输入有误,请重试!"); continue;八、执行结果和结果分析初始化首次适应算法:当作业1、2、3 顺利分配内存空间后:}回收序号 2 里面的内存:分配作业4:回收序号 3 里面的内存(与上邻序号2相连了)回收序号 1 里的内存(与下邻序号 2 相连了)继续分配(会发现总是按顺序查找满足要求的第一个空闲块,一旦发现就会分配)。

OS课程设计模拟内存分配算法MFC实现(含源文件)

OS课程设计模拟内存分配算法MFC实现(含源文件)

课程设计报告设计题目:内存的连续分配算法班级:学号:姓名:指导老师:设计时间:摘要1、主要算法包括:固定分区分配、动态分区分配、伙伴算法、可重定位分区分配。

2、内容要求:1)定义与算法相关的数据结构,如PCB,空闲分区表;2)至少实现两种以上分配算法,且用户可以选择在某次执行过程中使用何种算法;3)在使用动态分区分配或可重定位分区分配算法时必须实现紧凑和对换功能;4)动态分区分配和可重定位分区分配必选一个实现。

本系统模拟了操作系统内存分配算法的实现,实现了固定分区分配和动态分区分配,以及可重定位分区分配算法,采用PCB 定义结构体来表示一个进程,定义了进程的名称和大小,进程内存起始地址和进程状态。

内存分区表采用单链表来模拟实现。

关键词:固定分区分配、动态分区分配、可重定位分区分配。

目录1.概述 (4)2.课程设计任务及要求2.1 设计任务 (4)2.2 设计要求 (4)3.算法及数据结构3.1算法的总体思想(流程) (5)3.2 PCB模块3.2.1功能(运算) (5)3.2.2数据结构(存储结构) (5)3.2.3算法(实现) (5)3.3 进程队列模块3.3.1功能 (6)3.3.2数据结构 (6)3.3.3算法 (6)4.程序设计与实现4.1 程序流程图 (7)4.2 程序说明(代码)4.3实验结果 (9)5.结论 (10)6.参考文献。

(10)7.收获、体会和建议。

(10)一:概述本系统模拟了操作系统内存分配算法的实现,实现了固定分区分配和动态分区分配,以及可重定位分区分配算法,采用PCB定义结构体来表示一个进程,定义了进程的名称和大小,进程内存起始地址和进程状态。

内存分区表采用单链表来模拟实现。

固定分区实现就是将单链表的每个节点的大小设为固定大小,系统默认如果按固定分区分配的话,只能分成20个相等大小的分区,因此系统只能最多运行20个进程。

动态分区的实现是根据进程所申请的内存大小来决定动态的有系统进行分配内存空间大小,因此分区表里的空闲分区个数是不定的,根据进程数和进程大小决定的。

叶伟 内存分配模拟算法源代码

叶伟 内存分配模拟算法源代码
strcpy(occupys[occupy_quantity].tag,job_name);
occupys[occupy_quantity].length=job_length;
occupy_quantity++;
if(frees[i].length>job_length){
frees[i].start+=job_length;
else{
t=0;
i=0;
while(t==0){
if(frees[i].length>=job_length)
t=1;
i++;}
i--;
for(j=0;j<free_quantity;j++){
if((frees[j].length>=job_length)&&(frees[j].length>frees[i].length))
{ t=1; }
i++;
}
i--;
occupys[occupy_quantity].start=frees[i].start; //修改已分区的相关信息
strcpy(occupys[occupy_quantity].tag,job_name);
occupys[occupy_quantity].length=job_length;
}
}
//显示函数
void view() {
int i;
cout<<endl<<"-------------------------------------------"<<endl;

操作系统内存分配代码(第二次实验)

操作系统内存分配代码(第二次实验)

#include<stdio.h>#include<stdlib.h>#define FF 0#define BF 1typedef struct JCB//作业结构体{int ads;int size;int id;struct JCB *next;}JCB,*JCBStr;typedef struct{JCBStr front;JCBStr end;}Link;Link Ready,Free;//已分配和未分配队列int Type;//内存分配操作int Size;//内存总大小int Fit;//内存分配方法int adress;//临时地址void build(JCBStr &q)//创建空链节{q = (JCBStr) malloc(sizeof(JCB));q->next = NULL;}void create(JCBStr &q,int id)//创建一个JCB {build(q);q->id = id;q->size = Size;q->ads = adress;}void Init()//队列初始化{build(Ready.front);Ready.end = Ready.front;build(Free.front);Free.end = Free.front;JCBStr q;create(q,0);Free.front->next = q;Free.end = q;q->ads = 0;}void lookFree(JCBStr &q)//查看空闲队列{JCBStr s,t;s = Free.front;t = Free.front->next;while(t){if(t->size>=Size){adress = t->ads;break;}s = t;t = t->next;}q = t;if(t && Fit == BF){s->next = t->next;if(t == Free.end)Free.end = s;}}void lookReady(JCBStr &q,int id)//查看并取出链节{JCBStr s;s = Ready.front;q = Ready.front->next;while(q){if(q->id == id)break;s = q;q = q->next;}if(!q) return;q->id = 0;s->next = q->next;if(q == Ready.end)Ready.end = s;}void insertReadyLink(JCBStr &q)//插入分配队列{Ready.end->next = q;Ready.end = q;}void InsertFreeBF(JCBStr &q)//根据内存空间排序插入{JCBStr s,t;t = Free.front;s = Free.front->next;while(s){if(s->size <= q->size){t = s;s = s->next;}else{break;}}t->next = q;q->next = s;if(t == Free.end)Free.end = q;}void InsertFreeFF(JCBStr &q)//根据内存地址排序插入{JCBStr s,t;t = Free.front;s = Free.front->next;while(s){if(s->ads < q->ads){t = s;s = s->next;}else{break;}}t->next = q;q->next = s;if(t == Free.end)Free.end = q;}void hebinFF(JCBStr &q,JCBStr &node,int type)//快速回收查找方法{JCBStr s,t;s = Free.front;t = s->next;switch(type){case 0:while(t){if(t->ads + t->size < q->ads){s = t;t = t->next;}else if(t->ads+t->size == q->ads){node = t;s->next = t->next;if(t == Free.end)Free.end = s;break;}else{node = NULL;break;}}break;case 1:while(t){if(q->ads+q->size < t->ads){s = t;t = t->next;}else if(q->ads+q->size == t->ads){node = t;s->next = t->next;if(t == Free.end)Free.end = s;break;}else{node = NULL;break;}}break;}}void hebinBF(JCBStr &q,JCBStr &node,int type)//最优回收{JCBStr s,t;node = NULL;s = Free.front;t = s->next;switch(type){case 0:while(t){if(t->ads+t->size != q->ads){s = t;t = t->next;}else{node = t;s->next = t->next;if(t == Free.end)Free.end = s;break;}}break;case 1:while(t){if(q->ads+q->size != t->ads){s = t;t = t->next;}else{node = t;s->next = t->next;if(t == Free.end)Free.end = s;break;}}break;}}void hebin(JCBStr &node,JCBStr &node1,int type)//回收合并方法{if(node1!=NULL){switch(type){case 0:node->ads -= node1->size;node->size +=node1->size;free(node1);break;case 1:node->size += node1->size;free(node1);break;}}}int buildLink(int id,int type,int fit) //内存分配回收{JCBStr node,node1;switch(type){case 1://内存分配lookFree(node);//查看满足空间的内存,不取出if(!node) return 0;switch(fit){case FF:create(node1,id);//创建Ready节点insertReadyLink(node1);//放入队列node->ads += Size;//空闲节点地址增加node->size -=Size;//节点空间减少break;case BF:create(node1,id);//创建Ready节点insertReadyLink(node1);//放入队列node->ads += Size;//空闲节点地址增加node->size -=Size;//节点空间减少InsertFreeBF(node);//按空间大小排序插入队列break;}break;case 2://内存回收lookReady(node,id);if(!node) return 0;switch(fit){case FF://合并hebinFF(node,node1,0);hebin(node,node1,0);hebinFF(node,node1,1);hebin(node,node1,1);//直接插入InsertFreeFF(node);break;case BF://合并hebinBF(node,node1,0);hebin(node,node1,0);hebinBF(node,node1,1);hebin(node,node1,1);//排序插入空闲队列InsertFreeBF(node);break;}break;}return 1;}//输出void print(Link Q){JCBStr p;p=Q.front->next;if(p==NULL)printf("# 队列为空!#\n");//队列为空else{printf("# 分区号起始大小#\n");while(p!=NULL) //否则显示队列中所有元素{printf(" %d %d %d \n",p->id,p->ads,p->size);p=p->next;}}}int main(){int id,flag;printf("##########################################\n");printf("# 请输入总内存大小#\n");printf("##########################################\n");scanf("%d",&Size);Init();//printf("########################################\n");printf("#选择内存分配策略,0 :首次适应算法(first fit);1 :最佳适应算法(best fit)#\n");//printf("########################################\n");scanf("%d",&Fit);//printf("########################################\n");printf("#选择内存操作,1 :分配内存,2 :内存回收,0 退出程序!#\n");//printf("# #\n");while(scanf("%d",&Type),Type!=0){switch(Type){case 1:printf("请输入内存分配编号和所需内存大小!\n");scanf("%d%d",&id,&Size);flag = buildLink(id,Type,Fit);if(flag == 0)printf("内存空间不足!\n");else{printf("回收成功!已分配内存为:\n");print(Ready);printf("剩余内存为:\n");print(Free);}break;case 2:printf("请输入内存回收编号!\n");scanf("%d",&id);flag = buildLink(id,Type,Fit);if(flag == 0)printf("此编号不存在!\n");else{printf("回收成功!已分配内存为:\n");print(Ready);printf("剩余内存为:\n");print(Free);}break;}//printf("########################################\n");printf("#选择内存操作,1 :分配内存,2 :内存回收,0 退出程序!#\n");// printf("#0 退出程序!#\n");//printf("########################################\n");}return 0;}。

c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)

c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)

c模拟内存分配算法(⾸次适应算法,最佳适应算法,最坏适应算法)#include<bits/stdc++.h>using namespace std;/*定义内存的⼤⼩为100*/#define MEMSIZE 100/*如果⼩于此值,将不再分割内存*/#define MINSIZE 2/*内存分区空间表结构*/typedef struct _MemoryInfomation{/*起始地址*/int start;/*⼤⼩*/int Size;/*状态 F:空闲(Free) U:占⽤(Used) E 结束(End)*/char status;} MEMINFO;/*内存空间信息表*/MEMINFO MemList[MEMSIZE];/*显⽰内存状态*/void Display(){int i,used=0;//记录可以使⽤的总空间量printf("\n---------------------------------------------------\n");printf("%5s%15s%15s%15s","Number","start","size","status");printf("\n---------------------------------------------------\n");for(i=0; i<MEMSIZE&&MemList[i].status!='e'; i++){if(MemList[i].status=='u'){used+=MemList[i].Size;}printf("%5d%15d%15d%15s\n",i,MemList[i].start,MemList[i].Size,MemList[i].status=='u'?"USED":"FREE");}printf("\n----------------------------------------------\n");printf("Totalsize:%-10d Used:%-10d Free:%-10d\n",MEMSIZE,used,MEMSIZE-used);}/*初始化所有变量*/void InitMemList(){int i;MEMINFO temp= {0,0,'e'};//初始化空间信息表for(i=0; i<MEMSIZE; i++){MemList[i]=temp;}//起始地址为0MemList[0].start=0;//空间初始为最⼤MemList[0].Size=MEMSIZE;//状态为空闲MemList[0].status='f';}/*最先适应算法*//*算法原理分析:将空闲的内存区按其在储存空间中的起始地址递增的顺序排列,为作业分配储存空间时,从空闲区链的始端开始查找,选择第⼀个满⾜要求的空闲区,⽽不管它究竟有多⼤优点:1.在释放内存分区的时候,如果有相邻的空⽩区就进⾏合并,使其成为⼀个较⼤的空⽩区2.此算法的实质是尽可能的利⽤储存器的低地址部分,在⾼地址部分则保留多的或较⼤的空⽩区,以后如果需要较⼤的空⽩区,就容易满⾜缺点:1.在低地址部分很快集中了许多⾮常⼩的空⽩区,因⽽在空⽩区分配时,搜索次数增加,影响⼯作效率。

Minix3操作系统内存分配算法代码

Minix3操作系统内存分配算法代码

操作系统内存分配算法代码/*这个文件涉及到任意大小的分配和释放的物理内存代表叉子和执行系统调用。

关键的数据结构洞表,维护一个洞在内存列表。

它是增加排序内存地址。

的地址它包含指物理内存,从绝对地址0(即。

,他们不是相对于PM)的开始。

在系统初始化,这部分内存包含中断向量,内核,点“分配”将它们标记为不可用,从这个洞列表中删除它们。

*/* The entry points into this file are:* alloc_mem: allocate a given sized chunk of memory* free_mem: release a previously allocated chunk of memory* mem_init: initialize the tables when PM start up* max_hole: returns the largest hole currently available*/#include "pm.h"#include <minix/com.h>#include <minix/callnr.h>#include <signal.h>#include <stdlib.h>#include "mproc.h"#include "../../kernel/const.h"#include "../../kernel/config.h"#include "../../kernel/type.h"#define NR_HOLES (2*NR_PROCS) /* 最大的条目在空洞表中*/#define NIL_HOLE (struct hole *) 0PRIVATE struct hole {struct hole *h_next; /* pointer to next entry on the list */phys_clicks h_base; /* where does the hole begin? */phys_clicks h_len; /* how big is the hole? */} hole[NR_HOLES];PRIVATE struct hole *hole_head; /* pointer to first hole */PRIVATE struct hole *free_slots;/* ptr to list of unused table slots */#define swap_base ((phys_clicks) -1)FORWARD _PROTOTYPE( void del_slot, (struct hole *prev_ptr, struct hole *hp) ); FORWARD _PROTOTYPE( void merge, (struct hole *hp) );#define swap_out() (0)/*===========================================================================* * alloc_mem首次适应算法**===========================================================================*/ PUBLIC phys_clicks alloc_mem(clicks)phys_clicks clicks; /* amount of memory requested */{/*分配一块内存空闲列表的使用首先满足。

操作系统-实验四动态分区分配算法源代码最新最全

操作系统-实验四动态分区分配算法源代码最新最全

实验四操作系统-动态分区分配算法萨斯的发生的v设计程序模拟四种动态分区分配算法:首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法的工作过程。

假设内存中空闲分区个数为n,空闲分区大小分别为P l,…,P n,在动态分区分配过程中需要分配的进程个数为m (m<n),它们需要的分区大小分别为S i,…,S m,分别利用四种动态分区分配算法将m个进程放入n个空闲分区,给出进程在空闲分区中的分配情况。

程序要求如下:1)利用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法四种动态分区分配算法模拟分区分配过程。

2)模拟四种算法的分区分配过程,给出每种算法进程在空闲分区中的分配情况。

3)输入:空闲分区个数n,空闲分区大小P i,…,P n,进程个数m, 进程需要的分区大小S i,…,S m,算法选择1-首次适应算法,2-循环首次适应算法,3-最佳适应算法,4-最坏适应算法。

4)输出:最终内存空闲分区的分配情况。

代码实现:#include<iostream>#include<fstream>#include<iomanip>using namespace std;const int MaxNumber=100;int FreePartition[MaxNumber];// 空闲分区大小int FirstPartition[MaxNumber];//1-首次适应算法int CycleFirstPartition[MaxNumber];//2-循环首次适应算法int BestPartition[MaxNumber];//3-最佳适应算法int WorstPartition[MaxNumber];//4-最坏适应算法int ProcessNeed[MaxNumber];// 进程需要的分区大小int PartitionNum,ProcessNum;char ProcessName[MaxNumber];// 进程名char ProcessPartition[MaxNumber];// 进程分配的序列int Partition[MaxNumber];char str[MaxNumber][MaxNumber];void FirstFit(int n,int m);void NextFit(int n,int m);void BestFit(int n,int m);void WorstFit(int n,int m);void Print(int n, int m);void Print2(int n, int m);//======================================================== void FirstFit(int n, int m){cout<<"选择了首次适应算法!"<<endl;cout<<endl;int i,j,k=0;for(i=0; i<n; i++){FirstPartition[i] = FreePartition[i];}for(j=0; j<m; j++){for(i=0; i<n; i++){if(ProcessNeed[j]<=FirstPartition[i]){ProcessPartition[j]=i;//str[i][k] = ProcessName[j];FirstPartition[i] = FirstPartition[i]-ProcessNeed[j]; break;}}}Print(n,m);cout<<"空间序号:"<<" ";for(i=0; i<n; i++)(cout<<T<<setw(m-1)<<"空间”<<(i+1);}cout<<endl;cout<<"分区大小:"<<" ";for(i=0; i<n; i++)(cout<<T<<setw(m)<<setiosflags(ios::left)<<FreePartition[i];}cout<<endl;cout<<"剩余分区大小:";for(i=0; i<n; i++)(cout<<"|"<<setw(m)<<setiosflags(ios::left)<<FirstPartition[i];}cout<<endl;Print2(n,m);}void NextFit(int n, int m)(cout<<"选择了循环首次适应算法!"<<endl;cout<<endl;int i,j,flag=0;for(i=0; i<n; i++)(CycleFirstPartition[i] = FreePartition[i];}for(j=0; j<m; j++)(for(i=flag; i<n; i++)(if(ProcessNeed[j]<=CycleFirstPartition[i])(ProcessPartition[j]=i;CycleFirstPartition[i] = CycleFirstPartition[i]-ProcessNeed[j];flag = i+1;if(i==n-1)(flag=O;)break;)))Print(n,m);cout«"空间序号:for(i=0; i<n; i++){cout«"|"«setw(m-1)«"空间"«(i+1);)cout«endl;cout«"分区大小:"vv"for(i=0; i<n; i++){cout«"|"«setw(m)«setiosflags(ios::left)«FreePartition[i];)cout«endl;cout«"剩余分区大小:";for(i=0; i<n; i++){cout«"|"«setw(m)«setiosflags(ios::left)«CycleFirstPartition[i];)cout«endl;Print2(n,m);)void BestFit(int n, int m){cout«"选择了最佳适应算法!"«endl;cout«endl;int i j,flag=O,temp,id=O,flag1 =0;for(i=0; i<n; i++){BestPartition[i] = FreePartition[i];)while(flag1<m){flag = 0;for(i=0; i<n; i++)Partition[i]=0;}for(i=0; i<n; i++)(if(ProcessNeed[flag1]<=BestPartition[i])(Partition[flag]=i;flag += 1;}}temp = BestPartition[Partition[0]];id = Partition]。

计算机操作系统内存分配实验源代码

计算机操作系统内存分配实验源代码

#include<stdio.h>#include<stdlib.h>#define OK 1 //完成#define ERROR 0 //出错typedef int Status;typedef struct free_table//定义一个空闲区说明表结构{int num; //分区序号long address; //起始地址long length; //分区大小int state; //分区状态}ElemType;typedef struct Node// 线性表的双向链表存储结构{ElemType data;struct Node *prior; //前趋指针struct Node *next; //后继指针}Node,*LinkList;LinkList first; //头结点LinkList end; //尾结点int flag;//记录要删除的分区序号Status Initblock<>//开创带头结点的内存空间链表{first=<LinkList>malloc<sizeof<Node>>;end=<LinkList>malloc<sizeof<Node>>;first->prior=NULL;first->next=end;end->prior=first;end->next=NULL;end->data.num=1;end->data.address=40;end->data.length=600;end->data.state=0;return OK;}void sort<>//分区序号重新排序{Node *p=first->next,*q;q=p->next;for<;p!=NULL;p=p->next>{for<q=p->next;q;q=q->next>{if<p->data.num>=q->data.num>{q->data.num+=1;}}}}//显示主存分配情况void show<>{ int flag=0;//用来记录分区序号Node *p=first;p->data.num=0;p->data.address=0;p->data.length=40;p->data.state=1;sort<>;printf<"\n\t\t》主存空间分配情况《\n">;printf<"**********************************************************\n\n">; printf<"分区序号\t起始地址\t分区大小\t分区状态\n\n">;while<p>{printf<"%d\t\t%d\t\t%d",p->data.num,p->data.address,p->data.length>;if<p->data.state==0> printf<"\t\t空闲\n\n">;else printf<"\t\t已分配\n\n">;p=p->next;}printf<"**********************************************************\n\n">; }//首次适应算法Status First_fit<int request>{//为申请作业开辟新空间且初始化Node *p=first->next;LinkList temp=<LinkList>malloc<sizeof<Node>>;temp->data.length=request;temp->data.state=1;p->data.num=1;while<p>{if<<p->data.state==0>&&<p->data.length==request>>{//有大小恰好合适的空闲块p->data.state=1;return OK;break;}else if<<p->data.state==0> && <p->data.length>request>> {//有空闲块能满足需求且有剩余temp->prior=p->prior;temp->next=p;temp->data.address=p->data.address;temp->data.num=p->data.num;p->prior->next=temp;p->prior=temp;p->data.address=temp->data.address+temp->data.length; p->data.length-=request;p->data.num+=1;return OK;break;}p=p->next;}return ERROR;}//最佳适应算法Status Best_fit<int request>{int ch; //记录最小剩余空间Node *p=first;Node *q=NULL; //记录最佳插入位置LinkList temp=<LinkList>malloc<sizeof<Node>>;temp->data.length=request;temp->data.state=1;p->data.num=1;while<p> //初始化最小空间和最佳位置{if<<p->data.state==0> && <p->data.length>=request> >{if<q==NULL>{q=p;ch=p->data.length-request;}else if<q->data.length > p->data.length>{q=p;ch=p->data.length-request;}}p=p->next;}if<q==NULL> return ERROR;//没有找到空闲块else if<q->data.length==request>{q->data.state=1;return OK;}else{temp->prior=q->prior;temp->next=q;temp->data.address=q->data.address;temp->data.num=q->data.num;q->prior->next=temp;q->prior=temp;q->data.address+=request;q->data.length=ch;q->data.num+=1;return OK;}return OK;}//最差适应算法Status Worst_fit<int request>{int ch; //记录最大剩余空间Node *p=first->next;Node *q=NULL; //记录最佳插入位置LinkList temp=<LinkList>malloc<sizeof<Node>>;temp->data.length=request;temp->data.state=1;p->data.num=1;while<p> //初始化最大空间和最佳位置{if<p->data.state==0 && <p->data.length>=request> > {if<q==NULL>{q=p;ch=p->data.length-request;}else if<q->data.length < p->data.length>{q=p;ch=p->data.length-request;}}p=p->next;}if<q==NULL> return ERROR;//没有找到空闲块else if<q->data.length==request>{q->data.length=1;return OK;}else{temp->prior=q->prior;temp->next=q;temp->data.address=q->data.address;temp->data.num=q->data.num;q->prior->next=temp;q->prior=temp;q->data.address+=request;q->data.length=ch;q->data.num+=1;return OK;}return OK;}//分配主存Status allocation<int a>{int request;//申请内存大小printf<"请输入申请分配的主存大小<单位:KB>:">;scanf<"%d",&request>;if<request<0 ||request==0>{printf<"分配大小不合适,请重试!">;return ERROR;}switch<a>{case 1: //默认首次适应算法if<First_fit<request>==OK> printf<"\t****分配成功!****">; else printf<"\t****内存不足,分配失败!****">;return OK;break;case 2: //选择最佳适应算法if<Best_fit<request>==OK> printf<"\t****分配成功!****">; else printf<"\t****内存不足,分配失败!****">;return OK;break;case 3: //选择最差适应算法if<Worst_fit<request>==OK> printf<"\t****分配成功!****">; else printf<"\t****内存不足,分配失败!****">;return OK;break;}}Status deal1<Node *p>//处理回收空间{Node *q=first;for<;q!=NULL;q=q->next>{if<q==p>{if<q->prior->data.state==0&&q->next->data.state!=0> {q->prior->data.length+=q->data.length;q->prior->next=q->next;q->next->prior=q->prior;q=q->prior;q->data.state=0;q->data.num=flag-1;}if<q->prior->data.state!=0&&q->next->data.state==0>{q->data.length+=q->next->data.length;q->next=q->next->next;q->next->next->prior=q;q->data.state=0;q->data.num=flag;}if<q->prior->data.state==0&&q->next->data.state==0> {q->prior->data.length+=q->data.length;q->prior->next=q->next;q->next->prior=q->prior;q=q->prior;q->data.state=0;q->data.num=flag-1;}if<q->prior->data.state!=0&&q->next->data.state!=0> {q->data.state=0;}}}return OK;}Status deal2<Node *p>//处理回收空间{Node *q=first;for<;q!=NULL;q=q->next>{if<q==p>{if<q->prior->data.state==0&&q->next->data.state!=0> {q->prior->data.length+=q->data.length;q->prior->next=q->next;q->next->prior=q->prior;q=p->prior;q->data.state=0;q->data.num=flag-1;}if<q->prior->data.state!=0&&q->next->data.state==0>{q->data.state=0;}if<q->prior->data.state==0&&q->next->data.state==0> {q->prior->data.length+=q->data.length;q->prior->next=q->next;q->next->prior=q->prior;q=q->prior;q->data.state=0;q->data.num=flag-1;}if<q->prior->data.state!=0&&q->next->data.state!=0> {q->data.state=0;}}}return OK;}//主存回收Status recovery<int flag>{Node *p=first;for<;p!=NULL;p=p->next>{if<p->data.num==flag>{if<p->prior==first>{if<p->next!=end>//当前P指向的下一个不是最后一个时{if<p->next->data.state==0> //与后面的空闲块相连 {p->data.length+=p->next->data.length;p->next->next->prior=p;p->next=p->next->next;p->data.state=0;p->data.num=flag;}else p->data.state=0;}if<p->next==end>//当前P指向的下一个是最后一个时{p->data.state=0;}}//结束if<p->prior==block_first>的情况else if<p->prior!=first>{if<p->next!=end>{deal1<p>;}else{deal2<p>;}}//结束if<p->prior!=block_first>的情况}//结束if<p->data.num==flag>的情况}printf<"\t****回收成功****">;return OK;}//主函数void main<>{int i; //操作选择标记int a;//算法选择标记printf<"**********************************************************\n">; printf<"\t\t用以下三种方法实现主存空间的分配\n">;printf<"\t<1>首次适应算法\t<2>最佳适应算法\t<3>最差适应算法\n">;printf<"**********************************************************\n">; printf<"\n">;printf<"请输入所使用的内存分配算法:">;scanf<"%d",&a>;while<a<1||a>3>{printf<"输入错误,请重新输入所使用的内存分配算法:\n">;scanf<"%d",&a>;}switch<a>{case 1:printf<"\n\t****使用首次适应算法:****\n">;break;case 2:printf<"\n\t****使用最佳适应算法:****\n">;break;case 3:printf<"\n\t****使用最坏适应算法:****\n">;break;}Initblock<>; //开创空间表while<1>{show<>;printf<"\t1: 分配内存\t2: 回收内存\t0: 退出\n">;printf<"请输入您的操作:">;scanf<"%d",&i>;if<i==1>allocation<a>; // 分配内存else if<i==2> // 内存回收{printf<"请输入您要释放的分区号:">;scanf<"%d",&flag>;recovery<flag>;}else if<i==0>{printf<"\n退出程序\n">;break; //退出}else //输入操作有误{printf<"输入有误,请重试!">;continue;}}}八、执行结果和结果分析初始化首次适应算法:当作业1、2、3顺利分配内存空间后:回收序号2里面的内存:分配作业4:回收序号3里面的内存〔与上邻序号2相连了回收序号1里的内存〔与下邻序号2相连了继续分配〔会发现总是按顺序查找满足要求的第一个空闲块,一旦发现就会分配:。

操作系统实验—内存管理源代码

操作系统实验—内存管理源代码

//该程序从文件读入每次的操作,并将结果输出到out.txt文件中#include <stdio.h>#include <stdlib.h>#include <windows.h>#include <iostream.h>#include <fstream.h>struct operation{int time; // 起始时间开始执行的时间int block; //内存页数块数int oper; //操作int protection; //权限};struct trace //跟踪每一次分配活动的数据结构{LPVOID start; //起始地址long size; //分配的大小};HANDLE allo,trac;//信号量句柄DWORD Tracker(LPDWORD lpdwparm) //跟踪allocator线程的内存行为,并输出必要信息{ofstream outfile; //输出文件outfile.open("out.txt");for(int i=0;i<=30;i++){WaitForSingleObject(trac,INFINITE);//等待allocator一次内存分配活动结束//打印内存状况和系统状况outfile<<i<<endl;//以下一段显示系统信息,每次执行操作后系统消息不变//每次的系统信息相同,察看时可以取消注释//系统信息SYSTEM_INFO info;GetSystemInfo(&info);outfile<<"dwActiveProcessorMask"<<'\t'<<info.dwActiveProcessorMask<<endl;outfile<<"dwAllocationGranularity"<<'\t'<<info.dwAllocationGranularity<<endl;outfile<<"dwNumberOfPrecessors"<<'\t'<<info.dwNumberOfProcessors<<endl;outfile<<"dwOemID"<<'\t'<<info.dwOemId<<endl;outfile<<"dwPageSize"<<'\t'<<info.dwPageSize<<endl;outfile<<"dwProcessorType"<<'\t'<<info.dwProcessorType<<endl;outfile<<"lpMaximumApplicationAddress"<<'\t'<<info.lpMaximumApplicationAddress<<endl; outfile<<"lpMinimumApplicationAddress"<<'\t'<<info.lpMinimumApplicationAddress<<endl; outfile<<"wProcessorArchitecture"<<'\t'<<info.wProcessorArchitecture<<endl;outfile<<"wProcessorLevel"<<'\t'<<info.wProcessorLevel<<endl;outfile<<"wProcessorRevision"<<'\t'<<info.wProcessorRevision<<endl;outfile<<"wReserved"<<'\t'<<info.wReserved<<endl;outfile<<"*************************************************"<<endl;//内存状况MEMORYSTATUS status;GlobalMemoryStatus(&status);outfile<<"dwAvailPageFile"<<'\t'<<status.dwAvailPageFile<<endl;outfile<<"dwAvailPhys"<<'\t'<<status.dwAvailPhys<<endl;outfile<<"dwAvailVirtual"<<'\t'<<status.dwAvailVirtual<<endl;outfile<<"dwLength"<<'\t'<<status.dwLength<<endl;outfile<<"dwMemoryLoad"<<'\t'<<status.dwMemoryLoad<<endl;outfile<<"dwTotalPageFile"<<'\t'<<status.dwTotalPageFile<<endl;outfile<<"dwTotalPhy"<<'\t'<<status.dwTotalPhys<<endl;outfile<<"dwTotalVirtual"<<'\t'<<status.dwTotalVirtual<<endl;outfile<<"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&"<<endl;//内存基本信息,每次执行的结果相同,察看时可以取消注释MEMORY_BASIC_INFORMATION mem;VitualQuery(info.lpMinimumApplicationAddress,&mem,sizeof(MEMORY_BASIC_INFORMA TION));outfile<<"AllocationBase"<<'\t'<<mem.AllocationBase<<endl;outfile<<"AllocationProtect"<<'\t'<<mem.AllocationProtect<<endl;outfile<<"BaseAddress"<<'\t'<<mem.BaseAddress<<endl;outfile<<"Protect"<<'\t'<<mem.Protect<<endl;outfile<<"RegionSize"<<'\t'<<mem.RegionSize<<endl;outfile<<"State"<<'\t'<<mem.State<<endl;outfile<<"Type"<<'\t'<<mem.Type<<endl;outfile<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "<<endl;//释放信号量通知allocator可以执行下一次内存分配活动ReleaseSemaphore(allo,1,NULL);}return 0;}void Allocator()//模拟内存分配活动的线程{trace traceArray[5];int index=0;FILE* file;file=fopen("opfile","rb");//读入文件operation op;SYSTEM_INFO info;DWORD temp;GetSystemInfo(&info);for(int i=0;i<30;i++){WaitForSingleObject(allo,INFINITE);//等待tracker打印结束的信号量cout<<i<<':';fread(&op,sizeof(operation),1,file);Sleep(op.time);//执行时间,如果想在指定时间执行可以取消注释GetSystemInfo(&info);switch(op.protection)//根据文件内容确定权限{case 0:{index=0;temp=PAGE_READONLY;break;}case 1:temp=PAGE_READWRITE;break;case 2:temp=PAGE_EXECUTE;break;case 3:temp=PAGE_EXECUTE_READ;break;case 4:temp=PAGE_EXECUTE_READWRITE;break;default:temp=PAGE_READONLY;}switch(op.oper){case 0://保留一个区域{cout<<"reserve now "<<endl;traceArray[index].start=VirtualAlloc(NULL,op.block*info.dwPageSize,MEM_RESERVE,PAGE_NOACCESS);traceArray[index++].size=op.block*info.dwPageSize;cout<<"starting address:"<<traceArray[index-1].start<<'\t'<<"size:"<<traceArray[index-1].size<<endl;break;}case 1://提交一个区域{cout<<"commit now "<<endl;traceArray[index].start=VirtualAlloc(traceArray[index].start,traceArray[index].size,MEM_COMMIT,temp);index++;cout<<"starting address:"<<traceArray[index-1].start<<'\t'<<"size:"<<traceArray[index-1].size<<endl;break;}case 2://锁一个区域{cout<<"lock now"<<endl;cout<<"starting address:"<<traceArray[index].start<<'\t'<<"size:"<<traceArray[index].size<<endl;if(!VirtualLock(traceArray[index].start,traceArray[index++].size))cout<<GetLastError()<<endl;//GetLastError()函数返回错误号break;}case 3://解锁一个区域{cout<<"unlock now"<<endl;cout<<"starting address:"<<traceArray[index].start<<'\t'<<"size:"<<traceArray[index].size<<endl;if(!VirtualUnlock(traceArray[index].start,traceArray[index++].size))cout<<GetLastError()<<endl;break;}case 4://回收一个区域{cout<<"decommit now"<<endl;cout<<"starting address:"<<traceArray[index].start<<'\t'<<"size:"<<traceArray[index].size<<endl;if(!VirtualFree(traceArray[index].start,traceArray[index++].size,MEM_DECOMMIT)) cout<<GetLastError()<<endl;break;}case 5://释放一个区域{cout<<"release now"<<endl;cout<<"starting address:"<<traceArray[index].start<<'\t'<<"size:"<<traceArray[index].size<<endl;if(!VirtualFree(traceArray[index++].start,0,MEM_RELEASE))cout<<GetLastError()<<endl;break;}default:cout<<"error"<<endl;}ReleaseSemaphore(trac,1,NULL);//释放信号量通知tracker可以打印信息}}int main(){DWORD dwThread;HANDLE handle[2];//生成两个线程handle[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Tracker,NULL,0, &dwThread);handle[1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Allocator,NULL,0, &dwThread);//生成两个信号量allo=CreateSemaphore(NULL,0,1,"allo");trac=CreateSemaphore(NULL,1,1,"trac");//等待线程执行的执行结束后,再退出WaitForMultipleObjects(2,handle,TRUE,INFINITE);return 0;}。

用C语言模拟内存分区分配管理的最佳适应算法

用C语言模拟内存分区分配管理的最佳适应算法

编写程序模拟实现内存的动态分区法存储管理。

内存空闲区使用自由链管理,采用最坏适应算法从自由链中寻找空闲区进行分配,内存回收时要与相邻空闲区的合并。

初始状态信息:假定系统的内存共640K,初始状态为操作系统本身占用64K。

将要申请内存的作业信息(存储在document/job.txt文件中),当前时间是0。

输入:用户打开document/job.txt文件,输入作业信息。

处理:模拟时间逐歩增加,每次加1.采用先来先服务算法调度作业,模拟作业运行,用最坏适应算法进行内存的分配。

且进行内存的回收,注意与空闲分区的合并。

直到所以作业运行完成程序结束。

输出:把当前时间为0,为1,为2......的内存分配状况和作业信息写入文件document/information.txt。

设计思路4.1 结点定义//空闲区结点描述typedef struct FreeNode{int length; // 分区长度int address; // 分区起始地址}FreeNode,*PFreeNode;//空闲区自由链表的描述typedef struct FreeLink{FreeNode freeNode;struct FreeLink * next;}FreeLink,*PFreeLink;//内存占用区链表描述typedef struct BusyNode{char name[20];//标明此块内存被哪个进程所占用int length; // 分区长度int address; // 分区起始地址}BusyNode,*PBusyNode;//内存占用区忙碌链表的描述typedef struct BusyLink{BusyNode busyNode;struct BusyLink * next;}BusyLink,*PBusyLink;//作业控制块的结点描述typedef struct JCBNode{char name[20]; //作业名称int length; //作业申请的内存大小int start_time; //作业申请内存的时间,即到达后备作业队列的时间int use_time; //作业占用内存的时间,随着该作业的运行逐渐减小,int state; //作业内存分配描述://0表示未申请内存,此时作业在后备队列//1表示申请内存成功,作业进入就绪队列//2表示申请内存失败,此时作业插入到后备队列队尾//3表示该作业占用cpu,正在运行//4表示作业运行完成,释放占用的内存}JCBNode,*PJCBNode;//作业队列的描述,用带头结点的循环链表实现typedef struct JCBQueue{JCBNode jcbNode;struct JCBQueue* next;}JCBQueue,*PJCBQueue;4.2 全局变量定义//全局变量#define ALL_MEMORY 640 //系统总内存#define OS_MEMORY 64 //操作系统占用的内存#define SIZE 2 //门限值PFreeLink freeLink; //空闲区自由链表PBusyLink busyLink; //内存占用区链表PJCBQueue jcbQueue; //外存中待分配内存的作业队列PJCBQueue readyQueue; //已分配内存的就绪队列PJCBQueue finishQueue; //已完成的作业队列PJCBNode currentJCB; //当前正在执行的进程(作业)int current_time; //当前时间4.3 算法流程图(已上传,在此没贴出)1.程序总算法流程图如下:此流程图描述了作业从外存进入内存,再到进程完毕的过程。

计算机操作系统内存分配实验源代码

计算机操作系统内存分配实验源代码
{
int ch; //记录最小剩余空间
Node *p=first;
Node *q=NULL; //记录最佳插入位置
LinkList temp=(LinkList)malloc(sizeof(Node));
temp->=request;
temp->=1;
p->=1;
while(p) //初始化最小空间和最佳位置
if(request<0 ||request==0)
{
printf("分配大小不合适,请重试!");
return ERROR;
}
switch(a)
{
case 1: //默认首次适应算法
if(First_fit(request)==OK) printf("\t****分配成功!****");
else printf("\t****内存不足,分配失败!****");
{
if((p->==0) && (p->>=request) )
{
if(q==NULL)
{
q=p;
ch=p->;
}
else if(q-> > p->
{
q=p;
ch=p->;
}
}
p=p->next;
}
if(q==NULL) return ERROR;//没有找到空闲块
else if(q->==request)
while(p)
{
if((p->==0)&&(p->==request))
{//有大小恰好合适的空闲块

内存分配算法实验代码

内存分配算法实验代码

内存分配算法实验代码好的,下面是一个简单的内存分配算法的示例代码,使用了最先适配(First Fit)算法来分配内存:```pythonclass MemoryAllocator:def __init__(self, memory_size):self.memory_size = memory_sizeself.memory_map = [0] * memory_sizedef allocate_memory(self, size):if size > self.memory_size:return -1for i in range(0, self.memory_size - size + 1):if self.memory_map[i] == 0:self.memory_map[i:i + size] = [1] * sizereturn ireturn -1def free_memory(self, address, size):if address < 0 or address + size > self.memory_size:return -1self.memory_map[address:address + size] = [0] * size# 示例用法memory_allocator = MemoryAllocator(1024)address = memory_allocator.allocate_memory(128)print("分配的内存地址:", address)memory_allocator.free_memory(address, 128)```在上述示例中,我们定义了一个 `MemoryAllocator` 类,它使用最先适配算法来管理内存分配。

类中的 `allocate_memory` 方法用于分配指定大小的内存,它会遍历内存映射数组,找到第一个连续的空闲区域,并将其分配给请求的内存。

内存分配实验代码

内存分配实验代码

内存分配实验代码1.引言1.1 概述概述部分的内容可以如下所示:引言部分是本篇文章的开端,它将介绍内存分配实验代码的背景和重要性。

主要目的是为读者提供一个对内存分配的概述,让他们了解本文的主题和目标。

在计算机科学领域,内存分配是一项重要的任务,它涉及将可用的计算机内存分配给正在运行的程序和进程使用。

合理的内存分配能够提高程序的性能和效率,同时也能够避免内存泄漏和内存碎片的问题。

本文将介绍内存分配的概念和原理,并讨论一些常见的内存分配算法。

读者将了解到内存分配是如何工作的,为什么需要进行内存分配,以及不同的内存分配算法在不同情况下的优缺点。

同时,本文还将提供一些实验代码和示例,帮助读者更好地理解和应用这些内存分配算法。

通过本文的学习,读者将能够掌握内存分配的基本原理和方法,了解常见的内存分配算法,并能够根据实际需求选择适合的内存分配策略。

本文的目标是帮助读者深入理解内存分配的重要性和实现方式,从而提高程序的性能和效率。

总结起来,本文将介绍内存分配的概念、原理和常见算法,并提供相应的实验代码和示例。

读者将通过学习本文,了解内存分配的工作原理和方法,并能够根据实际需求选择合适的内存分配策略,从而提高程序的性能和效率。

1.2 文章结构文章结构部分的内容应该包括对整篇文章的组织安排进行介绍。

它可以包括以下内容:文章结构部分(1.2):文章结构部分旨在提供对本文的整体组织结构进行说明。

本文将按照以下结构展开:第一部分是引言部分,包括概述、文章结构和目的。

在概述中,将简要介绍内存分配实验的背景和相关概念。

文章结构部分将说明本文的章节和主要内容的概述,以让读者对全文有一个整体的了解。

最后,目的部分将明确本文研究的目标和意义。

第二部分是正文部分,主要包括内存分配的概念和原理以及常见的内存分配算法。

在内存分配的概念和原理部分,将详细介绍内存分配的相关概念,如堆、栈和内存碎片等,并说明内存分配的基本原理及其重要性。

在常见的内存分配算法部分,将介绍几种常见的内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法等,讨论它们的原理、优缺点和适用场景。

内存分配实验代码 -回复

内存分配实验代码 -回复

内存分配实验代码-回复关于内存分配实验代码内存分配是计算机科学中非常重要的一个主题,它涉及到如何将计算机内存分配给不同的程序或进程,以及如何有效地利用计算机内存。

在本文中,我将以“内存分配实验代码”为主题,详细讨论内存分配的过程和实验代码的编写。

在计算机系统中,内存是一种非常宝贵的资源。

每个程序都需要一定的内存来存储其指令和数据。

当操作系统启动一个程序时,它需要为该程序分配一块内存空间,并维护一个内存分配表来跟踪每个程序的内存使用情况。

在实验中,我们可以通过编写一段模拟内存分配的代码来更好地理解和学习内存分配的过程。

以下是一个简单的示例代码,演示了如何分配和释放内存空间:include <stdio.h>include <stdlib.h>定义一个内存块的结构struct MemoryBlock {int size;int isAllocated;};初始化内存块void initialize(struct MemoryBlock* block, int size) {block->size = size;block->isAllocated = 0;}分配内存void* allocate(struct MemoryBlock* block, int requestedSize) { if (block->isAllocated block->size < requestedSize) { return NULL;}block->isAllocated = 1;return block;}释放内存void deallocate(struct MemoryBlock* block) {block->isAllocated = 0;}int main() {声明一个内存块struct MemoryBlock block;初始化内存块initialize(&block, 100);分配内存void* ptr = allocate(&block, 50);if (ptr == NULL) {printf("内存分配失败\n");} else {printf("内存分配成功\n");}释放内存deallocate(&block);return 0;}上述示例代码为C语言代码,使用了结构体来定义一个内存块的结构。

模拟内存分配

模拟内存分配

#include<iostream>using namespace std;//----------------------------void add_process();void destroy_process();void output_free();void output_busy();void backup();//----------------------------struct free_distribute{int num;int addr;int size;free_distribute *ahead,*next;};struct busy_distribute{int num;int addr;int size;busy_distribute *ahead,*next;};//----------------------------typedef struct free_distribute A;typedef struct busy_distribute B;A *FREE,*temp1;B *BUSY,*temp2,*tail;//----------------------------int main(){//设置初始空分区表,初始为1整块temp1 = (A*)malloc(sizeof(A));FREE = temp1;FREE->num = 1;FREE->addr = 0;FREE->ahead = NULL;FREE->next = NULL;FREE->size = 1000;BUSY = NULL;//===========while(1){int choice;cout<<"请选择操作: 1、加入新进程2、撤销进程"<<endl;cout<<" 3、查看空闲分区表4、查看已分配分区表"<<endl;cout<<" 5、退出"<<endl;cin>>choice;switch(choice){case 1:add_process();break;case 2:destroy_process();break;case 3:output_free();break;case 4:output_busy();break;case 5:return 0;break;default:break;}}return 0;}//--------------------------------void add_process(){temp2 = (B*)malloc(sizeof(B));//设置进程相干信息cout<<"请输出进程的名字:"<<endl;cin>>temp2->num;cout<<"请输出进程的大小:"<<endl;cin>>temp2->size;temp2->ahead = NULL;temp2->next = NULL;//申请内存temp1 = FREE;while(temp1 != NULL && temp1->size < temp2->size)temp1 = temp1->next;if(temp1 == NULL){cout<<"内存不足,申请失败"<<endl;return;}else{//找到并修改相关信息temp2->addr = temp1->addr;temp1->addr = temp1->addr + temp2->size;temp1->size = temp1->size - temp2->size;}//将新进程插入到已分配分区表的尾巴上if(BUSY == NULL){//第一个结点单独处理BUSY = temp2;tail = BUSY;}else{tail->next = temp2;temp2->ahead = tail;tail = tail->next;}}//--------------------------------void destroy_process(){temp2 = BUSY;int tt;//定位cout<<"请输出撤销的进程的名字:"<<endl;cin>>tt;while(temp2 != NULL && temp2->num != tt)temp2 = temp2->next;if(temp2 == NULL){cout<<"不存在该进程"<<endl;return;}//找到了,且是第一个结点if(temp2->ahead == NULL){BUSY = BUSY ->next;if(BUSY != NULL)BUSY->ahead = NULL;}else if(temp2->next == NULL) //最后一个{temp2->ahead->next = temp2->next;}else //在中间{temp2->ahead->next = temp2->next;temp2->next->ahead = temp2->ahead;} //归还内存backup();//撤销进程free(temp2);}void backup(){temp1 = FREE;int i = 0;//表示从temp1后的空闲分区的序号是该加还是该减以及数目bool mark = false;while(temp1 != NULL && temp1->addr <= temp2->addr){//前空分区后回收区if(temp1->size + temp1->addr == temp2->addr){i = 0;//还要检查是不是前空分区中回收区后空分区if(temp2 ->addr + temp2->size == temp1->next->addr )i = 1;if(i == 0)temp1 ->size = temp1->size + temp2->size;if(i == 1){A *q;q = temp1->next;//保村删除结点temp1 ->size = temp1->size + temp2->size + temp1->next->size;temp1->next = temp1->next->next;//if(temp1->next != NULL)temp1->next->ahead = temp1;free(q);//}mark = true;break;}//iftemp1 = temp1->next;}if(mark == false){temp1 = FREE;while(temp1 != NULL){if(temp1->addr == temp2->addr + temp2->size){temp1->addr = temp2->addr;temp1->size = temp1->size + temp2->size;mark = true;i = 0;break;}temp1 = temp1->next;}//while}//if//不是上面情况if(mark == false){A *p;p = (A*)malloc(sizeof(A));//设置临时变量,大小,地址等于temp2p->addr = temp2->addr;p->size = temp2->size;p->ahead = NULL;p->next = NULL;//插入新的分区.再头结点的情况,特殊处理temp1 = FREE;//再头结点的情况,特殊处理。

C语言内存分配器实现(malloc,free,realloc)

C语言内存分配器实现(malloc,free,realloc)

C语言内存分配器实现(malloc,free,realloc)#include <stdio.h>#include <unistd.h>/**原理:1.通过sbrk(int size) 使break指针前移来增加内存,brk()设置break指针来释放内存2.把分配的内存抽象为一个block3.block之间通过链表来管理4.分配时,sbrk(0) 获取block起始地址*//**需求1.内存以8字节对齐2.以经分配的内存块用链表来管理4.相邻的空闲块进行合并1.malloc 过程1.对齐size2.从空闲的链表中找到一个符合块(firt-fit算法)3.如果没有找到则使用sbrk重新分配一块内存*/#define BLOCK_HEAD_SIZE 24 //结构体除data外所占用的内存大小/*把block结构体定义为*/struct s_block{int size; //block 大小struct s_block *prev; //前驱struct s_block *next; //后继int free; //是否空闲void *ptr; //data喻指针,用来判断地址是否合法的int padding; //填充直接,保证结构体是以8字节对齐的char data[1]; //数据区域};typedef struct s_block *t_block;/*所有的block以链表的方式组织*/static t_block first_block=NULL;/*检测内存地址是否有效*/#define bool int#define true 1#define false 0t_block get_block(void *p){char *tmp = p;return p-BLOCK_HEAD_SIZE; //指向block块头部}bool valid_addr(void *p){//地址大于第一个block的首地址,小于break的地址break = sbrk(0)if((t_block)p <= first_block || p >= sbrk(0)){return false;}t_block tmp = get_block(p);if(tmp->ptr == p)return true;elsereturn false;}/*遍历查找一个合适的block*/t_block find_block(t_block *last,int size){t_block b = first_block;while(b && !(b->free && b->size >=size)){*last = b;b = b->next;}return b;}/*开辟的内存以8字节对齐(即结构体开始地址是8的整数倍)*/ int align(int size){if(size % 8 ==0) return size;return ((size >> 3) + 1) <<3;}/*开辟一个新的block*/t_block extend_heap(t_block last,int size){t_block b;int s = align(size); //size对齐8字节b = sbrk(0); //指向当前break处if(sbrk(BLOCK_HEAD_SIZE+s)== (void*)-1){return NULL;}b->size = s;b->next = NULL; //后驱指向NULLb->prev = last; //前驱指向为最后一个节点b->ptr = b->data; //保存当前块的data指针,用free时验证地址的有效性if(last)last->next = b; //设置last的后驱b->free = 0;return b;}/*分裂block,分裂是为了提高内存利用率,由于是采用了first-fit方法,所以可能小size也占用了一块大的block*/t_block split_block(t_block b,int size){t_block new;new = (t_block)(b->data + size); //新的block首地址为b->data偏移size个字节new->free = 1;new->size = b->size - size -BLOCK_HEAD_SIZE; //新block的大小为block->size-需要的size- block头部new->next = b->next; //相当于插入了一个新的blockb->size = size;b->next = new;return b;}#define MIN_BLOCK_SIZE (BLOCK_HEAD_SIZE +8) //BLOCK 块最小字节/*malloc的实现*/void *malloc(int size){t_block last,b;int s = align(size); //对齐8字节if(first_block){/*查找合适的block*/last = first_block ;b = find_block(&last,s);if(b){ //如果查找到看看能不能进行分裂以降低内存碎片block 最小为 BLOCK_HEAD_SIZE +8;if( (b->size -s) >= MIN_BLOCK_SIZE ){split_block(b,s); //分裂BLOCK_SIZE}b->free =0;}else{ //如果没有找到则,从堆中新开辟一个blockb = extend_heap(last,s);if(!b) return NULL;}}else{b = extend_heap(NULL,s);if(!b)return NULL;first_block = b;}return b->data;}/*分配连续n个size大小的联系内存空间,并对每个字节设置为0*/ void *calloc(int n,int size){t_block new;new = malloc(n*size);if(new){int *p = (int*)new->data;int i =0;int nbyte= new->size >> 2;for(i=0;i<nbyte;i++) //为已分配的每个字节置0p[i] = 0;}return new->data;}/*相邻两个空闲block,合并为一个新的block,提高内存的利用率*/t_block block_merge(t_block b){//如果next存在,并且空闲则合并if(b->next && b->next->free){b->size += BLOCK_HEAD_SIZE + b->next->size;b->next = b->next->next;if(b->next)b->next->prev = b;b->free =1;}return b;}/*free 函数实现*/void free(void *p){t_block b;if(valid_addr(p)){ //验证地址是否合法b = get_block(p);b->free =1;if(b->prev && b->prev->free){ //如果前驱是空闲block b = block_merge(b->prev);}if(b->next) //如果后续节点是空闲的blockblock_merge(b->next);else{//b是最后一个节点if(!b->prev)first_block = NULL;brk(b); //设置break指针}}}/*realloc的实现*/void copy_block(t_block src,t_block dest){int *p_src,*p_dest;p_src = src->ptr;p_dest = dest->ptr;if(dest->size < src->size)return ;int groups = src->size / sizeof(int);int i=0;for(i=0;i<groups;i++){p_dest[i] = p_src[i];}}void *realloc(void *p,int size){t_block b,new;void *newp;if(!p)return malloc(size);if(valid_addr(p)){int s = align(size);b = get_block(p);if(b->size >=s){if((b->size -s)>=MIN_BLOCK_SIZE){split_block(b,s); //分裂block}}else{//如果当前块与next块合并后能够满足size,则直接合并就好了if(b->next && b->next->free && (b->size+ BLOCK_HEAD_SIZE + b->next->size)>=s){b=block_merge(b);//如果合并后的剩余的空间能够再切分为一个block,则进行拆分if(b->size-s > MIN_BLOCK_SIZE)b = split_block(b,s);}else{newp = malloc(s);if(!newp)return NULL;new = get_block(newp);copy_block(b,new);free(p);return newp;}}}return NULL;}void print(){t_block tmp = first_block;int i=0;while(tmp){i++;printf("block=%d,free=%d,size=%d,value=%d\n",i,tmp->fre e,tmp->size,*((int*)tmp->data));tmp =tmp->next;}}int main(int argc,char **argv){int *p;int i=0;for(i=0;i<1000;i++){p=malloc(sizeof(int));*p=i;}free(p);print();return 0; }。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
cout.width(8);
cout<<occupys[i].tag<<endl; }
}
//最先适应分配算法
void earliest() {
//空闲分区按地址递增的顺序排列
char job_name[20];
int job_length;
int i,j,flag,t;
frees[i].start+=job_length;
frees[i].length-=job_length;
}
else //刚好分配则空闲分区数减一
{ for(j=i;j<free_quantity-1;j++){
frees[j]=frees[j+1]; }
free_quantity--;
#include<stdio.h>
#include<iostream.h>
#include<string.h>
#include<iomanip.h>
const int MAXJOB=100; //定义表最大记录数
typedef struct node{
int start; //空闲分区的起始地址
cout<<endl<<" 请输入新申请内存空间的作业名和空间大小:";
cin>>job_name; //输入作业的名称
cin>>job_length; //输入作业的长度
flag=0; //分配成功与否信号
for(i=0;i<free_quantity;i++){
strcpy(occupys[occupy_quantity].tag,job_name);
occupys[occupy_quantity].length=job_length;
occupy_quantity++;
if(frees[i].length>job_length)
{
frees[i].start+=job_length;
cout<<endl<<" 内存空间成功!"<<endl; }
}
}
//最优适应分配算法
void excellent() {
//空闲分区按大小递增的顺序排列
char job_name[20];
int job_length;
int i,j,flag,t;
cout<<endl<<" 请输入新申请内存空间的作业名和空间大小:";
for(i=0;i<occupy_quantity;i++){
if(!strcmp(occupys[i].tag,job_name)){
}
else{
t=0;
i=0;
while(t==0){
if(frees[i].length>=job_length){
t=1;
}
i++;
}
i--;
for(j=0;j<free_quantity;j++){
if((frees[j].length>=job_length)&&(frees[j].length<frees[i].length))
}
if(p!=i){
frees[free_quantity]=frees[i];
frees[i]=frees[p];
frees[p]=frees[free_quantity]; }
}
}
//显示函数
void view() {
int i;
cout<<endl<<"-------------------------------------------"<<endl;
frees[i].length-=job_length;
}
else
{
for(j=i;j<free_quantity-1;j++)
{
frees[j]=frees[j+1];
}
free_quantity--;
cout<<endl<<" 内存空间成功!"<<endl;
cout<<"起始地址 长度 占用作业名"<<endl;
for(i=0;i<occupy_quantity;i++) {
cout.setf(2);
cout.width(12);
cout<<occupys[i].start;
cout.width(10);
cout<<occupys[i].length;
i++;}
i--;
for(j=0;j<free_quantity;j++){
if((frees[j].length>=job_length)&&(frees[j].length>frees[i].length))
i=j;
}
occupys[occupy_quantity].start=frees[i].start;
}
}
}
//撤消作业
void finished() {
char job_name[20];
int i,j,flag,p=0;
int start;
int length;
cout<<endl<<" 请输入要撤消的作业名:";
cin>>job_name;
flag=-1;
cin>>job_name;
cin>>job_length;
flag=0;
for(i=0;i<free_quantity;i++){
if(frees[i].length>=job_length){
flag=1;
}
}
if(flag==0){
cout<<endl<<" Sorry,当前没有能满足你申请长度的空闲内存,请稍候再试!"<<endl;
int job_length;
int i,j,flag,t;
cout<<endl<<" 请输入新申请内存空间的作业名和空间大小:";
cin>>job_name;
cin>>job_length;
flag=0;
for(i=0;i<free_quantity;i++){
if(frees[i].length>=job_length)
for(i=0;i<free_quantity-1;i++){
p=i;
for(j=i+1;j<free_quantity;j++)//空闲分区按地址递增的顺序排列
{ if(frees[j].start<frees[p].start)
{ p=j; }
int length; //空闲分区的长度
char tag[20]; //分区信息是否已分配
}job;
job frees[MAXJOB]; //定义空闲区表
int free_quantity; //空闲区的个数
job occupys[MAXJOB];//定义已分配区表
int occupy_quantity; //已分配区的个数
//初始化函数
void initial() {
int i;
for(i=0;i<MAXJOB;i++){
frees[i].start=-1;
frees[i].length=0;
strcpy(frees[i].tag,"free");
char fname[20];
cout<<endl<<" 》 》 欢迎进入 主存储器空间的分配与回收模拟系统 《 《 "<<endl;
cout<<endl<<endl<<"请输入初始空闲表文件名:";
cin>>fname;
if((fp=fopen(fname,"r"))==NULL) //读文件
{ frees[j]=frees[j+1]; }
free_quantity--;
cout<<endl<<" 内存空间成功!"<<endl; }
}
}
//最坏适应算法
void worst() {
//空闲分区按大小递减的顺序排列
char job_name[20];
occupys[i].start=-1;
occupys[i].length=0;
strcpy(occupys[i].tag,""); }
相关文档
最新文档