内存的分配

实验四主存空间的分配和回收

1.    目的和要求

1.1.           实验目的

用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解。

1.2.           实验要求

采用连续分配方式之动态分区分配存储管理,使用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法4种算法完成设计。

(1)**设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。

(2)或在程序运行过程,由用户指定申请与释放。

(3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。

把空闲区说明表的变化情况以及各作业的申请、释放情况显示。

2.    实验内容

根据指定的实验课题,完成设计、编码和调试工作,完成实验报告

3.    实验环境

可以选用Visual C++作为开发环境。也可以选用Windows下的VB,CB或其他可视化环境,利用各种控件较为方便。自主选择实验环境。

3.    实验原理及核心算法参考程序段

#include<stdio.h>
#include<conio.h>
#include<string.h>
#define MAX 24
#include<conio.h>

  #define Memory 1024
  struct partition{

     char pn[10];
      int begin;
     int size;
    int end;   ////////
     char status;  //////////内存状态
     };
 typedef struct partition PART;
 void Freesize();
 void nicefit();
 void restart();

 void firstfit();
 PART Free[MAX],User[MAX],addresses[MAX],t;//t是用于排序最优算法的变量
 int nFree;//空闲内存的数量
    int  nUsed;//使用的数量
     int naddresses;//地址数量

 void restart()//初始化
 {int j=0;

     nFree=0,nUsed=0,naddresses=0;

     strcpy(User[0].pn,"SYSTEM");

     User[0].begin=0;
     User[0].size=50;

nUsed++;

    printf("初始化,设内存总容量为1024k\n");
    printf("系统从低地址部分开始使用,占用50k\n\n已初始化");

    strcpy(Free[0].pn,"----");
     Free[0].begin=0;//开始系统占用50K
     Free[0].size=50;
     Free[0].status=‘n‘;//n表示再用

     nFree=4;
    naddresses++;
Free[1].size=40;
Free[1].status=‘f‘;
    Free[2].size=50;
Free[2].status=‘f‘;

Free[3].size=120;
Free[3].status=‘f‘;

Free[4].size=70;
Free[4].status=‘f‘;
Freesize();

 }
void Freesize(){
for(int j=1;j<nFree+1;j++)
{
    Free[j].begin=Free[j-1].begin+Free[j-1].size;

}
} 

void PT()//打印
{
    int i;
    printf("空闲区表Free\n");
    printf("\t\t\tNo.\tproname\tbegin\tsize\tstatus\n");
    for(i=0;i<=nFree;i++)
        printf("\t\t\tNo.%d\t%s\t%d\t%d\t%c\n",i,Free[i].pn,Free[i].begin,Free[i].size,Free[i].status);

    printf("已分配分区表Used\n");
    printf("\t\t\tNo.\tproname\tbegin\tsize\tstatus\n");
    for(i=0;i<=nUsed+1;i++)
        printf("\t\t\tNo.%d\t%s\t%d\t%d\t%c\n",i,User[i].pn,User[i].begin,User[i].size,User[i].status);

    printf("内存使用情况,:\n");
    printf("\t\t\tNo.\tproname\tbegin\tsize\tstatus\n");
    for(i=0;i<=naddresses;i++)
        printf("\t\t\tNo.%d\t%s\t%d\t%d\t%c\n",i,addresses[i].pn,addresses[i].begin,addresses[i].size,addresses[i].status);
}

void nicefit()
{int i=1;int j=0;int a=i;int num;int flag;
printf("插入几个进程\n");
scanf("%d",&num);
    for(i=1;i<num+1;i++){

    printf("名字为\n");
    scanf("%s",&User[i].pn);
printf("大小\n");
getchar();
scanf("%d",&User[i].size);

    }//输入进程

    //排序

  for(i=1;i<24;i++)
  {
    flag=0;
    for(j=1;j<24-i;j++)
    {
      if(Free[j].size>Free[j+1].size)    //将空间少交换到前边
      {
        t=Free[j];
        Free[j]=Free[j+1];
        Free[j+1]=t;
        flag=1;//交换
      }
    }
    if(flag==0)//如果一趟排序中没发生任何交换,则排序结束
    {
      break;
    }
  }
for(i=1;i<num+1;i++){
    for(j=1;j<24;j++)
    {
    if(User[i].size<Free[j].size && Free[j].status==‘f‘)
    {
    Free[j].size=Free[j].size-User[i].size;
    Freesize();
    User[i].begin=Free[j].begin;

    Free[j].status=‘n‘;break;
    }
    }
    }             

    PT(); }
void firstfit()
{int i=1;int j=0;int a=i;int num;
printf("插入几个进程\n");
scanf("%d",&num);
    for(i=1;i<num+1;i++){

    printf("名字为\n");
    scanf("%s",&User[i].pn);
printf("大小\n");
getchar();
scanf("%d",&User[i].size);

    }//输入进程
for(i=1;i<num+1;i++){
    for(j=1;j<24;j++)
    {
    if(User[i].size<Free[j].size)
    {
    Free[j].size=Free[j].size-User[i].size;
    Freesize();
    User[i].begin=Free[j].begin;

    Free[j].status=‘n‘;break;
    }
    }
    }             

    PT();
    }

     main(){
     int choice;
     restart();
     PT();

     printf("---------------------请选择算法----------------\n");
     printf("-----------------1.最先适应算法------------------------\n");
      printf("-----------------2.最优适应算法------------------------\n");
scanf("%d",&choice);
switch(choice)
{

     case 1: firstfit();break;
     case 2: nicefit();break;
     default:return;
}
     }
时间: 2024-08-01 17:43:10

内存的分配的相关文章

内存的分配方式

一.内存的分配方式 程序占用的内存分为五个区域: 1.静态区/全局区(static)存放静态变量.全局变量,内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间始终不变.2.栈区(stack)存放函数的参数值.局部变量的值等,由编译器自动分配释放.管理简单,空间使用效率高,但是生命周期很短暂,分配的内存容量有限.用来存储函数的参数和非静态局部变量.3.堆区(heap)也叫动态内存分配.程序在运行的时候new申请任意大小的内存,一般由程序员分配释放,如果程序员没有释放掉,程序会一直占用内

内存的分配与回收

实验三  内存的分配与回收 物联网工程                      赖燕菲                   201306104147 一.实验目的 为了合理地分配和使用这些存储空间,当用户提出申请主存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间和使用情况,找出足够的空闲区域给申请者.当作业撤离归还主存资源时,则存储管理要收回占用的主存空间.主存的分配和回收的实现是与主存储器的管理方式有关的,通过本实验帮助我们理解在不同的存储管理方式下应怎样实现主存空间的分

(转)Java 内存区域分配和垃圾回收(GC)机制

Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代 码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢.这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制.概括地说,该机制对 JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver Stop

早期malloc分配时,如果内存耗尽分配不出来,会直接返回NULL。现在分配不出来,直接抛出异常(可使用nothrow关键字)

今天和同事review代码时,发现这样的一段代码: Manager * pManager = new Manager(); if(NULL == pManager) { //记录日志 return false; } 然后,一个同事就说这样写欠妥,应该改为: Manager * pManager = NULL; try { pManager = new Manager(); } catch(std::bad_alloc e) { //... } 我查了一下资料,发现: 1.malloc分配时,如果

.net字符串内存的分配

几次面试中遇到都有类似的问题,就是 string str = "aa" + "bb" + "ccc";进行了几次内存分配? 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 string str = "aa" + "bb" + "ccc"; 6 Console.WriteLine(str); 7 } 8 } 我们知道由

