模拟OS内存分配与回收-最坏适应算法C语言实现

操作系统实验报告② 操作系统实验报告 阅读详情

设计程序模拟内存的动态分区法存储管理。内存空闲区使用自由链管理,采用最坏适应算法从自由链中寻找空闲区进行分配,内存回收时假定不做与相邻空闲区的合并。
假定系统的内存共 640K,初始状态为操作系统本身占用 64K。在 t1 时间之后,有作业 A、B、C、D 分别请求 8K、16K、64K、124K 的内存空间;在 t2 时间之后,作业 C 完成;在 t3时间之后,作业 E 请求 50K 的内存空间;在 t4 时间之后,作业 D 完成。
输出t1、t2、t3、t4 时刻内存的空闲区的状态。
这个实验主要就是链表空间的申请与释放,注意内存区的起始地址和容量的大小。

#include <stdio.h>
#include <stdlib.h>
using namespace std;

struct  freelink {  //空闲区结构
	int len, address;   
	// len 为分区长度  
	//address为分区起始地址 
};

struct  busylink { //占用区结构
	char name;   // 作业或进程名 name=’S’ 表示 OS 占用 
	int len, address; 
};

struct QueueNode { //链表结构
	struct busylink Node; //占用参数和空闲参数相近,用占用结构作为链表结点
	struct QueueNode* next;
};

typedef struct {  //队列结构
	QueueNode* front; //队头
	QueueNode* rear;  //队尾
}LinkQueue;

//全局
LinkQueue* q_free; //自由链头结点
LinkQueue* q_busy; //占用链头结点

void requireMemo(char  name, int  require); /* 模拟内存分配 */
void freeMemo(char name); /* 模拟内存回收 */
int past(int time);   /* 模拟系统过了 time 时间 */
void printlink(LinkQueue* tempQ);
bool IsEmptyQueue(LinkQueue* q); //队列判空
void InitQueue(LinkQueue* q);    //分配内存
void InsertQueueNode(LinkQueue* q, struct busylink tempNode); //入队

void start()   /* 设置系统初始状态*/
{
	InitQueue(q_free);
	InitQueue(q_busy);

	//初始化操作系统占用64k后空闲链表状态
	struct QueueNode* p= (QueueNode*)malloc(sizeof(QueueNode));  
	p->Node.address = 64; //操作系统占用0~63K空间,所以目前空闲区始址为64
	p->Node.len = 640 - 64;  //空闲区大小为640-64
	InsertQueueNode(q_free, p->Node); 

	//初始化操作系统占用64k后占用链表状态
	struct QueueNode* q = (QueueNode*)malloc(sizeof(QueueNode));
	q->Node.name = 'S';
	q->Node.address = 0; //起初占用表始址为0
	q->Node.len = 64;   //操作系统占用64k
	InsertQueueNode(q_busy, q->Node);
}

int main()
{	
	q_free = (LinkQueue*)malloc(sizeof(LinkQueue));  /* 创建自由链头结点  */
    q_busy = (LinkQueue*)malloc(sizeof(LinkQueue)); /* 创建占用链头结点  */
    
	start();
	past(5); 
	printf("t1时刻后:\n");
	requireMemo('A', 8);
	requireMemo('B', 16);
	requireMemo('C', 64);
	requireMemo('D', 124);
	printlink(q_free);

	past(5); 
	printf("t2时刻后:\n");
	freeMemo('C');
	printlink(q_free);

	past(5); 
	printf("t3时刻后:\n");
	//requireMemo('E', 50);
	requireMemo('E', 364);
	printlink(q_free);

	past(5); 
	printf("t4时刻后:\n");
	freeMemo('D');
	printlink(q_free);

	return 0;
}

