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

这里直接给出代码,如果不理解请参考左万历版《计算机操作系统教程》,先在给出四中模拟算法。

1.   设计目的

了解动态分区分配中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。

2.   设计内容

1)用C语言实现采用首次适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端的空间。

2)假设初始状态如下,可用的内存空间为640KB,并有下列的请求序列;

作业1申请130KB

作业2申请60KB

作业3申请100KB

作业2释放60KB

作业4申请200 KB

作业3释放100 KB

作业1释放130 KB

作业5申请140 KB

作业6申请60 KB

作业7申请50KB

作业6释放60 KB

请采用数组四种算法进行内存块的分配和回收,同时显示内存块分配和回收后空闲内存分区链的情况。


 *操作系统:首次适应算法的动态分区分配方式模拟



#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
struct ready_node{//就绪的进程
    int id;//进程编号
    int flag;//表是进程的状态,1:表示进入内存,0:表示从内存撤出
    int size;//进程长度
};

struct free_node{//空闲区域表的结构体,首地址和长度
    int id;//保存在该区域的进行号
    int start;//首地址
    int len;//长度
};
vector<free_node> free_list;//保存空闲区域表的内容,分别是区域首址和区域长度
vector<free_node> used_list;//保存已占用区域表的内容,分别是区域首址和区域长度
queue<ready_node> ready_list;//就绪的进程队列,主要保存第一次匹配为成功的进程
queue<ready_node> wait_list;//等待的进程队列
//函数定义
int cmp(free_node a,free_node b);//定义排序的比较方式
void Show();//显示空闲区域表和已占用表的信息
void Init();//初始化等待序列
void Alloc(ready_node node);//动态分区分配函数
void Free(ready_node node);//回收过程函数
void Oper_FIRO();//操作函数
void Print();//显示最后控制台的空想区域表的状态,输入文件中

int main()
{
    //重定向输入输出,对文件进行操作
    freopen("input.txt","r",stdin);
    freopen("output8.txt","w",stdout);
    Init();//一定先进行初始化
    Oper_FIRO();
    //Print();
	return 0;
}

int cmp(free_node a,free_node b){//定义排序的比较方式
    return a.start<b.start;//按开始地址从小到大排序
}

void Show(){//显示空闲区域表和已占用表的信息
    sort(free_list.begin(),free_list.end(),cmp);//操作之前首先按首地址从小到大排序
    printf("-----------------------\n");
    printf("| 空闲链表的使用情况: |\n");
    printf("-----------------------\n");
    printf("---------------\n");
    printf("| 首址 | 长度 |\n");
    printf("---------------\n");
    for(int i=0;i<free_list.size();i++){
        printf("| %3d  |  %3d |\n",free_list[i].start,free_list[i].len);
        printf("---------------\n");
    }
    printf("-------------------------\n");
    printf("| 已占用链表的使用情况: |\n");
    printf("-------------------------\n");
    printf("----------------------------\n");
    printf("|运行进程 |   首址  |  长度|\n");
    printf("----------------------------\n");

    for(int i=0;i<used_list.size();i++){
        printf("|  %3d    |   %3d   |  %3d |\n",used_list[i].id,used_list[i].start,used_list[i].len);
        printf("----------------------------\n");
    }
}

void Init(){//初始化等待序列
    free_node fnod;
    fnod.start=0; fnod.len=640;//初始化空闲表
    free_list.push_back(fnod);

    ready_node node;
    while(scanf("%d%d%d",&node.id,&node.flag,&node.size)!=EOF){
        wait_list.push(node);
        //cout<<node.size<<endl;
    }
}

void Alloc(ready_node node){//动态分区分配函数
    sort(free_list.begin(),free_list.end(),cmp);//操作之前首先按首地址从小到大排序
    //cout<<free_list.size()<<endl;
    free_node fnod;
    int ok=0;//表示是否匹配成功
    vector<free_node>::iterator it;//定义迭代器
    for(it=free_list.begin();it!=free_list.end();++it){
        //cout&l
  • 12
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值