• 存储器管理


    实验目的:

     

    本实验的目的是,使学生熟悉存储器管理系统的设计方法,加深对所学各种存储器管理方案的了解。

    实验要求:

    要求能独立地编写一个常用的存储分配算法,并能设计一个存储管理的模拟系统并调试运行。

    对存储算法进行分析比较,评测其性能优劣,加深理解。

     

    实验内容:

    采用固定分区、最佳适应BF算法或首次适应算法,编写存储器管理模拟系统。

    可用任何一种高级语言编写。

    基本要求: (1)掌握动态内存分配过程alloc()和回收过程free();(2)在给定初始状态下,采用一种算法进行内存块的分配和回收,要求每次分配和回收后显示空闲内存分区的情况。

    注:算法可任选、数据结构可任选。

    #include<stdio.h>
    #include<stdlib.h>
    typedef struct freearea{
    int address;
    int size;
    struct freearea *front;
    struct freearea *next;
    }*FreeLink,FreeNode;
    typedef struct Mat{
    int address;
    int size;
    struct Mat *front;
    struct Mat *next;
    }*MatLink,Matnode;
    MatLink mat,Mathead,Matend;
    FreeLink freelink,freehead,freeend;
    int total;
    int jobcount=0;


    void insert();
    void deletejob();
    void shuchu1();
    void shuchu2();
    void initfreearea(){
    freelink=(FreeLink)malloc(sizeof(FreeNode));

    freelink->address=2000;
    freelink->size=5000;
    total=freelink->size;
    freelink->front=NULL;
    freelink->next=NULL;
    freehead=freelink;
    freeend=freelink;
    }

    void founction(){
    printf(" 1.插入作业 2.删除作业 3.查看作业 4.查看空闲内存 ");
    int n;
    printf("请输入(1-4): ");
    scanf("%d",&n);
    if(n<1||n>4){
    printf("请重新输入(1-4): ");
    scanf("%d",&n);
    }
    switch(n){
    case 1 :insert();break;
    case 2 :deletejob();break;
    case 3 :shuchu2();break;
    case 4 :shuchu1();break;
    }
    }
    void insert(){
    int n;
    MatLink p;
    FreeLink fh,fn,h;

    h=freehead;



    printf("请输入分配内存的大小: ");
    scanf("%d",&n);
    if(n>total){
    printf("内存只剩下%d,请输入分配内存的大小: ",total);
    scanf("%d",&n);
    }

    if(jobcount==0){
    Mathead=(MatLink)malloc(sizeof(Matnode));
    while(h!=NULL){

    if(freehead->size>=n){

    Mathead->address=freehead->address;
    printf(" -----------%d ",freehead->address);
    freehead->address=freehead->address+n;
    freehead->size=freehead->size-n;
    if(freehead->size==0){
    h=h->next;
    freehead=h;
    }
    break;
    }else if(freeend->size>=n&&freeend->front->size<n){
    Mathead->address=freeend->address;
    freeend->address=freeend->address+n;
    freeend->size=freeend->address-n;
    if(freeend->size==0){
    freeend=freeend->front;
    }
    break;
    }else{
    while(h!=freeend){
    if(h->size<=n&&h->next->size>n){

    Mathead->address=h->address;
    h->address=h->address+n;
    h->size=h->size-n;
    if(h->size==0){
    fn=h->next;
    fh=h->front;
    fh->next=fn;
    fn->front=fh;
    }
    break;
    }else{
    h=h->next;
    }
    }
    }


    }

    Mathead->size=n;
    Mathead->front=NULL;
    Mathead->next=NULL;
    Matend=Mathead;
    jobcount++;
    total=total-n;


    }else{
    p=(MatLink)malloc(sizeof(Matnode));
    printf(" -----------%d--%d ",freehead->size,n);
    while(h!=NULL){
    if(freehead->size>=n){
    printf(" ---1-------- ");
    p->address=freehead->address;
    freehead->address=freehead->address+n;
    freehead->size=freehead->size-n;
    if(freehead->size==0){
    h=h->next;
    freehead=h;
    }
    break;
    }else if(freeend->size>=n&&freeend->front->size<n){
    p->address=freeend->address;
    freeend->address=freeend->address+n;
    freeend->size=freeend->address-n;
    if(freeend->size==0){
    freeend=freeend->front;}
    break;
    }else{
    while(h!=freeend){
    if(h->size<=n&&h->next->size>n){

    p->address=h->address;
    h->address=h->address+n;
    h->size=h->size-n;
    if(h->size==0){
    fn=h->next;
    fh=h->front;
    fh->next=fn;
    fn->front=fh;
    }
    break;
    }else{
    h=h->next;
    }
    }
    }


    }
    p->size=n;
    p->front=Matend;
    Matend->next=p;
    p->next=NULL;
    Matend=p;

    jobcount++;


    total=total-n;
    }
    shuchu1();
    shuchu2();
    }
    void shuchu1(){
    FreeLink p;
    p=freehead;
    while(p!=NULL)
    {
    printf("空闲内存首地址:%d 空闲内存大小:%d ",p->address,p->size);
    p=p->next;
    }

    }
    void shuchu2(){
    MatLink p;
    p=Mathead;
    while(p!=NULL)
    {
    printf("内存首地址:%d 内存大小:%d ",p->address,p->size);
    p=p->next;
    }
    }
    void deletejob(){
    int n,i;
    MatLink p,q,t,z;
    FreeLink h,f,y;
    p=Mathead;
    printf("请输入删除作业的编号(0-%d): ",jobcount-1);
    scanf("%d",&n);
    if(n>jobcount||n<0){
    printf("内存无此作业 ");
    printf("请重新输入删除作业的编号(0-%d): ",jobcount-1);
    scanf("%d",&n);
    }
    if(jobcount==1){
    t=Mathead;
    Mathead=NULL;
    }else{
    if(n==0){
    t=Mathead;
    p=p->next;
    p->front=NULL;

    Mathead=p;
    }else if(n==jobcount-1){
    t=Matend;
    q=Matend->front;
    q->next=NULL;
    Matend=p;
    }else{
    for(i=0;i<jobcount-1;i++){
    if(i==n){

    z=p->next;
    q=p->front;
    q->next=z;
    z->front=q;

    t=p;

    break;
    }else{
    p=p->next;
    }
    }
    }

    }//*

    jobcount-=1;
    total=total+t->size;
    h=freehead;
    f=(FreeLink)malloc(sizeof(FreeNode));
    f->address=t->address;
    f->size=t->size;
    printf(" --1---%d %d ",t->address,t->size);
    if(f->address<freehead->address){
    freehead->front=f;
    f->next=freehead;
    f->front=NULL;
    freehead=f;
    printf(" ---...-- ");

    }else if(f->address>freeend->address){
    freeend->next=f;
    f->front=freeend;
    f->next=NULL;
    freeend=f;

    }else{
    while(h!=freeend){
    if(f->address>h->address&&f->address<h->next->address){
    y=h->next;
    h->next=f;
    f->front=h;
    y->front=f;
    f->next=y;

    break;
    }else{

    h=h->next;

    }

    }
    }

    shuchu1();
    shuchu2();
    }
    int main(){
    initfreearea();
    while(1){
    founction();
    }



    return 0;
    }

  • 相关阅读:
    springboot中filter的配置和顺序执行
    springboot整合fastdfs实现上传和下载
    移动端通过fiddler代理调试PC端代码
    react-native windows 环境搭建
    带你逐行阅读redux源码
    前端单页面拆分多个单页面
    Koa2学习(九)与mongoDB交互
    Koa2学习(八)使用session
    Koa2学习(七)使用cookie
    Koa2学习(六)使用koa-router
  • 原文地址:https://www.cnblogs.com/huifeidezhuzai/p/9278983.html
Copyright © 2020-2023  润新知