实验三:内存动态分区分配

内存动态分区分配和回收的模拟实现

实验目的

  1. 加深对内存管理的理解,进而对连续分配和离散分配有更深刻的认识。
  2. 通过内存管理,进一步理解进程等操作系统概念。

实验内容

  • 模拟实现内存动态分区分配和回收

    • 建立一个长度为1024的一维数组,用以模拟内存。
    • 建立空闲分区表或空闲分区链,用来记录内存的使用情况。
    • 为请求进入内存的作业分配内存,回收运行完成的作业所占内存。
    • 键盘输入:表示一个请求进入内存的作业的三元组: (作业号(0–9),作业大小(1—1024),作业运行时间)
    • 程序接受键盘输入,进行内存分配,返回分配或其它信息(在屏幕显示)

实验代码

//首次适应算法
#include<iostream>
#include<ctime>
#include<windows.h>

using namespace std;

int memory[1024]={0};//1024的模拟内存,初始化置0,空闲状态 ,为1说明该内存被作业0所使用,以此类推
clock_t start[10];//存进程开始时间 

struct process
{
    int size;
    int time;
}x[10];

struct state_table
{
    int address;
    int size;
    state_table * next;
};//未分配分区状态表 

int search_memory(int n);//遍历内存中有无n号进程 ,有返回1
void new_state_table(state_table *first,state_table *end);//更新未分配分区状态表
int search_state_table(int a,int size,state_table *first,state_table *end);
void recovery();
void delete_state_table(state_table *first,state_table *end);

int main()
{
    state_table *first,*end;
    first=new state_table;
    end=new state_table;
    first->next=end;
    end->next=NULL;
    new_state_table(first,end);
    while(1)
    {
        int a;
        cout<<"请输入进入内存的作业号(如果输入-1,结束程序):"<<endl;
        cin>>a;
        if(a==-1) break;
        cout<<"请输入进入内存的作业大小:"<<endl;
        cin>>x[a].size;
        cout<<"请输入进入内存的作业运行时间:"<<endl;
        cin>>x[a].time;
        if(search_memory(a))
        {
            cout<<"此作业不能二次进入内存!"<<endl;
            continue;
        }
        if(search_state_table(a,x[a].size,first,end));
        else
        {
            cout<<"无足够内存加载作业,进行内存回收"<<endl;
            recovery();
            delete_state_table(first,end);
            new_state_table(first,end);
            if(search_state_table(a,x[a].size,first,end));
            else cout<<"回收完毕,仍无足够内存,此作业不能加入内存"<<endl;
        }
    }
    delete_state_table(first,end);
    delete first;
    delete end;
    return 0;
}

int search_memory(int n)
{
    n++;
    for(int i=0;i<1024;i++)
    {
        if(n==memory[i]) return 1;
    }
    return 0;
}

void new_state_table(state_table *first,state_table *end)
{
    for(int i=1023;i>=0;i--)
    {
        if(memory[i]==0)
        {
            int k=0;
            int j=i;
            for(;j>=0;j--)
            {
                if(memory[j]==0) k++;
                else break;
            }
            state_table *temp;
            temp=new state_table;
            temp->address=i+1-k;
            temp->size=k;
            temp->next=first->next;
            first->next=temp;
            i=j;
        }
    }
}

int search_state_table(int a,int size,state_table *first,state_table *end)
{
    state_table *t;
    t=first->next;
    while(t->next!=NULL)
    {
        if(t->size>=size)
        {
            int i=0;
            for(;i<size;i++)
            {
                memory[t->address+i]=a+1;
            }
            start[a]=clock();
            cout<<"进程"<<a<<"已加载进内存。"<<endl;
            t->address=i;
            t->size-=size;
            return 1;
        }
        t=t->next;
    }
    return 0;
}

void recovery()
{
    int i=0,j;
    for(;i<1024;i++)
    {
        if(memory[i])
        {
            if((clock()-start[memory[i]-1])>=(x[memory[i]-1].time)*CLOCKS_PER_SEC)
            {
                for(j=i;j<i+x[memory[i]-1].size;j++)
                {
                    memory[j]=0;
                }
                i=j-1;
            }
        }
    }
}

