java 动态分区 链表_大二作业——操作系统实验——C语言用双向链表,模拟实现动态分区式存储管理...

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

实验内容:

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

实验提示

由于是实验,没有真正的内存分配。所以在实验中首先应建立一张空闲区表,初始状态只有一个空闲登记项(假定的内存空闲区)和一张所有状态都为“空”的已分配区表。假定内存空间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的方法主要有两种.两种区别主要在于缓存 ...

你可能感兴趣的:(java,动态分区,链表)