void requireMemo(char name, int require) /* 模拟内存分配 */
{
	struct QueueNode* w = q_free->front->next;
	if (w->Node.len<require) //若申请内存空间大于空闲区最大空间
	{
		printf("Can’t allocate"); //内存不足,无法分配
		return; //直接退出
	}

	//申请空间小于或等于空闲区最大空间,则允许申请内存
	struct QueueNode* p = (struct QueueNode*)malloc(sizeof(struct QueueNode));
	p->Node.name = name;
	p->Node.address = w->Node.address; //最大空间始址作为申请空间始址
	p->Node.len = require;
	p->next = NULL;
	InsertQueueNode(q_busy, p->Node);

	//无论申请空间小于或等于空闲区最大空间,都要删除最大空间
	q_free->front->next = w->next; 

	//若申请空间等于最大空间
	if (w->Node.len == require)
	{
		//释放临时结点w
		free(w); 
		return; 
	}
	
	//若申请空间小于最大空间,分配后,需要计算剩余空闲区大小和起始地址
	w->Node.address += require; //始址后移
	w->Node.len -= require;   

	//排序操作
	//如果最大空闲区分配后剩余依然最大,可以直接放在第一个位置,否则和后面的空闲区大小比较放在合适位置
	struct QueueNode* u = q_free->front;
	struct QueueNode* v = u->next;
	while (v && v->Node.len > w->Node.len)
	{
		u = v;
		v = v->next;
	}
	u->next = w;
	w->next = v;
}


void freeMemo(char name)
{
	struct QueueNode* q = q_busy->front;
	struct QueueNode* p = q_busy->front->next;
	
	while (p && p->Node.name != name) 
	{ //查找名字相同的结点
		q = p;
		p = q->next;
	}

	if (!p) //如果为空,说明没有对应结点,直接退出
	{
		printf("%c is not exist", name);
		return;
	}

	//如果找到了,释放申请的内存
	if (p == q_busy->rear)  q_busy->rear = q; 
	int len = p->Node.len; //释放前需要获取该结点的空间大小和始址
	int address = p->Node.address;
	q->next = p->next; //删除结点
	free(p); //释放内存 

	//把上面获取是空间和始址作为空闲内存块插入空闲链表
	struct QueueNode* w= (struct QueueNode*)malloc(sizeof(struct QueueNode));
	w->Node.len = len;
	w->Node.address = address;

	//回收的结点插入到空闲链表合适位置
	struct QueueNode* u = q_free->front;
	struct QueueNode* v = q_free->front->next;
	while (v && v->Node.len > w->Node.len)
	{
		u = v;
		v = v->next;
	}
	u->next = w;
	w->next = v;
}

int past(int time)
{
	return time;
}


void printlink(LinkQueue* q) //打印
{
	struct QueueNode* p = q->front->next;
	while (p) {
		printf("空闲大小%d 起始地址%d\n", p->Node.len, p->Node.address);
		p = p->next;
	}
	printf("\n");
}

void InitQueue(LinkQueue* q) { //初始化头结点
	q->front = q->rear = (QueueNode*)malloc(sizeof(QueueNode));
	q->front->next = NULL;
}

bool IsEmptyQueue(LinkQueue* q) { //判空
	if (q->front == q->rear)
		return true;
	return false;
}

void InsertQueueNode(LinkQueue* q, struct busylink tempNode) { //插入结点
	QueueNode* P = (QueueNode*)malloc(sizeof(QueueNode));
	P->Node = tempNode;
	P->next = NULL;
	q->rear->next = P;
	q->rear = P;
}

例1:
在 t1 时间之后,有作业 A、B、C、D 分别请求 8K、16K、64K、124K 的内存空间;在 t2 时间之后,作业 C 完成;在 t3时间之后,作业 E 请求 50K 的内存空间;在 t4 时间之后,作业 D 完成。实验结果展示:
在这里插入图片描述
例2:
在 t1 时间之后,有作业 A、B、C、D 分别请求 8K、16K、64K、124K 的内存空间;在 t2 时间之后,作业 C 完成;在 t3时间之后,作业 E 请求 364K 的内存空间;在 t4 时间之后,作业 D 完成。实验结果展示:
在这里插入图片描述

非递归算法——快速排序、归并排序 ​哈喽大家好,我是保护小周ღ,本期为大家带来的是常见排序算法中的快速排序、归并排序非递归算法,分享所有源代码,粘贴即可运行,保姆级讲述,包您一看就会,快来试试吧~ ​ 阅读详情

相关推荐

用C语言写的最坏适应算法

用C语言编写的最坏适应算法,大家快下载吧。

Ubuntu22.2下C语言编程实现,首次,最佳适应算法

编写C语言程序,模拟实现首次/最佳/最坏适应算法(选择其中之一即可)的内存块分配和回收,要求每次分配和回收后显示出空闲分区和已分配分区的情况。假设初始状态下,可用的内存空间为640KB。 假设下列作业请求序列: (1)作业1 申请130 KB (2)作业2 申请60 KB (3)作业3 申请100 KB (4)作业2 释放60 KB (5)作业3 释放100 KB (6)作业1 释放130 KB 显示每次作业申请或释放后当前内存情况。

