• 操作系统第5次实验报告:内存管理


    姓名:林伟强

    学号:201821121010

    班级:计算1811

    1. 记录内存空间使用情况

    具体

    typedef struct LNode{
    int address;//表示该分区的起始地址
    int length; //表示该分区的长度
    int state; //0表示该分区空闲,1表示该分区已分配
    int number; //进程号码  这里不用名称
    struct LNode *next;
    }*pLNode;

    2. 记录空闲分区

    state表示空闲分区,空闲区合并空闲分区

    void Merge_free(pLNode L) {
    pLNode p = L,pre;
    int num = 0;//用于检测连续空闲内存空间数量,等于2表示有连续的内存空间
    while (p != NULL) {
    if (p->state == 0) {

    num++;
    if (num == 1)
    pre = p;//为合并做准备
    else if (num == 2) {
    pre->length += p->length;
    pre->next = p->next;
    free(p);
    p = pre;
    num = 1;
    }
    }
    else if (p->state == 1)
    num = 0;
    p = p->next;
    }
    }

    3. 内存分配算法

    该方法为首次适配算法

    首次适应算法从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法目的在于减少查找时间。为适应这种算法,空闲分区表(空闲区链)中的空闲分区要按地址由低到高进行排序。该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高地址空间保留大的空闲区。

    void Allocation(pLNode L, int len, int num) {
    pLNode p = L->next;
    while (p != NULL) {
    if (p->state == 0) {
    if (p->length > len) {


    pLNode l = (pLNode)malloc(sizeof(PLNode));
    l->length = p->length - len;
    l->address = p->address + len;
    l->state = 0;
    l->number = 0;
    l->next = p->next;
    p->next = l;
    p->length = len;
    p->number = num;
    p->state = 1;
    printf("内存分配成功! ");
    return;
    }
    else if (p->length == len) {
    p->number = num;
    p->state = 1;
    printf("内存分配成功! ");
    return;
    }
    }
    p = p->next;
    }
    printf("内存分配失败,没有找到合适的空闲内存块 ");
    }

    4. 内存释放算法

    void Revocation(pLNode L, int num) {
    pLNode p = L->next;
    while(p!=NULL){
    if(p->number==num){
    p->state = 0;
    p->number=0;
    printf("成功释放编号为%d的内存! ", num);
    }
    p=p->next;
    }

    }

    void Merge_free(pLNode L) {
    pLNode p = L,pre;
    int num = 0;//用于检测连续空闲内存空间数量,等于2表示有连续的内存空间
    while (p != NULL) {
    if (p->state == 0) {

    num++;
    if (num == 1)
    pre = p;//为合并做准备
    else if (num == 2) {
    pre->length += p->length;
    pre->next = p->next;
    free(p);
    p = pre;
    num = 1;
    }
    }
    else if (p->state == 1)
    num = 0;
    p = p->next;
    }
    }

    5. 运行结果

    (1)产生测果

    (2)解释结果

    如上图所示,每次内存释放时会将内存块状态变为空闲,并且把进程改为无无进程状态

    每次分配会从空闲的内存下找出合适位置分配例如最后一个内存3的情况

    它是在2和1中间添加进入,因为自身的内存块长度为83在添加进去之后还有10的空闲空间在3和1之间

    每一次的进程释放都要进行一次判断有无2个空闲块在一起如果有进行合并这就是Merge_free(pLNode L) 的作用

  • 相关阅读:
    JAVA SkipList 跳表 的原理和使用例子
    TreeMap、HashMap、ConcurrentSkipListMap之性能比较
    CompletionService 和ExecutorService的区别和用法
    1. java.util.concurrent
    JAVA Concurrent包 中的并发集合类
    并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
    Objective-C中 ==、isEqual、isEqualToString判断字符串相等
    设置UIButton的文字显示位置、字体的大小、字体的颜色
    9个完整android开源app项目
    android 开源项目集合
  • 原文地址:https://www.cnblogs.com/hxrlwq13/p/12892343.html
Copyright © 2020-2023  润新知