实验:动态分区式存储管理
实验内容:
编写程序模拟完成动态分区存储管理方式的内存分配和回收。实验具体包括:首先确定内存空闲分配表;然后采用最佳适应算法完成内存空间的分配和回收;最后编写主函数对所做工作进行测试。
实验提示
由于是实验,没有真正的内存分配。所以在实验中首先应建立一张空闲区表,初始状态只有一个空闲登记项(假定的内存空闲区)和一张所有状态都为“空”的已分配区表。假定内存空间110KB,OS占用10KB,其余为空闲区。然后可以选择进行内存分配或回收:若是分配,要求输入作业名和所需内存空间大小;若是回收,输入回收作业的作业名。程序循环进行内存分配和回收,直到用户选择退出系统。在每次作业提交(内存分配)及作业结束(内存回收)时显示两张表的内容,以检查内存的分配和回收是否正确。
用C语言编程实现:
#include
#include
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->sizesize)
{
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 ;
}
欢迎批评指正。
操作系统之cache、伙伴系统、内存碎片、段式页式存储管理
存储管理是操作系统非常重要的功能之一,本文主要介绍操作系统存储管理的基础知识,包括缓存相关知识.连续内存分配.伙伴系统.非连续内存分配.内存碎片等,并结合linux系统对这些知识进行简单的验证.文章内 ...
20165318 预备作业二 学习基础和C语言基础调查
20165318 学习基础和C语言基础调查 技能学习经验 我们这一代人,或多或少的都上过各种兴趣班,舞蹈钢琴画画书法,我也是如此.可这些技能中,唯一能拿的出手的就是舞蹈了.按照
第十二周java实验作业
实验十二 图形程序设计 实验时间 2018-11-14 1.实验目的与要求 (1) 掌握Java GUI中框架创建及属性设置中常用类的API: Java的集合框架实现了对各种数据结构的封装. jav ...
[操作系统实验lab3]实验报告
[感受] 这次操作系统实验感觉还是比较难的,除了因为助教老师笔误引发的2个错误外,还有一些关键性的理解的地方感觉还没有很到位,这些天一直在不断地消化.理解Lab3里的内容,到现在感觉比Lab2里面所蕴 ...
linux 操作系统下c语言编程入门
2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理 ...
北航操作系统实验2019:Lab4-1流程梳理
北航操作系统实验2019:Lab4-1流程梳理 前言 操作系统的实验课实在令人头秃.我们需要在两周时间内学习相关知识.读懂指导书.读懂代码.补全代码.处理玄学bug和祖传bug,以及回答令人窒息的思考 ...
姑娘你大胆地往前走——答大二学生XCL之八问
姑娘你大胆地往前走--答大二学生XCL之八问 以下问题的答案写给我家正在读大二的XCL. 写于 2017-9-13 晚 请问您是为什么选择了IT行业的? 与其说是我选择了行业,不如说是行业选择了我. ...
【操作系统】C语言编写的FAT16文件系统
[操作系统]C语言编写的FAT16文件系统 这是操作系统的期末课程设计作业之一,主要功能是在物理内存中虚拟出一个1M大小的FAT16的文件系统,然后把它读入内存中,进行具体的文件操作,具体的实用性不大 ...
随机推荐
shell 判断语句
1.字符串判断 str1 = str2 当两个串有相同内容.长度时为真str1 != str2 当串str1和str2不等时为真-n str1 当串的长度大于0时为真(串非空)-z str1 当串的长 ...
Redis集群的配置
[转]Redis集群的配置 一:memcache 和 Redis 对比总结 [memecache 特点] 1:速度最快(没有自测,但网上有详细的测试用例) 2:支持水平扩展,可以任意添加节点 [red ...
基于Linux的owncloud搭建
为了保证一个纯净的环境,我重新安装了一台centos系统 [root@localhost httpd-2.2.23]# lsb_release -a LSB Version: :base-4.0 ...
一个读取propeties配置文件的工具类,线程安全的
public class ConfigUtil { private static Map map = new HashMap
Embedded Linux Primer----嵌入式Linux基础教程--章节介绍
章节介绍 第一章,“导引”,简要介绍了Linux被迅速应用在嵌入式环境的驱动因素,介绍了与嵌入式Linux相关的几个重要的标准和组织. 第二章,“第一个嵌入式经历”,介绍了与后几章所构建的嵌入式Lin ...
浅谈JS数据遍历的几种方式
遍历对象(数组)是我们日常撸码的必不可少的部分,如何从性能上优化代码,提高运行效率?下文为你揭开真像: 第一种:普通的for循环 for(j = 0; j < arr.length; j++) ...
A1075. PAT Judge
The ranklist of PAT is generated from the status list, which shows the scores of the submittions. Th ...
float,double等精度丢失问题 float,double内存表示
问题提出:12.0f-11.9f=0.10000038,"减不尽"为什么? 来自MSDN的解释: http://msdn.microsoft.com/zh-cn/c151dt3s. ...
系统清理工具CCleaner被植入后门
概述 2017年9月18日,有情报披露,著名的系统优化工具CCleaner的某个版本被发现植入后门,大量使用该工具的用户恐将面临泄密风险.这是继Xshell后门事件后,又一起严重的软件供应链来源攻击事 ...
JNI由浅入深_8_JNI缓存字段和方法ID
获取字段ID和方法ID时,需要用字段.方法的名字和描述符进行一个检索.检索过程相对比较费时,因此本节讨论用缓存技术来减少这个过程带来的消耗.缓存字段ID和方法ID的方法主要有两种.两种区别主要在于缓存 ...