操作系统实验五(内存管理之动态分区分配(首次适应))
#include<stdio.h> #include<stdlib.h> #include <iostream> #include <bits/stdc++.h> using namespace std; int SIZE=0; struct linkk//内存空闲分区 { int size;//内存块的大小 int addr;//起始地址 struct linkk *next; }; struct jobtab//作业分区 { int jno;//作业的编号 int size;//作业的大小 int addr;//作业的起始地址 int flag; }; struct linkk *head,*p,*q; struct jobtab tab[20]; void printlink() { int i; if(head!=NULL) { printf("\n 分区号 分区地址 分区大小\n"); printf("========================\n"); } q=head; i=1; while(q!=NULL) { printf(" %d\t %d\t %d\t\n",i,q->addr,q->size); q=q->next; i++; } printf("===============================\n"); return; } void printtab() { int i,flag; flag=0; for(i=0;i<20&&flag==0;i++) if(tab[i].flag==1) flag=1; if(flag==0) { printf("\n no job"); return; } printf("\n 作业号 作业地址 作业长度\n"); printf("\n===========================\n"); for(i=0;i<20;i++) if(tab[i].flag==1) printf(" %d\t %d\t %d\n",i,tab[i].addr,tab[i].size); printf("\n=================================\n"); return; } void allocm() { int n,l; struct linkk *p1; printf("\n Input job n(0<=n<20):");//输入第n个作业 scanf("%d",&n); printf("\nInput joblength:"); scanf("%d",&l);//输入第n个作业的长度 if(tab[n].flag==1) { printf("\n The job has create!\n");//tab[n].flag==1说明作业已被创建;否则创建作业 return; } else { tab[n].flag=1; //置创建标志位和作业大小 tab[n].size=l; q=head;p=head; } while(q!=NULL)//注意理解 { if(q->size==l) { tab[n].addr=q->addr; p1=q; if(p1==head) head=q->next;//释放第一个分区块 else p->next=q->next; free(p1); SIZE=0; return; } if(q->size>l) { tab[n].addr=q->addr; q->size=q->size-l; q->addr=q->addr+l; SIZE-=l; cout<<SIZE<<endl; return; } p=q;q=q->next; } tab[n].flag=0; printf("\n no memory!!\n"); return; } void freem() { /*完成回收代码,学生编写*/ int n; printf("\n Input job n(0<=n<20):");//输入需要回收的作业编号 scanf("%d",&n); int addr=tab[n].addr;//获得需要释放内存的起始地址; int size=tab[n].size;//获得需要释放内存的大小; tab[n].flag=0; struct linkk *te;//设置一个节点 te=(struct linkk *)malloc(sizeof(struct linkk)); q=head; te->addr=addr; te->size=size; if(SIZE<=0){ //考虑一下内存分配完之后回收的情况。 te->next=NULL; q=te; head=q; SIZE+=te->size; }else{ if((te->addr+te->size==q->addr)||(te->addr-te->size==q->addr)){ //此时代表区间地址相连 if(te->addr+te->size==q->addr){ //后相连 q->addr=te->addr; q->size+=te->size; }else if(te->addr-te->size==q->addr){ //前相连 q->size+=te->size; } }else{//此时代表释放的空间不相连 if(te->addr<q->addr){ //如果新节点的地址小于已经存在的,那么插在前面 te->next=q; q=te; }else{ //否则插在后面 te->next=NULL; q->next=te; } head=q; } } } int main() { int i,m,t,n; head=(struct linkk *)malloc(sizeof(struct linkk)); head->addr=0;//初始化地址为0 head->next=NULL; printf("\n Input memory size:"); scanf("%d",&n);//输入内存的长度 head->size=n; SIZE=n; for(i=0;i<20;i++){//初始化作业的编号和状态,0代表为完成作业 tab[n].jno=i; tab[n].flag=0; } t=0; do{ printf("\n=================================================\n"); printf("\t1--alloc memory 2--free memory\n"); printf("\t3--print_LINK 4--print_TAB\n"); printf("\t5--Quit\n"); printf("==================================================\n"); printf(" Select[]\\b\b"); scanf("%d",&m); switch(m){ case 1:allocm() ;break; case 2:freem();break; case 3:printlink();break; case 4:printtab();break; case 5: t=1; } } while(!t); return 0; }
一纸高中万里风,寒窗读破华堂空。
莫道长安花看尽,由来枝叶几相同?