• 实验四 主存空间的分配和回收


     

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define SIZE_MIN 2
    #define MEMSIZE_MAX 1024
    #define FALSE 0
    #define TRUE !FALSE /*采用最佳分配法*/
    typedef int BOOL;
    typedef struct _MEM_LINK
    {
    char cName; /*作业名*/
    int iStartAddr; /*分区起始地址*/
    int iMemSize; /*分区大小*/
    BOOL iState; /*分区状态,1表示已分配, 0表示未分配*/
    struct _MEM_LINK* next;
    }
    MEM_LINK, *PMEM_LINK;
    PMEM_LINK g_pslnkHead; /*初始化内存使用情况*/
    void init()
    {
    g_pslnkHead=(PMEM_LINK)malloc(sizeof(MEM_LINK));
    memset(g_pslnkHead, 0, sizeof(MEM_LINK));
    g_pslnkHead->iMemSize = MEMSIZE_MAX;
    }
    int menu()
    {
    int i;
    printf(" 1. 分配内存 ");
    printf("2. 回收内存 ");
    printf("3. 显示内存使用情况 ");
    printf("4. 退出 ");
    printf(" 请输入选择:");
    scanf("%d",&i);
    getchar();
    return(i);
    }

    
    

    /*分配内存函数,c为作业名,usize是要分配的大小*/
    int my_malloc(char c,int usize)
    {
    PMEM_LINK psNewMem = NULL,
    plnkTmp = NULL;
    BOOL bRepeatName = FALSE;
    int iTmp = g_pslnkHead->iMemSize - usize*SIZE_MIN;
    if (iTmp <= 0) /* 如果没有足够的空间分配 */
    return FALSE;
    plnkTmp = g_pslnkHead;
    while (plnkTmp != NULL)
    {
    if (plnkTmp->cName == c)
    {
    bRepeatName = TRUE;
    break;
    }
    plnkTmp = plnkTmp->next;
    }
    if (bRepeatName) /* 如果作业名重复 */
    {
    return FALSE;
    } /* 创建新的节点 */
    psNewMem = (PMEM_LINK)malloc(sizeof(MEM_LINK)); /* 结构体设零 */
    memset(psNewMem, 0, sizeof(MEM_LINK)); /* 设置节点内容 */
    psNewMem->cName = c;
    psNewMem->iMemSize = usize*SIZE_MIN;
    psNewMem->iStartAddr= MEMSIZE_MAX - g_pslnkHead->iMemSize;
    psNewMem->iState = TRUE;
    plnkTmp = g_pslnkHead; /* 查找链表最尾节点 */
    while (plnkTmp->next != NULL)
    plnkTmp = plnkTmp->next; /* 把新创建的节点加入到链表中 */
    plnkTmp->next = psNewMem; /* 在整体内存中去掉以分配的部分 */
    g_pslnkHead->iMemSize -= usize*SIZE_MIN;
    return TRUE;
    } /*回收内存函数,c是撤销的进程的作业名;*/
    int my_free(char c)
    {
    PMEM_LINK plnkBK = g_pslnkHead, /* 保留上次搜索的节点 */
    plnkTmp = g_pslnkHead->next;
    BOOL bFind = FALSE;
    int iFreeSize = 0; /* 搜索链表 */
    while (plnkTmp != NULL)
    {
    if (plnkTmp->cName == c)
    { /* 如果找到节点,退出循环 */
    bFind = TRUE;
    break;
    }
    plnkBK = plnkTmp;
    plnkTmp = plnkTmp->next;
    }
    if (bFind)
    { /* 把找到的节点从链表中摘除并释放 */
    g_pslnkHead->iMemSize += plnkTmp->iMemSize;
    plnkBK->next = plnkTmp->next;
    /* 保留要释放内存的大小 */
    iFreeSize = plnkTmp->iMemSize; /* 释放 */
    free(plnkTmp); /* 把未释放内存的开始地址提前, 防止内存碎片 */
    plnkTmp = plnkBK->next;
    while (plnkTmp != NULL)
    {
    plnkTmp->iStartAddr -= iFreeSize;
    plnkTmp = plnkTmp->next;
    }
    }
    return bFind;
    }
    void disp()
    {
    PMEM_LINK pTmp;
    int i = 0;
    pTmp = g_pslnkHead;
    printf(" 分区号 作业名 起始地址 分区大小 状态");
    while(pTmp)
    {
    printf(" %4d %c %4d %4d %4d", i, pTmp->cName, pTmp->iStartAddr, pTmp->iMemSize, pTmp->iState);
    pTmp = pTmp->next;
    i++;
    }
    }
    void main()
    {
    int i;
    char c;
    init();
    i = menu();
    while (i!=4)
    {
    if (i==1)
    {
    printf(" 作业名(一个字符):");
    scanf("%c",&c);
    printf("作业占内存大小:");
    scanf("%d", &i);
    if(my_malloc(c,i))
    printf(" 分配成功!!!");
    else printf(" 分配失败!!!");
    }
    else if (i==2)
    {
    printf(" 输入要回收分区的作业名(一个字符):");
    scanf("%c",&c);
    if(my_free)
    printf(" 回收成功!!!");
    else printf(" 回收失败!!!");
    }
    else if(i==3)
    disp();
    i = menu();
    }
    }

    
    
  • 相关阅读:
    2019春第十一周作业
    2019春第十周作业
    2019春第九周作业
    2019春第八周作业
    2019春第七周作业
    2019春第六周作业
    寒假作业一:打印沙漏
    寒假作业三:抓老鼠啊亏了~还是赚了?
    寒假作业二:币值转换
    秋季学期学习总结
  • 原文地址:https://www.cnblogs.com/dalaotan/p/5593653.html
Copyright © 2020-2023  润新知