JVM实例以及内存的分配机制

JVM:一台用来模拟计算机执行计算指令的虚拟计算机,拥有自己的指令,指令执行环境,虚拟内存等. 下面介绍虚拟机(JVM)--cpu,寄存器,内存,指令 ====================================================================================================== 1.创建JVM装载环境和配置(GetApplicationHome取得Java.exe进程的路径,chshi) 2.装载JVM.dll 3.初

c和C++在编译是内存的分配情况

在静态存储区:内存的分配在程序执行前就分配好了,在程序运行的过程中一直 存在,如全局变量,和static声明的变量.  在栈中:内存的分配是在程序的运行过程中被分配,函数结束后系统自动释放.  在堆中:即动态分配,一般用malloc和new分配内存的大小,程序员自己用free和delete自己释 放,  因此程序员可以自己控制其生命周期,一定要注意在用完后手动释放,如果不释放就会  造成内存的泄漏.  一个C和C++程序编译时分为5大存储区:堆区,栈区,全局区,文字常量区,程序代码区. c和C+

模拟操作系统中进程的三种基础状态与内存的分配和回收(最佳适配算法)

利用键盘模拟进程的三种操作状态,并且使用C++中的list模板模拟内存的分配和回收. 能够模拟进程的创建与撤销过程 l可对进程的状态进行全面的控制 按先进先出方式管理就绪和阻塞队列,能够按队列形式输出进程状 用PCB代表进程,用全局变量表示进程的个数. 1 #include <iostream> 2 #include <list> 3 #include <numeric> 4 #include <algorithm> 5 #include<stdlib

【ThinkingInC++】64、重载new和delete,来模仿内存的分配

/** * 书本:[ThinkingInC++] * 功能:重载new和delete,来模仿内存的分配 * 时间:2014年10月5日14:30:11 * 作者:cutter_point */ #include <cstddef> //size_t这个类型的使用 #include <fstream> #include <iostream> #include <new> using namespace std; ofstream out("Frami

内存连续分配管理方式

内存连续分配方式,是指为一个用户程序分配一个连续的内存空间.它主要包括单一连续分配.固定分区分配和动态分区分配. 单一连续分配 内存在此方式下分为系统区和用户区,系统区仅提供给操作系统使用,通常在低地址部分:用户区是为用户提供的.除系统区之外的内存空间.这种方式无需进行内存保护. 这种方式的优点是简单.无外部碎片,不需要额外的技术支持.缺点是只能用于单用户.单任务的操作系统中,有内部碎片,存储器的利用率极低. 固定分区分配 固定分区分配是最简单的一种多道程序存储管理方式,它将用户内存空间划分为若