实验:动态分区式存储管理

实验内容:

编写程序模拟完成动态分区存储管理方式的内存分配和回收。实验具体包括:首先确定内存空闲分配表;然后采用最佳适应算法完成内存空间的分配和回收;最后编写主函数对所做工作进行测试。

实验提示

由于是实验,没有真正的内存分配。所以在实验中首先应建立一张空闲区表,初始状态只有一个空闲登记项(假定的内存空闲区)和一张所有状态都为“空”的已分配区表。假定内存空间110KB,OS占用10KB,其余为空闲区。然后可以选择进行内存分配或回收:若是分配,要求输入作业名和所需内存空间大小;若是回收,输入回收作业的作业名。程序循环进行内存分配和回收,直到用户选择退出系统。在每次作业提交(内存分配)及作业结束(内存回收)时显示两张表的内容,以检查内存的分配和回收是否正确。

用C语言编程实现:

#include<stdio.h>
#include<malloc.h>
typedef struct storage
{
int name;
int size;
int startaddress;
int stuta;//0表示空闲;1表示已分配
storage* next;
storage* front;
}storage;
//初始化
void initialize(storage *s,int name){
s->name=name;
s->size=;
s->startaddress=;
s->stuta=;
s->front=NULL;
s->next=NULL;
}
//判断是否可以分配0表示不能分配,1表示可以分配
int IFallocation(storage *s,int Size)
{
storage *p;
while (s!=NULL)
{
p=s->next;
if(s->stuta== && s->size>Size)//空闲而且存在 够分的情况
{
return ;
}
s=p;
}
printf("不允许分配\n");
return ;
}
//分配
void allocation(storage* head,int name,int size)
{
//找最佳位置
//创建两个指针 一个扫描移动 一个记录最佳
//假设头指针就是最佳插入位置
//扫描 先看是不是空闲区 在看能不能分配 在看是不是最佳位置
storage *h,*p,*great;
h=head;
while(h){
p=h->next;
if(h->stuta==)
{
great=h;
if(h->size>size)
{
if(h->size<great->size)
{
great=h;
}
}
}
h=p;
}
//创建节点
p=(storage*)malloc(sizeof(storage));
initialize(p,great->name);
//修改数据
p->size=great->size-size;
p->startaddress=great->startaddress+size;
great->size=size;
great->stuta=;
//链接
//分为尾部为空的链接 和不为空的链接
if(great->next==NULL)
{
p->next=great->next;
p->front=great;
great->next=p;
}
else
{
p->next=great->next;
p->next->front=p;
great->next=p;
p->front=great;
}
printf("分配成功\n");
}
//回收有四种情况
//return 0则是找不到name return 1是成功
int recycle(storage** head,int name)
{
//根据名字找到节点
storage *h,*p;
h=*head;
while (h!=NULL)
{
p=h->next;
if(h->name==name && h->stuta==)
{
break;
}
h=p;
}
if(h==NULL)
{
printf("任务不存在\n");
return ;
}
//根据几点前后 区块 和区块 空闲情况回收
//如果不用合并只需要把状态设置为0
//如果下面有节点而且空闲则合并
//如果上面有几点而且空闲则合并
h->stuta=;
if(h->next && h->next->stuta==)
{
//修改值
h->next->size+=h->size;
h->next->startaddress=h->startaddress;
//链接
if(h==*head)
{
*head=h->next;
h->next->front=NULL;
}
else{
h->next->front=h->front;
h->front->next=h->next;
}
//释放
p=h->next;
free(h);
h=p;
}
if(h->front &&h->front->stuta==)
{
//修改值
h->front->size+=h->size;
//链接
if(h->next)
{
h->next->front=h->front;
h->front->next=h->next;
}
else{
h->front->next=NULL;
}
//释放
free(h);
}
printf("回收成功\n");
return ;
}
//显示分配情况
void display(storage*head){
storage*p;
while (head)
{
p=head->next;
printf("片号%d,大小%d,状态%d,起始位置%d\n",head->name,head->size,head->stuta,head->startaddress);
head=p;
}
}
void Menu()
{
printf("按1添加任务,按2删除任务,按0退出\n");
}
//退出
void Exit(storage*head)
{
printf("1\n");
storage*p,*h;
h=head;
while (h)
{
p=h->next;
free(h);
h=p;
}
}
int main()
{
int menu;
storage*head;
head=(storage*)malloc(sizeof(storage));
initialize(head,);
head->size=;
Menu();
scanf("%d",&menu);
while (menu)
{
display(head);
if(menu==)
{
int name,size;
printf("请输入任务号");
scanf("%d",&name);
printf("请输入任务大小");
scanf("%d",&size);
if(IFallocation(head,size))
{
allocation(head,name,size);
}
}
if(menu==)
{
int name;
printf("请输入要删除的任务号");
scanf("%d",&name);
recycle(&head,name);
}
printf("本操作结束请再次选择操作");
scanf("%d",&menu);
Menu();
}
Exit(head);
return ;
}

欢迎批评指正。

