操作系统模拟内存管理实验,C语言链表实现,附源码

本文通过C语言实现操作系统中的内存管理模拟,探讨了内存物理空间划分、内存分配、段表地址映射以及内存分配算法等核心概念,并附带源代码供读者参考。
摘要由CSDN通过智能技术生成

首先理解这几个概念

1. 内存物理空间的划分

    内存空间被动态的划分为若干个长度不相同的 物理段, 每个物理段由起始地址和长度确定。 

2. 内存分配

    以段为单位分配内存, 每个段在内存中占据连续 空间(内存随机分割, 需要多少分配多少), 但各段之间 可以不连续存放。 

3.通过段表进行地址映射

    段表记录各段的首(地)址和长度 

4.内存的分配算法

    首先适配(FF);最佳适配(BF);最坏适配(WF);

    首次适配算法:(特点:简单、快速分配) 
        当接到内存申请时, 查空闲块表(按地址有序), 找 到第一个不小于请求的空块, 将其分割并分配。 

    最佳适配算法: (特点:用最小空间满足要求)
        接到内存申请时, 在空闲块表(按容量递增有序) 中找到一个不小于请求的最小空块进行分配。 

    最坏适配算法: (特点:分割后空闲块仍较大)       
        接到内存申请时, 在空闲块表(按容量递减有序) 中找到一个不小于请求的最大空块进行分配。 
#include<stdio.h>
#include<stdlib.h>

//常量
#define PROCESS_NAME_LEN 32     //进程名长度
#define MIN_SLICE 10            //最小碎片大小
#define DEFAULT_MEM_SIZE 1024   //内存大小
#define DEFAULT_MEM_START 0     //起始位置

//内存分配算法
#define MA_FF 1
#define MA_BF 2
#define MA_WF 3

int mem_size = DEFAULT_MEM_SIZE;    //内存大小
int ma_algorithm = MA_FF;           //当前算法
static int pid = 0;                 //初始化pid
int flag = 0;                       //设置内存大小标志

//函数声明
int display_menu();         //展示功能菜单
int set_mem_size();         //设置申请内存空间大小 
int set_algorithm();        //设置算法 
int rearrange_FF();         //首次适配算法 
int rearrange_BF();         //最优适配算法 
int rearrange_WF();         //最坏适配算法 

int kill_process();         //删除进程,归还分配的储存空间
int do_exit();              //退出程序,释放空间 
int display_mem_usage() ;   //显示当前内存的使用情况,包括空闲区和已经分配的情况
int rearrange(int algorithm) ;              //选择算法 
int free_mem(struct get_block *ab);     //释放链表 
int allocate_mem(struct get_block *ab);     //分配内存模块 
int dispose(struct get_block* free_ab);     //处理free后的链表 

int FF();           //按地址由低到高排序 
int BF();           //按内存大小由小到大排序 
int WF();           //按内存大小由大到小排序 
struct get_block* find_process(int pid);            //按pid找到需要释放的链表节点 
struct free_block* init_free_block(int mem_size);   //初始化空闲块 

//内存空闲分区
struct free_block {
    int size;
    int start_addr;
    struct free_block* next;
};
struct free_block* free_b;//内存空闲块来链表的首指针


//分配到内存块的描述
struct get_block {
    int pid;
    int size;
    int start_addr;
    char process_name[PROCESS_NAME_LEN];
    struct get_block* next;
};
struct get_block* get_block_head = NULL; //进程分配内存块链表的首指针

struct free_block*  init_free_block(int mem_size) {
    struct free_block *fb,*ptemp;
    get_block_head = (struct get_block*)malloc(sizeof(struct get_block));
    fb = (struct free_block*)malloc(sizeof(struct free_block));
    ptemp=(struct free_block*)malloc(sizeof(struct free_block));
    if (fb == NULL) {
        printf("No nen \n");
    }
    get_block_head->next=NULL;
    fb->next=ptemp;
    ptemp->size = mem_size;
    ptemp->start_addr = DEFAULT_MEM_START;
    ptemp->next = NULL;
    return fb;
}

int  display_menu()
{
    
  • 6
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值