qq_45031509的博客 7245

存储器模拟分配算法 OS实验 操作系统实验 C语言

实验(三)模拟存储器分配算法 1、 实验目的 了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。 2、 实验内容 (1) 用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲分区链来管理;在进行内存分配时,系统优先使用空闲区低端的空间。 (2) 假设初始状态下,可用的内存空间为640KB,并有下列的请求序列:  作业1申请130KB。  作业2申请60KB。  作业3申请100KB。  作业2释放60KB。  作业4申请200KB。  作业3释放100KB。  作业1释放130KB。  作业5申请140KB。  作业6申请60KB。  作业7申请50KB。  作业6释放60KB。 请分别采用首次适应算法和最佳适应算法进行内存块的分配和回收,要求每次分配和回收后显示出空闲内存分区链的情况。 3、 思考 (1) 采用首次适应算法和最佳适应算法,对内存的分配和回收速度有什么不同的影响? (2) 如何解决因碎片而造成内存分配速度降低的问题?

OS实验-模拟实现首次/最佳/最坏适应算法的内存块分配和回收

编写C语言程序,模拟实现首次/最佳/最坏适应算法的内存块分配和回收,要求每次分配和回收后显示出空闲分区和已分配分区的情况。 假设初始状态下,可用的内存空间为640KB。 #include<bits/stdc++.h> #define ll long long using namespace std; const ll maxn=1e18; const ll minn=-1e18; const ll mod=1000000007; const ll MAX=100005; bool cmp(l

Volta小白 7971

最坏适应算法

将所有的空闲分区按其容量从大到小的顺序形成一空闲分区链,查找时只要看第一个分区能否满足作业要求

主存分配 最佳适应算法 最坏适应算法 循环首次适应算法 首次适应算法

操作系统中利用最佳适应算法 最坏适应算法 循环首次适应算法 首次适应算法实现动态内存的分配和回收内存

最坏适应算法的模拟(c++实现)

空闲分区表中的空闲分区按大小从大到小排列,作业调入时会先从表头(下标为0)开始寻找,因此每次分配的都是可以满足作业大小需求的最大空白分区,实现了最坏适应算法的模拟。空闲分区表中的空闲分区按大小从大到小排列,作业调入时会先从表头(下标为0)开始寻找,因此每次分配的都是可以满足作业大小需求的最大空白分区,实现了最坏适应算法的模拟。设置内存总大小为1024KB,进入程序后有四种选项,插入作业请输入1,回收作业请输入0,紧凑请输入2, 查看内存信息请输入3,退出程序请输入4。4)回收功能:对不用的作业进行回收。

falldeep的算法世界 4464

操作系统内存分配算法模拟实现.pdf

操作系统内存分配算法模拟实现.pdf操作系统内存分配算法模拟实现.pdf操作系统内存分配算法模拟实现.pdf操作系统内存分配算法模拟实现.pdf操作系统内存分配算法模拟实现.pdf

分区式存储管理 动态分区最坏适应算法

实验二 分区式存储管理 实验性质:设计 建议学时:2学时 实验目的: 通过这次实验,加深对内存管理的认识,进一步掌握内存的分配、回收算法的思想。 实验内容: 设计程序模拟内存的动态分区法存储管理。内存空闲区使用自由链管理,釆用最坏适应算法从自 由链中寻找空闲区进行分配,内存回收时假定不做与相邻空闲区的合并。 假定系统的内存共640K,初始状态为操作系统本身占用64K。在tl时间之后,有作业A、B、C、 D分别请求8K、16K、64K、124K的内存空间;在t2时间之后,作业C完成;在t3时间之后,作业 E请

leoabcd12的博客 4907

使用 Cadence ams 仿真器 对 混合信号电路 进行仿真

