C语言操作系统实战:动态分区分配方式

文章详细介绍了动态分区分配中的首次适应和最佳适应算法,提供了这两种算法的C语言实现,并通过一个具体的请求序列展示了内存分配和回收的过程。首次适应算法从低地址开始寻找,可能导致大空间被小进程占用;最佳适应算法则寻找最小的空闲分区,可能导致大量碎片。文章还给出了每种算法执行后的空闲分区链状态。
摘要由CSDN通过智能技术生成

问题描述:

了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式机器实现过程的理解。

  1. 用高级语言实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc( )和回收过程free( )。其中,空闲分区通过空闲分区链来管理;在进行内存分配时,系统优先使用空闲区低端的空间。
  2. 假设初始状态下可用内存空间为640KB,并有下列的请求序列:
  1. 作业1申请130KB
  2. 作业2申请60KB
  3. 作业3申请100KB
  4. 作业2释放60KB
  5. 作业4申请200KB
  6. 作业3释放100KB
  7. 作业1释放130KB
  8. 作业5申请140KB
  9. 作业6申请60KB
  10. 作业7申请50KB
  11. 作业6释放60KB

请分别采用首次适应算法和最佳适应算法进行内存块的分配和回收,要求每次分配和回收后显示出空闲分区链的情况。

问题分析:

首次适应算法:每次都从低地址开始查找,找到第一个满足大小的空闲分区。
实现方式:

空闲分区以地址递增的顺序(这里并不是地址空间的大小)的次序排列。每次分配内存时顺序查找空闲分区链(或是空闲分区表),找到空间大小能满足要求的第一个空闲分区。

可能产生的问题:

由于匹配的地址空间大小为第一个满足要求的地址空间,这就会导致大的地址空间被小进程占据,使得大进程到来时没有满足要求的地址空间,发生系统中断。

图形解释:

                                                                图1.首次适应性算法

 代码:
// 首次适应算法分配内存
void* firstFitAlloc(int size) {
    MemoryBlock* currentBlock = freeList;
    
    while (currentBlock != NULL) {
        if (currentBlock->isFree && currentBlock->size >= size) {
            // 找到合适的空闲分区
            currentBlock->isFree = 0;
            
            if (currentBlock->size > size) {
                // 分割分区
                MemoryBlock* newBlock = (MemoryBlock*)malloc(sizeof(MemoryBlock));
                newBlock->startAddress = currentBlock->startAddress + size;
                newBlock->size = currentBlock->size - size;
                newBlock->isFree = 1;
                newBlock->next = currentBlock->next;
                
                currentBlock->size = size;
                currentBlock->next = newBlock;
            }
            
            return (void*)(currentBlock->startAddress);
        }
        
        currentBlock = currentBlock->next;
    }
    
    // 没有可用的空闲分区
    return NULL;
}
最佳适应性算法:每次从小的地址空间开始查找,找到第一个满足大小的空闲分区。
实现方法:

空闲分区按地址空间大小递增次序排列,每次分配时按顺序查找相关满足要求的地址空间即可。即可以找到尽可能小的但是满足要求的空闲分区。

可能出现的问题:

由于每次匹配的尽可能小的且满足地址空间要求的,就会导致地址空间可能会被切割成很多过小的地址空间碎片而无法被利用。

图形解释:

 代码:
// 最佳适应算法分配内存
void* bestFitAlloc(int size) {
    MemoryBlock* bestBlock = NULL;
    MemoryBlock* currentBlock = freeList;
    
    while (currentBlock != NULL) {
        if (currentBlock->isFree && currentBlock->size >= size) {
            if (bestBlock == NULL || currentBlock->size < bestBlock->size) {
                // 更新最佳分区
                bestBlock = currentBlock;
            }
        }
        
        currentBlock = currentBlock->next;
    }
    
    if (bestBlock != NULL) {
        bestBlock->isFree = 0;
        
        if (bestBlock->size > size) {
            // 分割分区
            MemoryBlock* newBlock = (MemoryBlock*)malloc(sizeof(MemoryBlock));
            newBlock->startAddress = bestBlock->startAddress + size;
            newBlock->size = bestBlock->size - size;
            newBlock->isFree = 1;
            newBlock->next = bestBlock->next;
            
            bestBlock->size = size;
            bestBlock->next = newBlock;
        }
        
        return (void*)(bestBlock->startAddress);
    }
    
    // 没有可用的空闲分区
    return NULL;
}

