欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    动态分区分配方式的模拟C语言代码和C++代码.docx

    • 资源ID:57981861       资源大小:14.80KB        全文页数:22页
    • 资源格式: DOCX        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    动态分区分配方式的模拟C语言代码和C++代码.docx

    实验三 使用动态分区分配方式的模拟1、实验目的了解动态分区分配方式中使用的数据构造与分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。2、实验内容(1) 用C语言分别实现采用首次适应算法与最正确适应算法的动态分区分配过程alloc( )与回收过程free( )。其中,空闲分区通过空闲分区链来管理:在进展内存分配时,系统优先使用空闲区低端的空间。(2) 假设初始状态下,可用的内存空间为640KB,并有以下的请求序列:作业1申请130KB。作业2申请60KB。作业3申请100KB。作业2释放60KB。作业4申请200KB。作业3释放100KB。作业1释放130KB。作业5申请140KB。作业6申请60KB。作业7申请50KB。作业6释放60KB。请分别采用首次适应算法与最正确适应算法,对内存块进展分配与回收,要求每次分配与回收后显示出空闲分区链的情况。程序代码C语言实现#include<stdio.h>#include<stdlib.h>struct node /空闲分区链结点的定义node *before;node *after;int size;int address;int state;node L;struct usenodeusenode *next;int num;int add;int size;U,*n;void Init() /空闲分区链的初始化node *p;p=(node *)malloc(sizeof(node);p->before=&L;p->after=NULL;p->size=640;p->address=0;p->state=0;L.after=p;L.before=NULL;L.size=0;U.next=NULL;n=&U;node *search(int a)node *p=L.after;if(p=NULL)printf("没有空闲的区域!");p=NULL;return p;elsewhile(p!=NULL && a>p->size)p=p->after;if(p=NULL)printf("没有找到适宜的空闲空间!");p=NULL;return p;else return p;void recovery(int a,int b) /内存回收算法node *c,*s,*r=L.after;node *d=L.after,*e;usenode *k=U.next,*h=&U; while(k!=NULL && a!=k->num)h=k;k=k->next;if(k=NULL)printf("没有找到这样的作业!");elseh->next=k->next;if(h->next=NULL)n=h;while(r!=NULL) /假设回收得到的空闲块的前方有空闲块合并此空闲块if(k->add=r->address+r->size)r->size=r->size+k->size;break;elser=r->after; if(r=NULL) /假设回收得到的空闲块的后面有空闲块合并此空闲块 r=L.after; while(r!=NULL)if(k->add+k->size=r->address)r->address=k->add;r->size=r->size+k->size;break;else r=r->after;while(d!=NULL) /保证空闲链表中没有相邻的空闲空间if(d->after!=NULL)e=d->after;elsebreak;if(d->address+d->size=e->address)d->after=e->after;while(e->after!=NULL)e->after->before=d;d->size=d->size+e->size;free(e);break;elsed=d->after;if(r=NULL) r=L.after; c=(node *)malloc(sizeof(node); c->size=b; c->address=k->add; if(L.after=NULL)c->after=L.after;c->before=&L;L.after=c; else r=L.after; while(r!=NULL) if(r->address>c->address) c->after=r; c->before=r->before; r->before->after=c; r->before=c; free(k); return; else r=r->after;free(k);void alloc(int a ,int b) /分配内存算法node *p,*q=L.after;usenode *m;p=search(b); if(p=NULL)return;m=(usenode *)malloc(sizeof(usenode);/生成一个被占用链表的结点,并插入到该链表的尾部m->add=p->address;m->size=b;m->num=a;m->next=n->next;n->next=m;n=m; /保证n始终指向被占用链表的尾部,方便以后新生成结点的插入 if(p->size>b) /如果申请空间的大小小于找到空闲空间的大小的处理p->size=p->size-b;p->address=p->address+b;else /如果申请空间的大小等于找到空闲空间的大小的处理 p->before->after=p->after;if(p->after!=NULL) p->after->before=p->before;free(p);void sort() /对空闲链表进展排序int max; node *p,*q,*r,*s;node a;p=L.after;while(p!=NULL) /让指针q指向链表的最后一个结点q=p;p=p->after;if(L.after->after=NULL) return;else while(p!=q) s=r=p=L.after; max=r->size; while(s!=q->after) if(s->size>max) max=s->size; r=s; s=s->after; else s=s->after; a.size=q->size; a.address=q->address; q->size=r->size; q->address=r->address; r->size=a.size; r->address=a.address;if(q->before->before=&L)return;else q=q->before;void Print()node *p=L.after;usenode *q=U.next;int i=1;printf("n空闲区域列表:n");printf("FREEID address sizen");while(p!=NULL)printf("%-10d",i);printf("%-10d",p->address);printf("%dn",p->size);p=p->after;i+;if(q=NULL)return;elseprintf("n已分配区域列表:n");printf("WORKID address sizen");while(q!=NULL)printf("%-10d",q->num);printf("%-10d",q->add);printf("%dn",q->size);q=q->next;void firstfit() /首次适应算法int a,b,i;Init();Print();while(1)printf("n1、申请空间n"); printf("2、释放空间n"); printf("3、退出首次适应算法n"); printf("请输入你的选择:"); scanf("%d",&i); switch(i) case 1: printf("请输入申请空间的作业号:"); scanf("%d",&a); printf("请输入申请空间的大小:"); scanf("%d",&b); alloc(a,b); Print(); break; case 2: printf("请输入释放空间的作业号:"); scanf("%d",&a); printf("请输入释放空间的大小:"); scanf("%d",&b); recovery(a,b); Print(); break; case 3:printf("n");return;void bestfit()int a,b,i;Init();Print();while(1)printf("n1、申请空间n"); printf("2、释放空间n"); printf("3、退出最正确适应算法n"); printf("请输入你的选择:"); scanf("%d",&i); switch(i) case 1: printf("请输入申请空间的作业号:"); scanf("%d",&a); printf("请输入申请空间的大小:"); scanf("%d",&b); alloc(a,b); sort(); Print(); break; case 2: printf("请输入释放空间的作业号:"); scanf("%d",&a); printf("请输入释放空间的大小:"); scanf("%d",&b); recovery(a,b); sort(); Print(); break; case 3:printf("n");return;void main() int i; while(1) printf("1、首次适应算法n"); printf("2、最正确适应算法n"); printf("3、退出n"); printf("请输入你的选择:"); scanf("%d",&i); switch(i) case 1:firstfit();break; case 2:bestfit();break; case 3:return;运行结果 开场界面 首次适应算法 最正确适应算法程序代码C+语言实现/*             动态分区分配方式的模拟          *#include<iostream.h>#include<stdlib.h>#define Free 0 /空闲状态#define Busy 1 /已用状态#define OK 1    /完成#define ERROR 0 /出错#define MAX_length 640 /最大内存空间为640KBtypedef int Status;typedef struct freearea/定义一个空闲区说明表构造    int ID;   /分区号    long size;   /分区大小    long address; /分区地址    int state;   /状态ElemType;/-  线性表的双向链表存储构造  -typedef struct DuLNode /double linked list    ElemType data;    struct DuLNode *prior; /前趋指针    struct DuLNode *next;  /后继指针DuLNode,*DuLinkList;DuLinkList block_first; /头结点DuLinkList block_last;  /尾结点Status alloc(int);/内存分配Status free(int); /内存回收Status First_fit(int,int);/首次适应算法Status Best_fit(int,int); /最正确适应算法void show();/查看分配Status Initblock();/开创空间表Status Initblock()/开创带头结点的内存空间链表    block_first=(DuLinkList)malloc(sizeof(DuLNode);    block_last=(DuLinkList)malloc(sizeof(DuLNode);    block_first->prior=NULL;    block_first->next=block_last;    block_last->prior=block_first;    block_last->next=NULL;    block_last->data.address=0;    block_last->data.size=MAX_length;    block_last->data.ID=0;    block_last->data.state=Free;    return OK;/- 分 配 主 存 -Status alloc(int ch)    int ID,request;    cout<<"请输入作业(分区号):"    cin>>ID;    cout<<"请输入需要分配的主存大小(单位:KB):"    cin>>request;    if(request<0 |request=0)        cout<<"分配大小不适宜,请重试!"<<endl;        return ERROR;    if(ch=2) /选择最正确适应算法        if(Best_fit(ID,request)=OK) cout<<"分配成功!"<<endl;        else cout<<"内存缺乏,分配失败!"<<endl;        return OK;    else /默认首次适应算法        if(First_fit(ID,request)=OK) cout<<"分配成功!"<<endl;        else cout<<"内存缺乏,分配失败!"<<endl;        return OK;/- 首次适应算法 -Status First_fit(int ID,int request)/传入作业名及申请量    /为申请作业开辟新空间且初始化    DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode);    temp->data.ID=ID;    temp->data.size=request;    temp->data.state=Busy;    DuLNode *p=block_first->next;    while(p)        if(p->data.state=Free && p->data.size=request)        /有大小恰好适宜的空闲块            p->data.state=Busy;            p->data.ID=ID;            return OK;            break;        if(p->data.state=Free && p->data.size>request)        /有空闲块能满足需求且有剩余"            temp->prior=p->prior;            temp->next=p;                 temp->data.address=p->data.address;            p->prior->next=temp;            p->prior=temp;            p->data.address=temp->data.address+temp->data.size;            p->data.size-=request;            return OK;            break;        p=p->next;    return ERROR;/-  最正确适应算法  -Status Best_fit(int ID,int request)    int ch; /记录最小剩余空间    DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode);    temp->data.ID=ID;    temp->data.size=request;    temp->data.state=Busy;    DuLNode *p=block_first->next;    DuLNode *q=NULL; /记录最正确插入位置    while(p) /初始化最小空间与最正确位置        if(p->data.state=Free &&            (p->data.size>request | p->data.size=request) )            q=p;            ch=p->data.size-request;            break;        p=p->next;    while(p)        if(p->data.state=Free && p->data.size=request)        /空闲块大小恰好适宜            p->data.ID=ID;            p->data.state=Busy;            return OK;            break;        if(p->data.state=Free && p->data.size>request)        /空闲块大于分配需求            if(p->data.size-request<ch)/剩余空间比初值还小                ch=p->data.size-request;/更新剩余最小值                q=p;/更新最正确位置指向        p=p->next;    if(q=NULL) return ERROR;/没有找到空闲块    else    /找到了最正确位置并实现分配        temp->prior=q->prior;        temp->next=q;        temp->data.address=q->data.address;        q->prior->next=temp;        q->prior=temp;        q->data.address+=request;        q->data.size=ch;        return OK;/-   主 存 回 收   -Status free(int ID)    DuLNode *p=block_first;    while(p)        if(p->data.ID=ID)            p->data.state=Free;            p->data.ID=Free;            if(p->prior->data.state=Free)/及前面的空闲块相连                p->prior->data.size+=p->data.size;                p->prior->next=p->next;                p->next->prior=p->prior;            if(p->next->data.state=Free)/及后面的空闲块相连                p->data.size+=p->next->data.size;                p->next->next->prior=p;                p->next=p->next->next;                             break;         p=p->next;    return OK;/-  显示主存分配情况 -void show()    cout<<"+n"    cout<<"+        主 存 分 配 情 况        +n"    cout<<"+n"    DuLNode *p=block_first->next;    while(p)        cout<<"分 区 号:"        if(p->data.ID=Free) cout<<"Free"<<endl;        else cout<<p->data.ID<<endl;        cout<<"起始地址:"<<p->data.address<<endl;        cout<<"分区大小:"<<p->data.size<<" KB"<<endl;        cout<<"状    态:"        if(p->data.state=Free) cout<<"空  闲"<<endl;        else cout<<"已分配"<<endl;        cout<<""<<endl;        p=p->next;/- 主  函  数-void main()    int ch;/算法选择标记    cout<<"       动态分区分配方式的模拟       n"    cout<<"*n"    cout<<"* 1)首次适应算法  2)最正确适应算法 *n"    cout<<"*n"    cout<<"请选择分配算法:"    cin>>ch;    Initblock(); /开创空间表    int choice;  /操作选择标记    while(1)       cout<<"*n"        cout<<"*    1: 分配内存        2: 回收内存     *n"        cout<<"*    3: 查看分配        0: 退    出     *n"       cout<<"*n"        cout<<"请输入您的操作 :"        cin>>choice;        if(choice=1) alloc(ch); / 分配内存                   else if(choice=2)  / 内存回收            int ID;            cout<<"请输入您要释放的分区号:"            cin>>ID;            free(ID);        else if(choice=3) show();/显示主存        else if(choice=0) break; /退出        else /输入操作有误            cout<<"输入有误,请重试!"<<endl;            continue;第 22 页

    注意事项

    本文(动态分区分配方式的模拟C语言代码和C++代码.docx)为本站会员(美****子)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开