_紫萱

操作系统第5次实验报告:内存管理

------------恢复内容开始------------

  • 姓名:黄财泽
  • 学号:201821121014
  • 班级:计算1811

一、实验目的

  通过编程进一步了解内存管理。

二、实验内容

  • 在服务器上用Vim编写一个程序:仿真实现某个内存管理算法,测试给出结果,并对解释运行结果。

三、实验报告

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

解释你是如何记录内存空间使用情况,给出关键代码。

 

2. 记录空闲分区

用什么样的方法记录内存空闲区,给出关键代码。

  • 空闲分区表
  • 空闲分区链表
  • 位图
  • ...

3. 内存分配算法

首次适应算法

void* FirstFit()        //首次适应算法
{
    void *res_addr;     //返回申请到的空间的首地址
    int job_length = 0;
    int pos = findSpace(job_length);
    if(pos == -1)
    {
        cout<<"没有可用空间"<<endl;
        return NULL;
    }
    res_addr = (void*)frees.data[pos].addr;
    //没有在if判断时return 说明确实存在可用空间
 
    //已用分区表已满需扩容
    if(occupys.cursize == occupys.capacity)
    {
        increCapacity(occupys, 2);
    }
 
    //模拟进行进行分配的过程,注意已用空间数量+1
    occupys.data[occupys.cursize].addr = frees.data[pos].addr;
    occupys.data[occupys.cursize].size = job_length;
    occupys.data[occupys.cursize].tag = 1;
    occupys.cursize++;
 
    if(frees.data[pos].size > job_length)   //可用分区大小超过申请的大小
    {
        frees.data[pos].addr += job_length; //修改该可用分区始址
        frees.data[pos].size -= job_length; //修改该可用分区大小
    }else   //可用分区的大小恰好等于申请的大小
    {
        for(int j = pos; j < frees.cursize-1; ++j)
            frees.data[j] = frees.data[j+1];
        frees.cursize--;    //可用分区数减1
    }
    cout<<"空间申请成功\n";
    return res_addr;
}

 

4. 内存释放算法

void cancel()   //撤销作业
{
    cout<<"请输入回收区的编号"<<endl;
    int num;
    cin>>num;
    if(num < 0 || num >= occupys.capacity)
    {
        cout<<"输入错误,返回"<<endl;
        return;
    }
 
    //取出待回收的区块
    Item finish = occupys.data[num];
    int i;
    for(i = num; i < occupys.cursize-1;++i)
        occupys.data[i] = occupys.data[i+1];
    occupys.cursize -= 1;
 
    if(frees.cursize == frees.capacity) //对空闲分区表2倍扩容
        increCapacity(frees,2);
 
    int pos;   //pos记录插入点前一个
    for(int i = 0; i < frees.capacity; ++i)
    {
        if(frees.data[i].addr+frees.data[i].size <= finish.addr || frees.data[i].size == 0)
        {
            pos = i;
            break;
        }
    }
 
    if(frees.data[pos].size == 0)   //如果空闲分区表该项未使用直接放入
    {
        frees.data[pos].addr = finish.addr;
        frees.data[pos].size = finish.size;
        frees.data[pos].tag = 0;
        return;
    }
 
    if(frees.data[pos].addr+frees.data[pos].size == finish.addr)        //满足上邻接
    {
        frees.data[pos].size += finish.size;    //和上空闲区域合并
        if(frees.data[pos+1].addr == finish.addr+finish.size) //满足同时还满足下邻接 表项数会改变
        {
            frees.data[pos].size += frees.data[pos+1].size;
            for(int i = pos+1; i < frees.cursize-1; ++i)
            {
                frees.data[i] = frees.data[i+1];
            }
            frees.cursize--;
        }
    }else   //不满足上邻接
    {
        if(frees.data[pos+1].addr == finish.addr+finish.size)   //满足下邻接
        {
            frees.data[pos+1].addr = finish.addr;
            frees.data[pos+1].size += finish.size;
        }else   //不满足下邻接 表项数改变
        {
            for(int i = frees.cursize-1; i >= pos+1 ; --i)
            {
                frees.data[i+1] = frees.data[i];
            }
            frees.data[pos+1].addr = finish.addr;
            frees.data[pos+1].size = finish.size;
            frees.data[pos+1].tag = 0;
            frees.cursize++;
        }
    }
}

 

5. 运行结果

(1)产生测试数据

 

 

(2)解释结果

撤消标号为1的空间

 

 此时显示大小为100的空间已经被释放

 

 

释放空间大小为15的

 

 

 

 该空间已经变为空闲

 

释放内存空间大小为200的

 

posted on 2020-05-16 23:31  _紫萱  阅读(324)  评论(0编辑  收藏  举报

导航