如何进行windows操作系统动态分区分配方式原理详解与代码测试
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这期内容当中小编将会给大家带来有关如何进行windows操作系统动态分区分配方式原理详解与代码测试,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。操作系统的动态分区分
千家信息网最后更新 2025年01月19日如何进行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安全错误
数据库的锁怎样保障安全
网络安全画报.doc
网络安全问题100道
科迅软件开发
服务器哪里可以买到cpu
演讲稿 网络安全教育
方舟生存进化服务器的部落大战
金山区机械软件开发试验设备
高并发导致数据库查询超时
现代网络技术sdn
经济对计算机网络技术的作用
数据库idx排列
数据库有哪五个部分
华为服务器怎么查序列号
sql数据库读写比例
服务器硬件测试
定制软件开发哪家好嘉兴
Android天气软件开发
青岛丰荷互联网络科技有限公司
tcl科技工业互联网
网络安全周宣传通知
java数据库和java
技术级网络技术学什么
软件开发风险分析怎么写
tbc霜语服务器pdd
复古传奇怎么加入服务器
贵阳网络展厅中控服务器
用户下单后数据库检验
域名加数据库做个人博客
关于网络安全的利和弊短篇
邮箱收件服务器gmail