完整代码:

#include <stdio.h>
#include <stdlib.h>
// 定义内存块结构
typedef struct MemoryBlock {
    int startAddress;
    int size;
    int isFree;
    struct MemoryBlock* next;
} MemoryBlock;

// 定义全局变量,表示内存大小和空闲分区链表头节点
int memorySize;
MemoryBlock* freeList;

// 初始化内存分区
void initializeMemory(int size) {
    memorySize = size;
    // 创建初始的空闲分区
    MemoryBlock* initialBlock = (MemoryBlock*)malloc(sizeof(MemoryBlock));
    initialBlock->startAddress = 0;
    initialBlock->size = size;
    initialBlock->isFree = 1;
    initialBlock->next = NULL;
    freeList = initialBlock;
}
// 首次适应算法分配内存
void* firstFitAlloc(int size) {
    MemoryBlock* currentBlock = freeList;
    
    while (currentBlock != NULL) {
        if (currentBlock->isFree && currentBlock->size >= size) {
            // 找到合适的空闲分区
            currentBlock->isFree = 0;
            
            if (currentBlock->size > size) {
                // 分割分区
                MemoryBlock* newBlock = (MemoryBlock*)malloc(sizeof(MemoryBlock));
                newBlock->startAddress = currentBlock->startAddress + size;
                newBlock->size = currentBlock->size - size;
                newBlock->isFree = 1;
                newBlock->next = currentBlock->next;
                
                currentBlock->size = size;
                currentBlock->next = newBlock;
            }
            
            return (void*)(currentBlock->startAddress);
        }
        
        currentBlock = currentBlock->next;
    }
    
    // 没有可用的空闲分区
    return NULL;
}

// 最佳适应算法分配内存
void* bestFitAlloc(int size) {
    MemoryBlock* bestBlock = NULL;
    MemoryBlock* currentBlock = freeList;
    
    while (currentBlock != NULL) {
        if (currentBlock->isFree && currentBlock->size >= size) {
            if (bestBlock == NULL || currentBlock->size < bestBlock->size) {
                // 更新最佳分区
                bestBlock = currentBlock;
            }
        }
        
        currentBlock = currentBlock->next;
    }
    
    if (bestBlock != NULL) {
        bestBlock->isFree = 0;
        
        if (bestBlock->size > size) {
            // 分割分区
            MemoryBlock* newBlock = (MemoryBlock*)malloc(sizeof(MemoryBlock));
            newBlock->startAddress = bestBlock->startAddress + size;
            newBlock->size = bestBlock->size - size;
            newBlock->isFree = 1;
            newBlock->next = bestBlock->next;
            
            bestBlock->size = size;
            bestBlock->next = newBlock;
        }
        
        return (void*)(bestBlock->startAddress);
    }
    
    // 没有可用的空闲分区
    return NULL;
}

// 释放内存
void freeMemory(void* address) {
    MemoryBlock* currentBlock = freeList;
    MemoryBlock* previousBlock = NULL;
    
    while (currentBlock != NULL) {
        if (currentBlock->startAddress == (int)address) {
            // 找到对应的分区
            currentBlock->isFree = 1;
            
            // 合并相邻的空闲分区
            if (previousBlock != NULL && previousBlock->isFree) {
                previousBlock->size += currentBlock->size;
                previousBlock->next = currentBlock->next;
                free(currentBlock);
                currentBlock = previousBlock;
            }
            
            if (currentBlock->next != NULL && currentBlock->next->isFree) {
                currentBlock->size += currentBlock->next->size;
                MemoryBlock* temp = currentBlock->next;
                currentBlock->next = currentBlock->next->next;
                free(temp);
            }
            
            return;
        }
        
        previousBlock = currentBlock;
        currentBlock = currentBlock->next;
    }
}

