大二作业——操作系统实验——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,以及回答令人窒息的思考 ...
随机推荐
- [翻译] SVProgressHUD
SVProgressHUD https://github.com/TransitApp/SVProgressHUD SVProgressHUD is a clean and easy-to-use H ...
- iOS设计模式 - 适配器
iOS设计模式 - 适配器 效果 说明 1. 为了让客户端尽可能的通用,我们使用适配器模式来隔离客户端与外部参数的联系,只让客户端与适配器通信. 2. 本教程实现了适配器模式的类适配器与对象适配器两种 ...
- 乘风破浪:LeetCode真题_013_Roman to Integer
乘风破浪:LeetCode真题_013_Roman to Integer 一.前言 上一节我们讨论了如何把阿拉伯数字转换成罗马数字,现在我们需要思考一下如何把罗马数字转换成阿拉伯数字,其实我们仔细观擦 ...
- 89C51单片机的学习
好久都没来写一些东西了 最近老是忙着玩了,都忘记认真学习了. 大概从明天开始就要开始忙了. 1,英语四级 2,单片机课程 3,安卓课程 4,PS 感觉事情好多. 但是我还是心不在焉.好奇怪. 反正就是 ...
- Asp.Net MVC Identity 2.2.1 使用技巧(一)
开发环境:vs2015 UP3 or vs2017RC 项目环境:asp.net 4.6.1 identity版本为:asp.net identity 2.2.1 1.创建项目. 没什么好说 ...
- iOS自动化-- 常用iOS命令
iOS命令: 获取设备的的UDID idevice_id --list # 显示当前所连接设备的 udid instruments -s devices # 列出所有设备,包括真机.模拟器.mac i ...
- 微软Charting图表控件 System.Web.UI.DataVisuliztion.Charting
一.概述 基于.NET Framework 3.5 SP1的图表控件--Chart,可在WinForm和WebForm下使用!需要引入System.Web.DataVisualization.dll ...
- [T-ARA][TIAMO]
歌词来源:http://music.163.com/#/song?id=439915067 改了一版格式,先尝试一下,考虑到总不能永远只看着拼音读,所以想把发音按照韩文字来写,以后争取看着韩文字唱. ...
- [转]从三层架构到MVC,MVP
本来是不想跳出来充大头蒜的,但最近发现园子里关于MVC的文章和讨论之风越刮越烈,其中有些朋友的观点并不是我所欣赏和推荐的,同时最近也在忙着给公司里的同事做MVC方面的“扫盲工作”.所以就搜集了一些大家 ...
- win2003 HookPort 服务启动失败的解决办法!
Win2003系统每次开机启动时都弹出个对话框报HookPort 服务启动失败,很多网友都遇到同类问题,问题根源是360安全卫士引起的,官方一直没有给出解决方案 问题描述:Win2003系统每次开机启 ...