• 姓名 胡家揆
  • 学号 201821121023
  • 班级 计算1811

1. 记录内存空间使用情况

 

 

2. 记录空闲分区

 

 

 

 

3. 内存分配算法

(1)首次适应算法(First Fit):从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给

作业,这种方法的目的在于减少查找时间。为适应这种算法,空闲分区表(空闲区链)中的空闲分区要按地址由低到

高进行排序。该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高地址空间保留大的空闲区。

 

(2)最佳适应算法(Best Fit):从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区,这种方法能使

碎片尽量小。为适应此算法,空闲分区表(空闲区链)中的空闲分区要按从小到大进行排序,自表头开始查找到第一

个满足要求的自由分区分配。该算法保留大的空闲区,但造成许多小的空闲区。

 

 

 

(3)最差适应算法(Worst Fit):从全部空闲区中找出能满足作业要求的、且大小最大的空闲分区,从而使链表中

的结点大小趋于均匀,适用于请求分配的内存大小范围较窄的系统。为适应此算法,空闲分区表(空闲区链)中的空

闲分区按大小从大到小进行排序,自表头开始查找到第一个满足要求的自由分区分配。该算法保留小的空闲区,尽量

减少小的碎片产生。

 

4. 内存释放算法

 

 

 

 

 

//创建一个新进程
int new_process(int x)
{
    struct allocated_block *ab;
    int size;
    int ret;
    ab= (struct allocated_block*)malloc(sizeof(struct allocated_block));
    if(!ab)
        exit(-5);
    ab->next= NULL;
    pid++;
    sprintf(ab->process_name,"PROCESS-%02d",pid);//将格式化的数据写入某字符串中
    ab->pid= pid;
    
    
    ab->size=x;
    ret= allocate_mem(ab);
    if((ret== 1)&&(allocated_block_head== NULL))  //如果此时未赋值,则赋值
    {
        allocated_block_head= ab;
        return 1;
    }
    else if(ret== 1)  //分配成功,将该已分配块的描述插入已分配链表
    {
        ab->next= allocated_block_head;
        allocated_block_head= ab;
        return 2;
    }
    else if(ret== -1)  //分配不成功
    {
        printf("Allocation fail.\n");
        free(ab);
        return -1;
    }
    return 3;
}

  

5. 运行结果

 

(1)产生测试数据

int main()
{
    int i,x;//定义变量 
    pid= 0;//初始化pid 
    free_block= init_free_block(mem_size);   
        for(i=0;i<=9;i++){//十次循环 
        	x=rand()%100;//产生0~100的随机数 
        	new_process(x);//添加新进程 
        	display_mem_usage();//显示内存使用情况 
		}    

      for(i=10;i>0;i--){//十次循环
      kill_process(i);//释放pid为i的进程
      display_mem_usage();//显示内存使用情况
      }

   } 

  使用for循环产生10个100内的随机数代表每次新进程占用的空间,我的内存空间初始为1024,不会出现内存不足。产生的随机数为size:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 以上是分配10个进程空间

下面将10个进程空间释放:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(2)解释结果

 

 

 

 pid为1的进程占用地址0~83的空间,占用大小为83,分配完的空闲内存空间为地址83开始,大小941的空间大小

 pid为2的进程占用地址83~169的空间,占用大小为86,分配完的空闲内存空间为地址169开始,大小855的空间大小

 pid为3的进程占用地址169~246的空间,占用大小为77,分配完的空闲内存空间为地址169开始,大小778的空间大小

 pid为4的进程占用地址246~261的空间,占用大小为15,分配完的空闲内存空间为地址261开始,大小763的空间大小

 

637到1024大小为387的空间为添加完10个进程后剩下的空间

 pid=10的进程被释放,多出地址从616开始大小为21的空间 

 

释放完全部进程后:

 

 

 剩下11个空间(10为之前10个进程的空间,11为添加剩余的空间)

 

正在使用的进程为0。

 

 

提交于2020-05-17 13:36

修改完添加了释放的功能测试 ,修改时的随机数和之前一样,可能是C语言的伪随机。

修改于2020-05-17 14:21

 

posted on 2020-05-17 13:36  top1-s1mple  阅读(393)  评论(0编辑  收藏  举报