// 打印空闲分区链表
void printFreeList() {
    MemoryBlock* currentBlock = freeList;
    
    char is_free[100]={};
    int i=0;
	while (currentBlock !=NULL){
    	if (currentBlock->isFree==0){
    		is_free[i]='N';
    		i++;
    	}
    	else{
    		is_free[i]='Y';
    		i++;
    	}
    	currentBlock=currentBlock->next;
    } 
    currentBlock=freeList;
    i=0;
    while (currentBlock != NULL) {
        printf("地址: %d, 空间大小: %d, 是否空闲: %c\n", currentBlock->startAddress, currentBlock->size, is_free[i]);
        i++;
		currentBlock = currentBlock->next;
    }
    
    printf("\n");
}

int main() {
    initializeMemory(640);  // 初始化内存大小为640KB
    
    printf("初始状态下的空闲分区链情况:\n");
    printFreeList();
    
    
    // 请求序列    首次适应算法 
    ///*
	printf("\n\n---------------最先适应算法---------------\n\n"); 
    void* address1 = firstFitAlloc(130);
    printf("作业1申请130KB后的空闲分区链情况:\n");
    printFreeList();
    
    void* address2 = firstFitAlloc(60);
    printf("作业2申请60KB后的空闲分区链情况:\n");
    printFreeList();
    
    void* address3 = firstFitAlloc(100);
    printf("作业3申请100KB后的空闲分区链情况:\n");
    printFreeList();
    
    freeMemory(address2);
    printf("作业2释放60KB后的空闲分区链情况:\n");
    printFreeList();
    
    void* address4 = firstFitAlloc(200);
    printf("作业4申请200KB后的空闲分区链情况:\n");
    printFreeList();
    
    freeMemory(address3);
    printf("作业3释放100KB后的空闲分区链情况:\n");
    printFreeList();
    
    freeMemory(address1);
    printf("作业1释放130KB后的空闲分区链情况:\n");
    printFreeList();
    
    void* address5 = firstFitAlloc(140);
    printf("作业5申请140KB后的空闲分区链情况:\n");
    printFreeList();
    
    void* address6 = firstFitAlloc(60);
    printf("作业6申请60KB后的空闲分区链情况:\n");
    printFreeList();
    
    void* address7 = firstFitAlloc(50);
    printf("作业7申请50KB后的空闲分区链情况:\n");
    printFreeList();
    
    freeMemory(address6);
    printf("作业6释放60KB后的空闲分区链情况:\n");
    printFreeList();
	//*/

	//请求序列    最佳适应算法 
	/*printf("\n\n---------------最佳适应算法---------------\n\n"); 
	void* address1 = bestFitAlloc(130);
    printf("作业1申请130KB后的空闲分区链情况:\n");
    printFreeList();
    
    void* address2 =bestFitAlloc(60);
    printf("作业2申请60KB后的空闲分区链情况:\n");
    printFreeList();
    
    void* address3 =bestFitAlloc(100);
    printf("作业3申请100KB后的空闲分区链情况:\n");
    printFreeList();
    
    freeMemory(address2);
    printf("作业2释放60KB后的空闲分区链情况:\n");
    printFreeList();
    
    void* address4 = bestFitAlloc(200);
    printf("作业4申请200KB后的空闲分区链情况:\n");
    printFreeList();
    
    freeMemory(address3);
    printf("作业3释放100KB后的空闲分区链情况:\n");
    printFreeList();
    
    freeMemory(address1);
    printf("作业1释放130KB后的空闲分区链情况:\n");
    printFreeList();
    
    void* address5 = bestFitAlloc(140);
    printf("作业5申请140KB后的空闲分区链情况:\n");
    printFreeList();
    
    void* address6 = bestFitAlloc(60);
    printf("作业6申请60KB后的空闲分区链情况:\n");
    printFreeList();
    
    void* address7 = bestFitAlloc(50);
    printf("作业7申请50KB后的空闲分区链情况:\n");
    printFreeList();
    
    freeMemory(address6);
    printf("作业6释放60KB后的空闲分区链情况:\n");
    printFreeList();     
    */
    return 0;
}

运行结果:

首次适应算法

 

 最佳适应算法

 

 

 

 声明:

图片来源于:3.1_5_动态分区分配算法_哔哩哔哩_bilibili

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值