如何进行windows操作系统动态分区分配方式原理详解与代码测试
发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,这期内容当中小编将会给大家带来有关如何进行windows操作系统动态分区分配方式原理详解与代码测试,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。操作系统的动态分区分
千家信息网最后更新 2025年11月13日如何进行windows操作系统动态分区分配方式原理详解与代码测试
这期内容当中小编将会给大家带来有关如何进行windows操作系统动态分区分配方式原理详解与代码测试,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
操作系统的动态分区分配方式是操作系统中存储器管理中连续分配方式的其中一种,另外三种分配方式分别是:单一连续分配、固定分区分配、动态分区分配、动态重定位分区分配。连续分配方式,是指为一个用户程序分配一个连续的内存空间。
内容:
(1).用C或其他语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程和回收过程。
(2).设置初始状态,每次分配和回收后显示出空闲内存分区链的情况。
原理:
源代码(只进行了小规模的数据测验):
#include#include #define SIZE 640 // 内存初始大小#define MINSIZE 5 // 碎片最小值enum STATE { Free, Busy };struct subAreaNode { intaddr; // 起始地址 intsize; // 分区大小 inttaskId; //作业号 STATEstate; //分区状态 subAreaNode *pre; // 分区前向指针 subAreaNode *nxt; // 分区后向指针}subHead;// 初始化空闲分区链void intSubArea(){ //分配初始分区内存 subAreaNode *fir = (subAreaNode*)malloc(sizeof(subAreaNode)); //给首个分区赋值 fir->addr = 0; fir->size = SIZE; fir->state = Free; fir->taskId = -1; fir->pre =&subHead; fir->nxt =NULL; //初始化分区头部信息 subHead.pre = NULL; subHead.nxt = fir;}// 首次适应算法int firstFit(int taskId, int size){ subAreaNode *p = subHead.nxt; while(p!= NULL) { if(p->state ==Free && p->size>= size) { // 找到要分配的空闲分区 if(p->size - size<= MINSIZE) { //整块分配 p->state = Busy; p->taskId = taskId; } else { //分配大小为size的区间 subAreaNode *node = (subAreaNode*)malloc(sizeof(subAreaNode)); node->addr = p->addr +size; node->size = p->size -size; node->state = Free; node->taskId = -1; //修改分区链节点指针 node->pre = p; node->nxt = p->nxt; if(p->nxt != NULL) { p->nxt->pre =node; } p->nxt = node; //分配空闲区间 p->size = size; p->state = Busy; p->taskId = taskId; } printf("内存分配成功!n"); return 1; } p =p->nxt; } printf("找不到合适的内存分区,分配失败...n"); return0;}// 最佳适应算法int bestFit(int taskId, int size){ subAreaNode *tar = NULL; inttarSize = SIZE + 1; subAreaNode *p = subHead.nxt; while(p!= NULL) { // 寻找最佳空闲区间 if(p->state ==Free && p->size>= size &&p->size < tarSize) { tar = p; tarSize = p->size; } p =p->nxt; } if(tar!= NULL) { // 找到要分配的空闲分区 if(tar->size -size <= MINSIZE) { //整块分配 tar->state = Busy; tar->taskId = taskId; } else { //分配大小为size的区间 subAreaNode *node = (subAreaNode*)malloc(sizeof(subAreaNode)); node->addr = tar->addr +size; node->size = tar->size -size; node->state = Free; node->taskId = -1; //修改分区链节点指针 node->pre = tar; node->nxt = tar->nxt; if(tar->nxt != NULL) { tar->nxt->pre =node; } tar->nxt = node; //分配空闲区间 tar->size = size; tar->state = Busy; tar->taskId = taskId; } printf("内存分配成功!n"); return 1; } else{ // 找不到合适的空闲分区 printf("找不到合适的内存分区,分配失败...n"); return 0; }}// 回收内存int freeSubArea(int taskId){ intflag = 0; subAreaNode *p = subHead.nxt, *pp; while(p!= NULL) { if(p->state ==Busy && p->taskId ==taskId) { flag = 1; if((p->pre !=&subHead &&p->pre->state ==Free) && (p->nxt != NULL&&p->nxt->state == Free)) { //情况1:合并上下两个分区 //先合并上区间 pp =p; p =p->pre; p->size += pp->size; p->nxt = pp->nxt; pp->nxt->pre = p; free(pp); //后合并下区间 pp =p->nxt; p->size += pp->size; p->nxt = pp->nxt; if(pp->nxt != NULL) { pp->nxt->pre = p; } free(pp); } else if((p->pre ==&subHead ||p->pre->state == Busy) && (p->nxt != NULL&&p->nxt->state == Free)) { //情况2:只合并下面的分区 pp =p->nxt; p->size += pp->size; p->state = Free; p->taskId = -1; p->nxt = pp->nxt; if(pp->nxt != NULL) { pp->nxt->pre = p; } free(pp); } else if((p->pre !=&subHead &&p->pre->state == Free) && (p->nxt == NULL|| p->nxt->state == Busy)){ //情况3:只合并上面的分区 pp =p; p =p->pre; p->size += pp->size; p->nxt = pp->nxt; if(pp->nxt != NULL) { pp->nxt->pre = p; } free(pp); } else { //情况4:上下分区均不用合并 p->state = Free; p->taskId = -1; } } p =p->nxt; } if(flag== 1) { // 回收成功 printf("内存分区回收成功...n"); return 1; } else{ // 找不到目标作业,回收失败 printf("找不到目标作业,内存分区回收失败...n"); return 0; }}// 显示空闲分区链情况void showSubArea(){ printf("*********************************************n"); printf("** 当前的内存分配情况如下: **n"); printf("*********************************************n"); printf("** 起始地址 | 空间大小 | 工作状态 | 作业号 **n"); subAreaNode *p = subHead.nxt; while(p!= NULL) { printf("**-----------------------------------------**n"); printf("**"); printf("%d k |", p->addr); printf("%d k |", p->size); printf(" %s |", p->state == Free ? "Free": "Busy"); if(p->taskId> 0) { printf("%d ", p->taskId); } else { printf(" "); } printf("**n"); p =p->nxt; } printf("*********************************************n");}int main(){ intoption, ope, taskId, size; //初始化空闲分区链 intSubArea(); //选择分配算法 while(1) { printf("请选择要模拟的分配算法: 0 表示首次适应算法,1 表示最佳适应算法n"); scanf("%d",&option); if(option == 0) { printf("你选择了首次适应算法,下面进行算法的模拟n"); break; } else if(option == 1){ printf("你选择了最佳适应算法,下面进行算法的模拟n"); break; } else { printf("错误:请输入 0/1nn"); } } //模拟动态分区分配算法 while(1) { printf("n"); printf("*********************************************n"); printf("** 1: 分配内存 2:回收内存 0: 退出 **n"); printf("*********************************************n"); scanf("%d",&ope); if(ope == 0)break; if(ope == 1) { // 模拟分配内存 printf("请输入作业号: "); scanf("%d", &taskId); printf("请输入需要分配的内存大小(KB): "); scanf("%d", &size); if(size <= 0) { printf("错误:分配内存大小必须为正值n"); continue; } // 调用分配算法 if(option == 0) { firstFit(taskId, size); } else { bestFit(taskId, size); } // 显示空闲分区链情况 showSubArea(); } else if(ope == 2){ // 模拟回收内存 printf("请输入要回收的作业号: "); scanf("%d", &taskId); freeSubArea(taskId); // 显示空闲分区链情况 showSubArea(); } else { printf("错误:请输入 0/1/2n"); } } printf("分配算法模拟结束n"); return0;}
上述就是小编为大家分享的如何进行windows操作系统动态分区分配方式原理详解与代码测试了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。
分配
内存
算法
空闲
情况
动态
大小
方式
区间
作业
输入
操作系统
系统
成功
指针
选择
原理
合适
内容
状态
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
江西人社app服务器虚拟主机
软件开发维护专业术语
HCNA网络技术实验指南最新版
手机app服务器关闭怎么登录
网络安全有的证书
骨干网直联点网络安全
网络安全风险防控宣传活动
如果网络安全问题
软件开发最新技术有哪些
监控系统软件开发集成
移动互联网科技小镇
我的世界1.16.4生存服务器
本地服务器连接不上什么意思
先优化数据库还是先清理磁盘
服务器安装什么路由器
12123 服务器
云客网络技术有限公司怎么样
路由器网络技术新革新
荣耀手机服务器还是华为吗
tcp ip网络安全测试
江苏特色软件开发厂家报价
从零基础到软件开发
网络安全主持词开场白
2288hv5服务器内存扩容
谷歌邮箱接收服务器密码
购买服务器有什么影响
山东沃力生物科技互联网电商平台
搭建服务器需要掌握什么语言
cs起源添加服务器
网安大队开展网络安全监督检查