文章目录Cadence 基于ams仿真器的混合信号电路仿真建立数字(Digital)模块建立 Analog - Digital 混合仿真原理图建立 Analog - Digital 混合仿真config文件配置混合信号电路仿真环境针对混合信号电路demo进行仿真 Cadence 基于ams仿真器的混合信号电路仿真 你好,这里是一篇关于使用 Cadence 软件通过 ams 仿真器对混合信号电路(D...

mymatin1004的博客 2万+

badusb详细制作教程(两种方式实现远控)

badusb是一种几乎可以突破任何杀毒软件和防火墙的设备,堪称渗透测试利器 文章目录前言一、什么是badusb?二,badusb的优点三,badusb是如何攻击的?badusb原理HID攻击漏洞产生原因三、准备步骤1.设备2,编辑器的安装与设置四,编写代码(重点)第一种: SEToolkit + badusb实现PowerShell注入攻击第二种:Cobalt Strike + badusb 实现PowerShell注入攻击五,烧录六,badusb有多强大攻击场景总结 BadUSB是《黑客军团》中

Ghost_system的博客 1万+

操作系统 内存分配与回收算法 模拟

<br /><br />#include <iostream>#include <string>using namespace std;const int minsize=3;//最小不能再分隔大小为3struct Node{string name;int s_address;int size;Node *link;};class CLink{public:CLink();//构造函数~CLink();//析构函数const CLink &operator =(const CLink& l);//重载赋值操

Vance的专栏 884

手把手教你用scRNA-seq和scTCR-seq分析CD8⁺ T细胞在免疫治疗中的动态变化

本文详细介绍了如何整合单细胞RNA测序(scRNA-seq)与单细胞TCR测序(scTCR-seq)技术,深入解析CD8⁺ T细胞在癌症免疫治疗中的动态变化。通过从数据预处理、细胞亚群鉴定到TCR克隆追踪的完整分析流程,揭示了T细胞的功能状态转变与克隆演化规律,为理解免疫应答机制和开发精准治疗策略提供了关键方法学指导。

p8q9r0的博客 566

实验四 主存空间的分配和回收模拟

1.实验目的 为了合理地分配和使用这些存储空间,当用户提出申请主存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间和使用情况,找出足够的空闲区域给申请者。当作业撤离归还主存资源时,则存储管理要收回占用的主存空间。主存的分配和回收的实现是与主存储器的管理方式有关的,通过本实验帮助我们理解在不同的存储管理方式下应怎样实现主存空间的分配和回收。 用高级语言完成一个...

aichan6971的博客 375

别再手动填数据了!Vivado里用.coe文件给ROM IP核预装数据的保姆级教程

本文详细介绍了在Vivado中使用.coe文件为ROM IP核预装数据的全流程教程,包括文件格式规范、数据转换技巧和Vivado配置指南。通过自动化数据加载,开发者可以显著提升FPGA开发效率,避免手动输入错误,适用于查找表、波形存储等多种应用场景。

weixin_33377602的博客 337

【FPGA】定点数运算中的位宽优化与截取策略

本文深入探讨了FPGA定点数运算中的核心挑战——数据位宽优化与截取策略。针对定点数在加法、乘法等运算中位宽膨胀的问题,文章详细分析了位宽变化规律,并对比了直接截断、四舍五入和收敛舍入三大截取策略的优缺点及硬件实现方法。通过实战指南与避坑经验,旨在帮助开发者在保证计算精度的同时,高效利用FPGA资源,实现性能与面积的平衡。

weixin_29181861的博客 116

可变分区算法c语言,OS_可变分区的存储管理:C++实现

一、实验目的:加深对可变分区存储管理的理解;提高用C语言编制大型系统程序的能力,特别是掌握C语言编程的难点:指针和指针作为函数参数;掌握用指针实现链表和在链表上的基本操作。二、实验内容:参照教材P123-P125的内容,编写一个C程序,用char *malloc(unsigned size)函数向系统申请一次内存空间(如size=1000,单位为字节),用循环首次适应算法、最佳适应算法和最坏适应算...

weixin_35173650的博客 917

Android HTTPS抓包证书配置全解:Proxyman实战避坑指南

HTTPS抓包本质是中间人(MITM)通信的可信建立过程,其核心在于客户端对代理根证书的信任链配置。在Android平台,自7.0起系统默认不信任用户安装的CA证书,必须通过Network Security Config显式声明trust-anchors,将Proxyman导出的PEM格式根证书纳入App级信任锚点。这一机制区别于iOS和桌面浏览器,导致大量开发者卡在‘证书已安装却无法解密’的误区。技术价值在于打通开发调试闭环:精准定位SSLHandshakeException、绕过证书固定、支持React

weixin_32175665的博客 648

操作系统 动态分区存储管理(最坏分配算法)

文章目录前言一、实验内容二、实验环境三、代码四、结果总结 前言 通过这次实验,加深对内存管理的认识,进一步掌握内存的分配、回收算法的思想 一、实验内容 阅读教材《计算机操作系统》第四章,掌握存储器管理相关概念和原理。 编写程序模拟实现内存的动态分区法存储管理。内存空闲区使用空闲分区链管理,采用最坏适应算法从空闲分区链中寻找空闲区进行分配,内存回收时假定不做与相邻空闲区的合并。 假定系统的内存共640K,初始状态为操作系统本身占用64K。在t1时间之后,有作业A、B、C、D分别请求8K、16K、64K、12.

qq_61705533的博客 2061

【PostgreSQL】PostgreSQL数据库函数比对模板(PG通用)

LOOKUP 函数从单行或单列区域 (区域:工作表上的两个或多个单元格。区域中的单元格可以相邻或不相邻。)或数组 (数组:用于建立可生成多个结果或可对在行和列中排列的一组参数进行运算的单个公式。数组区域共用一个公式;数组常量是用作参数的一组常量。LOOKUP 函数具有两种语法形式:向量形式和数组形式。vlookup查找匹配值超过255个字符显示#Value的解决办法。如果值为错误值 #N/A,则返回 TRUE。

tttzzzqqq2018的博客 1493

输入文件(Example-1.inp)参数解读与获取方法

弹性参数:优先使用默认值(泊松比 0.25、杨氏模量 8×10⁵ bars),或参考区域地质 / 地球物理研究。断层参数:从地震矩反演、GPS 位移反演、地质图 / 震源机制获取(核心参数,需确保准确性)。网格 / 图形参数:根据研究区范围和输出需求调整(步长 / 放大系数等)。

2301_79258000的博客 81

最佳适应分配算法C语言,用C语言模拟内存分区分配管理的最佳适应算法-(8页)-原创力文档...

编写程序模拟实现内存的动态分区法存储管理。内存空闲区使用自由链管理,采用最坏适应算法从自由链中寻找空闲区进行分配,内存回收时要与相邻空闲区的合并。初始状态信息:假定系统的内存共640K,初始状态为操作系统本身占用64K。将要申请内存的作业信息(存储在document/job.txt文件中,当前时间是0。输入:用户打开document/job.txt文件,输入作业信息。处理:模拟时间逐歩增加,每次加...

weixin_32460203的博客 1085

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

OS 动态分区分配方式模拟

1.   设计目的    了解动态分区分配中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。 2.   设计内容        1)用C语言实现采用首次适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端的空间。       2)假设初始状态如下,可用的

Vulcanhy的博客 1727

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

操作系统实验三  可变分区存储管理

实验三 可变分区存储管理 一.实验目的和要求 通过这次实验,加深对内存管理的认识,进一步掌握内存的分配、回收算法的思想。 二.实验目的和要求 阅读教材《计算机操作系统》第四章,掌握存储器管理相关概念和原理。 编写程序模拟实现内存的动态分区法存储管理。内存空闲区使用自由链管理,采用最坏适应算法从自由链中寻找空闲区进行分配,内存回收时假定不做与相邻空闲区的合并。 假定系统的内存共640K...

雪之下 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【操作系统】实验四 主存空间的分配和回收

1.实验目的 用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解。 2.实验要求 采用连续分配方式之动态分区分配存储管理,使用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法4种算法完成设计(任选两种算法)。 (1)设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。 (2)或在程序运行过程,由用户指定申请与...

weixin_30629653的博客 855

39,叶慧敏 实验四 主存空间的分配和回收模拟

一、 实验目的 为了合理地分配和使用这些存储空间,当用户提出申请主存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间和使用情况,找出足够 的空闲区域给申请者。当作业撤离归还主存资源时,则存储管理要收回占用的主存空间。主存的分配和回收的实现是与主存储器的管理方式有关的,通过本实验帮助 我们理解在不同的存储管理方式下应怎样实现主存空间的分配和回收。 用高级语言完成一个主存空间的分...

weixin_30367945的博客 125
上一篇: QT+MYSQL实现图书管理系统
下一篇: C语言模拟OS虚拟内存页面置换算法OPT+FIFO+LRU
原创达人
博客等级 码龄8年 42粉丝 11原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值