大二作业——操作系统实验——C语言用双向链表,模拟实现动态分区式存储管理的更多相关文章

  1. 操作系统之cache、伙伴系统、内存碎片、段式页式存储管理

    存储管理是操作系统非常重要的功能之一,本文主要介绍操作系统存储管理的基础知识,包括缓存相关知识.连续内存分配.伙伴系统.非连续内存分配.内存碎片等,并结合linux系统对这些知识进行简单的验证.文章内 ...

  2. 20165318 预备作业二 学习基础和C语言基础调查

    20165318 学习基础和C语言基础调查 技能学习经验 我们这一代人,或多或少的都上过各种兴趣班,舞蹈钢琴画画书法,我也是如此.可这些技能中,唯一能拿的出手的就是舞蹈了.按照<优秀的教学方法- ...

  3. 操作系统实验一:进程管理(含成功运行C语言源代码)

    目录 操作系统实验一:进程管理 1.实验目的 2.实验内容 3.实验准备 3.1.1进程的含义 3.1.2进程的状态 3.1.3进程状态之间的转换 3.2 进程控制块PCB 3.2.1进程控制块的作用 ...

  4. 与左侧的 圆括号“(”(位于“e:\大二上课程课件、作业和答案\数据结构\chapter4\sqstack\sqstack\mysqstack.h(23)”)匹配之前遇到文件结束

    错误原因是“某对圆括号只打了左括号而没有右括号”,debug方法是:直接根据报错提示:“与左侧的 圆括号“(”(位于“e:\大二上课程课件.作业和答案\数据结构\chapter4\sqstack\sq ...

  5. 第十二周java实验作业

    实验十二  图形程序设计 实验时间 2018-11-14 1.实验目的与要求 (1) 掌握Java GUI中框架创建及属性设置中常用类的API: Java的集合框架实现了对各种数据结构的封装. jav ...

  6. 化学专业大二转战Android开发,终于拥有了鹅厂暑期实习offer

    我是双非学校,应用化学专业,一年前我大二,现在我大三.一年前我两手空空,现在我拥有了鹅厂暑期实习的offer. 虽然结果是好的,但我春招实习的道路远没有这么简单和辉煌,它是无比坎坷的:每个人应该量力而 ...

  7. [操作系统实验lab3]实验报告

    [感受] 这次操作系统实验感觉还是比较难的,除了因为助教老师笔误引发的2个错误外,还有一些关键性的理解的地方感觉还没有很到位,这些天一直在不断地消化.理解Lab3里的内容,到现在感觉比Lab2里面所蕴 ...

  8. linux 操作系统下c语言编程入门

    2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理  ...

  9. 北航操作系统实验2019:Lab4-1流程梳理

    北航操作系统实验2019:Lab4-1流程梳理 前言 操作系统的实验课实在令人头秃.我们需要在两周时间内学习相关知识.读懂指导书.读懂代码.补全代码.处理玄学bug和祖传bug,以及回答令人窒息的思考 ...

随机推荐

  1. 高级mask应用

    高级mask应用 用mask做遮罩可以实现复杂的效果: 用来形成遮罩的图片: 原始图片: 如果你熟悉Photoshop,那这种效果绝对是你的菜,看代码你会秒懂...... // // RootView ...

  2. python基础语法1

    一.基础语法 1.常量 python语言没有真正的常量,它只是字面常量. 2.变量 变量是一个指针,它指向一块内存. 变量的命名规则: 1)只能包含字母.数字和下划线: 2)只能以字母或者下划线开始: ...

  3. TensorFlow神经网络中的激活函数

    激活函数是人工神经网络的一个极其重要的特征.它决定一个神经元是否应该被激活,激活代表神经元接收的信息与给定的信息有关. 激活函数对输入信息进行非线性变换. 然后将变换后的输出信息作为输入信息传给下一层 ...

  4. python安装 numpy&安装matplotlib& scipy

    numpy安装 下载地址:https://pypi.python.org/pypi/numpy(各取所需) copy安装目录.eg:鄙人的D:\python3.6.1\Scripts pip inst ...

  5. Java 运算符(引用和对象)

    1. 算数运算符 就是+.-.*./.%.++.--这些,没什么好说的,稍微强调下自加,自减: 前缀自增自减法(++i,--i): 先进行自增或者自减运算,再进行表达式运算. 后缀自增自减法(i++, ...

  6. 关于Class类的getResource().getPath()方法

    程序中配置文件如果放置在classes文件夹,那么我们就可以使用Class类的getResource().getPath()方法获取文件路径. 例如: String path = DBUtil.cla ...

  7. iOS-建设银行破解分享

    https://i.cnblogs.com/Files.aspx 建设银行破解分享 问题描述一• 在越狱手机上控制银行客户端自动获取流水,并发送到服务器. 问题描述二• 怎么控制 • 通过在越狱手机上 ...

  8. [POI2006]TET-Tetris 3D

    题目 二维线段树板子题啊 但是惊讶的发现我不会打标记 毕竟内层是线段树不能\(pushup\)也不能\(pushdown\) 于是考虑一下标记永久化 其实非常显然\(mx_i\)表示区间最大值,\(t ...

  9. 【[USACO12MAR]园林绿化Landscaping】

    我旁边有一个暴力的金牌爷整天欺负我嘤嘤嘤 关我电脑,关我浏览器,还钦定我学不会贪心 没错我就是学不会了 这道题还是非常妙的 我们发现这个土的数量实在是少的可怜,于是我们甚至可以对每一个单位的土都进行贪 ...

  10. Java50道经典习题-程序13 根据条件求数字

    题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?分析:完全平方数:如果一个数能是由两个相同的数相乘的结果,那么这个数就是完全平方数,例如:9==3*3: ...