void delete_state_table(state_table *first,state_table *end)
{
    state_table *t;
    t=first->next;
    while(t->next!=NULL)
    {
        first->next=t->next;
        delete t;
        t=first->next;
    }
}
  • 内存动态分区分配和回收的模拟实现

    • 实验目的
    • 实验内容
    • 实验代码
时间: 2024-10-23 11:52:49

实验三:内存动态分区分配的相关文章

动态分区分配

一.目的 加深对动态分区分配的理解,进一步掌握首次适应算法和最佳适应算法的理解.了解动态分区分配方式中使用的数据结构和分配算法,进一步加深对动态分区存储管理方式及其实现过程的理解.提高学生设计实验.发现问题.分析问题和解决问题的能力. 学会可变式分区管理的原理是在处理作业过程中建立分区,使分区大小正好适合作业的需求. 当一个作业执行完成后,作业所占的分区应归还给系统. 二.原理 首次适应算法 以空闲分区链为例来说明采用FF算法时的分配情况.FF算法要求空闲分区链以地址递增的次序链接.在分配内存时

使用动态分区分配方式的模拟

1实验目的 (1)了解动态分区分配方式中使用的数据结构和分配算法 (2)加深对动态分区存储管理方式及其实现过程的理解. 2实验内容 (1)分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free().其中,空闲分区通过空闲分区链来管理:在进行内存分配时,系统优先使用空闲区低端的空间. (2)假设初始状态下,可用的内存空间为640KB,并有下列的请求序列: •作业1申请130KB. •作业2申请60KB. •作业3申请100KB. •作业2释放60KB. •作业4申

操作系统——动态分区分配方式模拟

这里直接给出代码,如果不理解请参考左万历版<计算机操作系统教程>,先在给出四中模拟算法. 1.   设计目的 了解动态分区分配中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解. 2.   设计内容 1)用C语言实现采用首次适应算法的动态分区分配过程alloc()和回收过程free().其中,空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端的空间. 2)假设初始状态如下,可用的内存空间为640KB,并有下列的请求序列: 作业1申请130KB

实验三、动态优先数实验

一.  实验目的      用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 二.  实验内容和要求 编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对N(N不小于5)个进程进行调度.“最高优先级优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程. #include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct n

【操作系统】实验四 主存空间的分配和回收

1. 实验目的 用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解. 2.实验要求 采用连续分配方式之动态分区分配存储管理,使用首次适应算法.循环首次适应算法.最佳适应算法和最坏适应算法4种算法完成设计(任选两种算法). (1)设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收.采用分区说明表进行. (2)或在程序运行过程,由用户指定申请与释放. (3)设计一个空闲区说明表,以保存某时刻主存空间占用情况.把空闲区说明表的变化情况以及各作业的申请.释

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

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

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

实验四主存空间的分配和回收 1.    目的和要求 1.1.           实验目的 用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解. 1.2.           实验要求 采用连续分配方式之动态分区分配存储管理,使用首次适应算法.循环首次适应算法.最佳适应算法和最坏适应算法4种算法完成设计(任选两种算法). (1)**设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收.采用分区说明表进行. (2)或在程序运行过程,由用户指定申请与释放

39,叶慧敏 实验四 主存空间的分配和回收模拟

一. 实验目的 为了合理地分配和使用这些存储空间,当用户提出申请主存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间和使用情况,找出足够 的空闲区域给申请者.当作业撤离归还主存资源时,则存储管理要收回占用的主存空间.主存的分配和回收的实现是与主存储器的管理方式有关的,通过本实验帮助 我们理解在不同的存储管理方式下应怎样实现主存空间的分配和回收. 用高级语言完成一个主存空间的分配和回收模拟程序,以加深对内存分配方式及其算法的理解. 二.实验内容和要求 2.1  模拟包括3部分:

操作系统之实验四主存空间的分配和回收

                                                                                    实验四主存空间的分配和回收                                                      专业:商业软件工程     班级:商软2班     姓名:甘佳萍     学号:201406114207 一.    目的和要求 1.1.           实验目的 用高级语言完成一个主存空间的