zoukankan      html  css  js  c++  java
  • 操作系统实验四(内存管理之固定分区分配)

    /*
    实验四-内存管理之固定分区分配
    算法思想:
      预先将内存空间划分成若干个空闲分区,
      分配过程根据用户需求将某一个满足条件的分区直接分配
      (不进行分割),作业完成后回收对应内存。
      整个分配过程分区大小和个数不发生变化。 
    */ 
    #include <bits/stdc++.h>
    #include <iostream>
    #include <stdio.h>
    using namespace std;
    #define getpch(type) (type*)malloc(sizeof(type))
    int SIZE;//内存的大小
    struct node//内存分区使用说明表
    {
       int id;//内存块的id;
       int size;//内存块的大小
       int begin_adress;//内存块的起始地址
       char status;////F-已分配,T-未分配
       struct node *next;
    }*p,*ready=NULL;
    typedef struct node SIF;
    void InitMemory();//初始化固定内存的设置
    void showinfo();//打印分配的情况 
    void recover();//作业完成后回收资源
    void allocation();//给作业分配空间
    int allocate(int size);//分配内存,返回0代表分配成功
    int main()
    {
        int command;
        InitMemory();//初始化内存说明表
        printf("
     请输入命令,给作业分配资源输入1,释放资源输入2,退出请输入任意键:
    ");
        scanf("%d",&command);
        while(1){
           if(command==1)
              allocation();
           else if(command==2)
              recover();
           else
              break;
            printf("
     请继续输入命令 
    ");
            scanf("%d",&command);
        }
        return 0;
    }
    void showinfo()//打印内存分配情况
    {
        printf("
     当前内存分配情况如下:
    ");
        printf("
    ===id===size===begin_adress===status 
    ");
        p=ready;
        while(p!=NULL)
        {
            printf("
        %d      %d      %d            %c
    ",p->id,p->size,p->begin_adress,p->status);
            p=p->next;
        }
    }
    void InitMemory()//初始化内存表 
    {
        int num,i,j,d=0,id=0;
        SIF *last=ready;
        printf("
     请输入现有内存的大小:  (起始地址从0开始) 
    ");
        scanf("%d",&SIZE);
        //初始化内存信息
        printf("
     请输入固定分区内存块的个数: ");
        scanf("%d",&num);
        for(i=0; i<num; i++)
        {
            int n;
            printf("
     请输入内存块%d的大小(KB):",i);
            scanf("%d",&n);
            for(j=0; j<n; j++)
            {
                p=getpch(SIF);//#define getpch(type) (type*)malloc(sizeof(type)) 
                p->id=id++;
                p->size=(int)(pow(2,4+i));//size是按照2的指数递增的
                p->begin_adress=d;
                if(p->status==NULL)//是否被分配初始化
                    p->status='T';
                else
                    p->status='F';
                p->next=NULL;
                d+=p->size;
                if(d>=SIZE)
                {
                  printf("
     已超出系统总内存量,%d号分配失败 
    ",p->id);
                  break;
                }
                if(ready==NULL)
                {
                    ready=p;
                    last=ready;
                }
                else
                {
                    last->next=p;
                    last=last->next;
                }
            }
        }
        showinfo(); 
    }
    void allocation()//给作业分配空间 
    {
        int num1;
        int i,s;
        //给作业分配内存空间
        printf("
     请输入待分配内存的作业个数:");
        scanf("%d",&num1);
        for(i=0; i<num1; i++){
           printf("
     请输入第%d个作业的大小: ",i);
           scanf("%d",&s);
           if(allocate(s)==1){
              printf("
     已为该作业分配内存空间
    ");
              printf("
     存储该作业内存空间的详细信息如下:
    ");
              printf("
     内存块号:%d, 内存大小:%d 
    ",p->id,p->size);
           }
           else
               printf("
     未能该该作业分配内存 
    ");
       }
       showinfo();
    }
    void recover()//作业完成后回收资源
    {
         int i,k,num;
         printf("
     请输入需要释放的作业个数: ");
         scanf("%d",&num);
         for(i=0; i<num; i++){
            printf("
     请输入存储该作业的内存分区说明表的ID 
    ");
            scanf("%d",&k);
            p=ready;
            while(p!=NULL){
                if(p->id==k){
                    p->status='T';
                    printf("
     已释放该作业所占用的资源 
    ");
                    break;
                }
                p=p->next;
            }
        }
        showinfo();//完成作业后回收内存空间 
    }
    int allocate(int size)//分配内存,返回0代表分配成功
    {
        p=ready;
        while(p!=NULL)
        {
            if((p->status=='T')&&(p->size>=size))
            {
                p->status='F';
                return 1;
            }
            p=p->next;
        }
        return 0;
    }

    一纸高中万里风,寒窗读破华堂空。 莫道长安花看尽,由来枝叶几相同?
  • 相关阅读:
    关于selenium无法在chrome中自动播放flash的问题
    网鼎杯题目“phone”--十六进制mysql注入
    (转)宽字节编码类型的XSS
    为什么在留言处插入<script>alert(1)</script>不弹框
    同源策略和跨域的理解
    (转)调皮的location.href
    (转)GET来的漏洞
    WEB应用安全设计思想.pdf
    Browser Security-超文本标记语言(HTML)
    大家来聊聊如何PASS 360
  • 原文地址:https://www.cnblogs.com/byczyz/p/12760326.html
Copyright © 2011-2022 走看看