大二作业——操作系统实验——C语言用双向链表,模拟实现动态分区式存储管理
实验:动态分区式存储管理
实验内容:
编写程序模拟完成动态分区存储管理方式的内存分配和回收。实验具体包括:首先确定内存空闲分配表;然后采用最佳适应算法完成内存空间的分配和回收;最后编写主函数对所做工作进行测试。
实验提示
由于是实验,没有真正的内存分配。所以在实验中首先应建立一张空闲区表,初始状态只有一个空闲登记项(假定的内存空闲区)和一张所有状态都为“空”的已分配区表。假定内存空间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语言用双向链表,模拟实现动态分区式存储管理的更多相关文章
- 操作系统之cache、伙伴系统、内存碎片、段式页式存储管理
存储管理是操作系统非常重要的功能之一,本文主要介绍操作系统存储管理的基础知识,包括缓存相关知识.连续内存分配.伙伴系统.非连续内存分配.内存碎片等,并结合linux系统对这些知识进行简单的验证.文章内 ...
- 20165318 预备作业二 学习基础和C语言基础调查
20165318 学习基础和C语言基础调查 技能学习经验 我们这一代人,或多或少的都上过各种兴趣班,舞蹈钢琴画画书法,我也是如此.可这些技能中,唯一能拿的出手的就是舞蹈了.按照<优秀的教学方法- ...
- 操作系统实验一:进程管理(含成功运行C语言源代码)
目录 操作系统实验一:进程管理 1.实验目的 2.实验内容 3.实验准备 3.1.1进程的含义 3.1.2进程的状态 3.1.3进程状态之间的转换 3.2 进程控制块PCB 3.2.1进程控制块的作用 ...
- 与左侧的 圆括号“(”(位于“e:\大二上课程课件、作业和答案\数据结构\chapter4\sqstack\sqstack\mysqstack.h(23)”)匹配之前遇到文件结束
错误原因是“某对圆括号只打了左括号而没有右括号”,debug方法是:直接根据报错提示:“与左侧的 圆括号“(”(位于“e:\大二上课程课件.作业和答案\数据结构\chapter4\sqstack\sq ...
- 第十二周java实验作业
实验十二 图形程序设计 实验时间 2018-11-14 1.实验目的与要求 (1) 掌握Java GUI中框架创建及属性设置中常用类的API: Java的集合框架实现了对各种数据结构的封装. jav ...
- 化学专业大二转战Android开发,终于拥有了鹅厂暑期实习offer
我是双非学校,应用化学专业,一年前我大二,现在我大三.一年前我两手空空,现在我拥有了鹅厂暑期实习的offer. 虽然结果是好的,但我春招实习的道路远没有这么简单和辉煌,它是无比坎坷的:每个人应该量力而 ...
- [操作系统实验lab3]实验报告
[感受] 这次操作系统实验感觉还是比较难的,除了因为助教老师笔误引发的2个错误外,还有一些关键性的理解的地方感觉还没有很到位,这些天一直在不断地消化.理解Lab3里的内容,到现在感觉比Lab2里面所蕴 ...
- linux 操作系统下c语言编程入门
2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理 ...
- 北航操作系统实验2019:Lab4-1流程梳理
北航操作系统实验2019:Lab4-1流程梳理 前言 操作系统的实验课实在令人头秃.我们需要在两周时间内学习相关知识.读懂指导书.读懂代码.补全代码.处理玄学bug和祖传bug,以及回答令人窒息的思考 ...
随机推荐
- Python学习---IO模型1227
1.1. 事件驱动 事件驱动属于一种编程的范式,一种编程的风格,它擅长于处理一些未知的事件,通过绑定一个事件,外界触发后激活这个事情,达到执行某些操作的目的.比如浏览器的onclick()事件 1.2 ...
- 4.GlusterFS 常见故障处理
一般硬盘也要备用几块,因为随着发展,可能这些型号的硬盘不好买到了,一般的事故不会在开始一两年出,在硬件老化的时候出故障的频率高. 4.1 硬盘故障 如果底层做了 RAID 配置,有硬件故障,直接更换硬 ...
- 企业办公领域: Windows + Office的组合在未来能抵挡住 Google Apps的冲击么
从个人角度讲,我基本上不怎么喜欢微软的产品,即便是其无处不见的Windows. Windows 8用了几个月的后,实在无法忍受其某些SB的设计,还是换回Win7.另外自从用上了MacBook 以后, ...
- December 12th 2016 Week 51st Monday
Nothing is impossible for a willing heart. 心之所愿,无所不成. I wish I can be a strong, clever, powerful and ...
- 关于eclipse没有js、xml代码提示的解决:下载一个插件
1)eclipse打开帮助 2)Eclipse Marketplace,然后搜索AngularJS Eclipse 安装后重启就行了 xml的搜索Rinzo. 没有vpn,我的网络到达不了.
- Vmstat主要关注哪些数据?
除特殊情况外,一般关注飘红部分 任务的信息(procs) r(running) 在internal时间段里,运行队列中的进程数,即表示正在运行或者正在等待CPU时间的进程数,如果这个参数值超过服务器上 ...
- js判断鼠标滚轴方向(向上或向下)
var num=1; $(document).on("mousewheel DOMMouseScroll", function (e) { var delta = (e.origi ...
- hdu-3397 Sequence operation 线段树多种标记
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3397 题目大意: 0 a b表示a-b区间置为0 1 a b表示a-b区间置为1 2 a b表示a- ...
- vim在插入模式粘贴代码缩进问题解决方法
转载自:https://blog.csdn.net/commshare/article/details/6215088 在vim粘贴代码会出现缩进问题,原因在于vim在代码粘贴时会自动缩进 解决方法: ...
- 在Java中使用Maven配置的版本信息
我们在使用maven开发一些项目的时候需要知道当前的版本状态,但版本状态储存在pom.xml文件中,可以采用以下2种方式进行获取: 1. 采用xml解析的方式去获取pom文件的{project.ver ...