helrld 2022-11-17 17:39 采纳率: 66.7%
浏览 35
已结题

不进入main/程序不执行?

问题遇到的现象和发生背景

用WinSCP在华为云服务器运行程序,没有任何输出;在main()函数第一行printf也没有输出

用代码块功能插入代码,请勿粘贴截图
我的解答思路和尝试过的方法

求看一看是什么方面的问题

我想要达到的结果
#include <sys/types.h>
#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h> 
#include <unistd.h>
#include <malloc.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;               
int flag = 0;   
int free_block_count= 0;        
int current_free_mem_size= 0;   
struct free_block_type{
    int size;
    int start_addr;
    struct free_block_type *next;
};  
struct free_block_type *free_block=NULL;;
/*每个进程分配到的内存块的描述*/
struct allocated_block{
    int pid;    int size;
    int start_addr;
    char process_name[PROCESS_NAME_LEN];
    struct allocated_block *next;
    };
/*进程分配内存块链表的首指针*/
struct allocated_block *allocated_block_head = NULL;
void rearrange(int algorithm);
void rearrange_WF();
void rearrange_FF();
struct free_block_type* init_free_block(int mem_size);
void rearrange_BF();
int set_mem_size();
int display_mem_usage();
void set_algorithm();
int new_process();
void kill_process();
void display_menu();
int mem_retrench(struct allocated_block* ab);
int allocate_mem(struct allocated_block* ab);
int allocate_FF(struct allocated_block* ab);
struct allocated_block* find_process(int pid);
void free_mem(struct allocated_block* ab);
int dispose(struct allocated_block* free_ab);
int do_exit(); 
int main() {
    printf("begin");
    char choice;      pid = 0;
    printf("...........");
    free_block = init_free_block(mem_size); //初始化空闲区
    printf("...........");
    while (1) {
        display_menu();    //显示菜单
        fflush(stdin);
        choice = getchar();    //获取用户输入
        switch (choice) {
        case '1': set_mem_size(); break;     //设置内存大小
        case '2': set_algorithm(); flag = 1; break;//设置算法
        case '3': new_process(); flag = 1; break;//创建新进程
        case '4': kill_process(); flag = 1;   break;//删除进程
        case '5': display_mem_usage();    flag = 1; break;    //显示内存使用
        case '0': do_exit(); exit(0);    //释放链表并退出
        default: break;
        }
    }
    return 0;
}
/*初始化空闲块,默认为一块,可以指定大小及起始地址*/
struct free_block_type* init_free_block(int mem_size){
    struct free_block_type *fb;
    fb=(struct free_block_type *)malloc(sizeof(struct free_block_type));
    if(fb==NULL){
        printf("No mem\n");
        return NULL;
        }
    current_free_mem_size = mem_size;
    fb->size = mem_size;
    fb->start_addr = DEFAULT_MEM_START;
    fb->next = NULL;
    return fb;
}
/*显示菜单*/
void display_menu(){
    printf("\n");
    printf("1 - Set memory size (default=%d)\n", DEFAULT_MEM_SIZE);
    printf("2 - Select memory allocation algorithm\n");
    printf("3 - New process \n");
    printf("4 - Terminate a process \n");
    printf("5 - Display memory usage \n");
    printf("0 - Exit\n");
}
/*设置内存的大小*/
int set_mem_size(){
    int size;
    if(flag!=0){  //防止重复设置
        printf("Cannot set memory size again\n");
        return 0;
        }
    printf("Total memory size =");
    scanf("%d", &size);
    if(size>0) {
        mem_size = size;
        free_block->size = mem_size;
        }
    flag=1; 
    return 1;
}
/* 设置当前的分配算法 */
void set_algorithm(){
    int algorithm;
    printf("\t1 - First Fit\n");
    printf("\t2 - Best Fit \n");
    printf("\t3 - Worst Fit \n");
    scanf("%d", &algorithm);
    if(algorithm>=1 && algorithm <=3)  
              ma_algorithm=algorithm;
    //按指定算法重新排列空闲区链表
    rearrange(ma_algorithm); 
}
/*按指定的算法整理内存空闲块链表*/
void rearrange(int algorithm){
    switch(algorithm){
        case MA_FF:  rearrange_FF(); break;
        case MA_BF:  rearrange_BF(); break;
        case MA_WF: rearrange_WF(); break;
        }
}
/*按FF算法重新整理内存空闲块链表*/
void rearrange_FF(){   
    //请自行补充
    struct free_block_type *head= free_block;
    struct free_block_type *forehand,*pre,*rear;
    int i;
    for(i= 0;i< free_block_count-1;i++)
    {
        forehand= head;
        pre= forehand->next;
        rear= pre->next;
        while(pre->next!= NULL)
        {
            if(forehand== head&&forehand->start_addr>= pre->start_addr)
            {
                //比较空闲链表中第一个空闲块与第二个空闲块的开始地址的大小
                head->next= pre->next;
                pre->next= head;
                head= pre;
                forehand= head->next;
                pre= forehand->next;
                rear= pre->next;
            }
            else if(pre->start_addr>= rear->start_addr)
            {
                //比较链表中其它相邻两个结点的开始地址的大小
                pre->next= rear->next;
                forehand->next= rear;
                rear->next= pre;
                forehand= rear;
                rear= pre->next;
            }
            else
            {
                forehand= pre;
                pre= rear;
                rear= rear->next;
            }
        }
    }
}
/*按BF算法重新整理内存空闲块链表*/
void rearrange_BF(){
    //请自行补充
    struct free_block_type *head= free_block;
    struct free_block_type *forehand,*pre,*rear;
    int i;
    for(i= 0;i< free_block_count-1;i++)
    {
        forehand= head;
        pre= forehand->next;
        rear= pre->next;
        while(pre->next!= NULL)
        {
            if(forehand== head&&forehand->size<= pre->size)
            {
                //比较空闲链表中第一个空闲块与第二个空闲块的空间的大小
                head->next= pre->next;
                pre->next= head;
                head= pre;
                forehand= head->next;
                pre= forehand->next;
                rear= pre->next;
            }
            else if(pre->size<= rear->size)
            {
                //比较链表中其它相邻两个结点的空间的大小
                pre->next= rear->next;
                forehand->next= rear;
                rear->next= pre;
                forehand= rear;
                rear= pre->next;
            }
            else
            {
                forehand= pre;
                pre= rear;
                rear= rear->next;
            }
        }
    }
}
/*按WF算法重新整理内存空闲块链表*/
void rearrange_WF(){
    //请自行补充
    struct free_block_type *head= free_block;
    struct free_block_type *forehand,*pre,*rear;
    int i;
    for(i= 0;i< free_block_count-1;i++)
    {
        forehand= head;
        pre= forehand->next;
        rear= pre->next;
        while(pre->next!= NULL)
        {
            if(forehand== head&&forehand->size>= pre->size)
            {
                //比较空闲链表中第一个空闲块与第二个空闲块空间的大小
                head->next= pre->next;
                pre->next= head;
                head= pre;
                forehand= head->next;
                pre= forehand->next;
                rear= pre->next;
            }
            else if(pre->size>= rear->size)
            {
                //比较链表中其它相邻两个结点的空间的大小
                pre->next= rear->next;
                forehand->next= rear;
                rear->next= pre;
                forehand= rear;
                rear= pre->next;
            }
            else
            {
                forehand= pre;
                pre= rear;
                rear= rear->next;
            }
        }
    }
}
/*创建新的进程,主要是获取内存的申请数量*/
int new_process(){
    struct allocated_block *ab;
    int size;    int ret;
    ab=(struct allocated_block *)malloc(sizeof(struct allocated_block));
    if(!ab) exit(-5);
    ab->next = NULL;
    pid++;
    sprintf(ab->process_name, "PROCESS-%02d", pid);
    ab->pid = pid;    
    printf("Memory for %s:", ab->process_name);
    scanf("%d", &size);
    if(size>0) ab->size=size;
    ret = allocate_mem(ab);  /* 从空闲区分配内存,ret==1表示分配ok*/
    /*如果此时allocated_block_head尚未赋值,则赋值*/
    if((ret==1) &&(allocated_block_head == NULL)){ 
        allocated_block_head=ab;
        return 1;        }
    /*分配成功,将该已分配块的描述插入已分配链表*/
    else if (ret==1) {
        ab->next=allocated_block_head;
        allocated_block_head=ab;
        return 2;        }
    else if(ret==-1){ /*分配不成功*/
        printf("Allocation fail\n");
        free(ab);
        return -1;       
     }
    return 3;
}

/*分配内存模块*/
int allocate(struct free_block_type *pre,struct free_block_type *allocate_free_block,struct allocated_block *ab)
{
    struct allocated_block *p= allocated_block_head;
    ab->start_addr= allocate_free_block->start_addr;
    if(allocate_free_block->size-ab->size< MIN_SLICE)
    {
        ab->size= allocate_free_block->size;
        if(pre!= NULL)
        {
            pre->next= allocate_free_block;
        }
        else
        {
            free_block= allocate_free_block->next;
        }
        free(allocate_free_block);
    }
    else
    {
        allocate_free_block->start_addr+= ab->size;
        allocate_free_block->size-= ab->size;
    }
    if(p== NULL)
    {
        allocated_block_head= ab;
    }
    else
    {
        while(p->next!= NULL)
            p= p->next;
        p->next= ab;
    }
    current_free_mem_size-= ab->size;
    if(current_free_mem_size== 0)
        free_block= NULL;
    return 0;
}

//按照最坏适应算法给新进程分配内存空间
int allocate_WF(struct allocated_block *ab)
{
    int ret;
    struct free_block_type *wf= free_block;
    if(wf== NULL)
        return -1;
    if(wf->size>= ab->size)
        allocate(NULL,wf,ab);
    else if(current_free_mem_size>= ab->size)
        ret= mem_retrench(ab);
    else
        ret= -2;
    rearrange_WF();
    return ret;
}

//按照最佳适应算法给新进程分配内存空间
int allocate_BF(struct allocated_block *ab)
{
    int ret;
    struct free_block_type *pre= NULL,*bf= free_block;
    if(bf== NULL)
        return -1;
    while(bf!= NULL)
    {
        if(bf->size>= ab->size)
        {
            ret= allocate(pre,bf,ab);
            break;
        }
        pre= bf;
        pre= pre->next;
    }
    if(bf== NULL&¤t_free_mem_size> ab->size)
        ret= mem_retrench(ab);
    else
        ret= -2;
    rearrange_BF();
    return ret;
}

//按照首次适应算法给新进程分配内存空间
int allocate_FF(struct allocated_block *ab)
{
    int ret;
    struct free_block_type *pre= NULL,*ff= free_block;
    if(ff== NULL)
        return -1;
    while(ff!= NULL)
    {
        if(ff->size>= ab->size)
        {
            ret= allocate(pre,ff,ab);
            break;
        }
        pre= ff;
        pre= pre->next;
    }
    if(ff== NULL&¤t_free_mem_size> ab->size)
        ret= mem_retrench(ab);
    else
        ret= -2;
    rearrange_FF();
    return ret;
}
int allocate_mem(struct allocated_block *ab){
    struct free_block_type *fbt, *pre;
    int ret;
    int request_size=ab->size;
    fbt = pre = free_block;
    //根据当前算法在空闲分区链表中搜索合适空闲分区进行分配,分配时注意以下情况:
    // 1. 找到可满足空闲分区且分配后剩余空间足够大,则分割
    // 2. 找到可满足空闲分区且但分配后剩余空间比较小,则一起分配
    // 3. 找不可满足需要的空闲分区但空闲分区之和能满足需要,则采用内存紧缩技术,进行空闲分区的合并,然后再分配
    // 4. 在成功分配内存后,应保持空闲分区按照相应算法有序
    // 5. 分配成功则返回1,否则返回-1
//请自行补充。。。。。
switch(ma_algorithm)
    {
        case MA_FF:
            ret= allocate_FF(ab);
            break;
        case MA_BF:
            ret= allocate_BF(ab);
            break;
        case MA_WF:
            ret= allocate_WF(ab);
            break;
        default:
            break;
    }
    return ret;
}

/*删除进程,归还分配的存储空间,并删除描述该进程内存分配的节点*/
void kill_process(){
    struct allocated_block *ab;
    int pid;
    printf("Kill Process, pid=");
    scanf("%d", &pid);
    ab=find_process(pid);
    if(ab!=NULL){
        free_mem(ab); /*释放ab所表示的分配区*/
        dispose(ab);  /*释放ab数据结构节点*/
        }
}

/*将ab所表示的已分配区归还,并进行可能的合并*/
void free_mem(struct allocated_block *ab){
    int algorithm = ma_algorithm;
    struct free_block_type *fbt, *pre, *work;
   fbt=(struct free_block_type*) malloc(sizeof(struct free_block_type));
    // 进行可能的合并,基本策略如下
    // 1. 将新释放的结点插入到空闲分区队列末尾
    // 2. 对空闲链表按照地址有序排列
    // 3. 检查并合并相邻的空闲分区
    // 4. 将空闲链表重新按照当前算法排序
    //请自行补充……
    pre= free_block;
    fbt->start_addr= ab->start_addr;
    fbt->size= ab->size;
    fbt->next= NULL;
    if(pre!= NULL)
    {
        while(pre->next!= NULL)
            pre= pre->next;
        pre->next= fbt;
    }
    else
    {
        free_block= fbt;
    }
    rearrange_FF();
    pre= free_block;
    work= pre->next;
    while(work!= NULL)
    {
        if(pre->start_addr+ pre->size== work->start_addr)
        {
            pre->size+= work->size;
            free(work);
            work= pre->next;
        }
        else
        {
            pre= work;
            work= work->next;
        }
    }
    current_free_mem_size+= ab->size;
}

/*释放ab数据结构节点*/
int dispose(struct allocated_block *free_ab){
    struct allocated_block *pre, *ab;
   if(free_ab == allocated_block_head) { /*如果要释放第一个节点*/
     allocated_block_head = allocated_block_head->next;
        free(free_ab);
        return 1;
        }
    pre = allocated_block_head;  
    ab = allocated_block_head->next;
    while(ab!=free_ab){ pre = ab;  ab = ab->next; }
    pre->next = ab->next;
    free(ab);
    return 2;
   }

/* 显示当前内存的使用情况,包括空闲区的情况和已经分配的情况 */
int display_mem_usage(){
    struct free_block_type *fbt=free_block;
    struct allocated_block *ab=allocated_block_head;
    if(fbt==NULL) return(-1);
    printf("----------------------------------------------------------\n");

    /* 显示空闲区 */
    printf("Free Memory:\n");
    printf("%20s %20s\n", "      start_addr", "       size");
    while(fbt!=NULL){
        printf("%20d %20d\n", fbt->start_addr, fbt->size);
        fbt=fbt->next;
        }    
/* 显示已分配区 */
    printf("\nUsed Memory:\n");
    printf("%10s %20s %10s %10s\n", "PID", "ProcessName", "start_addr", " size");
    while(ab!=NULL){
        printf("%10d %20s %10d %10d\n", ab->pid, ab->process_name, ab->start_addr, ab->size);
        ab=ab->next;
        }
    printf("----------------------------------------------------------\n");
    return 0;
}

int mem_retrench(struct allocated_block *ab)
{
    struct allocated_block *allocated_work,*allocated_pre= allocated_block_head;
    struct free_block_type *free_work,*free_pre= free_block->next;
    if(allocated_pre== NULL)
        return -1;
    allocated_pre->start_addr= 0;
    allocated_work= allocated_pre->next;
    while(allocated_work!= NULL)
    {
        allocated_work->start_addr= allocated_pre->start_addr+ allocated_pre->size;
        allocated_pre= allocated_work;
        allocated_work= allocated_work->next;
    }
    free_block->start_addr= allocated_pre->start_addr+ allocated_pre->size;
    free_block->size= current_free_mem_size;
    free_work= free_pre;
    while(free_pre!= NULL)
    {
        free(free_pre);
        free_pre= free_work;
        if(free_pre!= NULL)
            free_work= free_work->next;
    }
    allocate(NULL,free_block,ab);
    return 1;
}
//退出程序并释放空间
int do_exit()
{
    struct allocated_block *allocated_ab,*allocated_pre;
    struct free_block_type *free_ab,*free_pre;
    free_pre= free_block;
    allocated_pre= allocated_block_head;
    if(free_pre!= NULL)
    {
        free_ab= free_pre->next;
        while(free_ab!= NULL)
        {
            free(free_pre);
            free_pre= free_ab;
            free_ab= free_ab->next;
        }
    }
    if(allocated_pre!= NULL)
    {
        allocated_ab= allocated_pre->next;
        while(allocated_ab!= NULL)
        {
            free(allocated_pre);
            allocated_pre= allocated_ab;
            allocated_ab= allocated_ab->next;
        }
    }
    allocated_ab= allocated_ab->next;
    return 0;
}

//在进程分配链表中寻找指定进程
struct allocated_block* find_process(int pid)
{
    struct allocated_block *ab= allocated_block_head;
    if(ab== NULL)
    {
        printf("Here?111\n");
        return NULL;
    }
    while(ab->pid!= pid&&ab->next!= NULL)
        ab= ab->next;
    if(ab->next== NULL&&ab->pid!= pid)
    {
        printf("Here?222\n");
        return NULL;
    }
    return ab;
}

  • 写回答

4条回答 默认 最新

  • fuill 2022-11-17 18:02
    关注

    改了一下,可以运行了

    img

    #include <stdio.h>
    #include <stdlib.h>
    /*#include 
    #include 
    #include  
    #include 
    #include */
    #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;               
    int flag = 0;   
    int free_block_count= 0;        
    int current_free_mem_size= 0;   
    struct free_block_type{
        int size;
        int start_addr;
        struct free_block_type *next;
    };  
    struct free_block_type *free_block=NULL;;
    /*每个进程分配到的内存块的描述*/
    struct allocated_block{
        int pid;    int size;
        int start_addr;
        char process_name[PROCESS_NAME_LEN];
        struct allocated_block *next;
        };
    /*进程分配内存块链表的首指针*/
    struct allocated_block *allocated_block_head = NULL;
    void rearrange(int algorithm);
    void rearrange_WF();
    void rearrange_FF();
    struct free_block_type* init_free_block(int mem_size);
    void rearrange_BF();
    int set_mem_size();
    int display_mem_usage();
    void set_algorithm();
    int new_process();
    void kill_process();
    void display_menu();
    int mem_retrench(struct allocated_block* ab);
    int allocate_mem(struct allocated_block* ab);
    int allocate_FF(struct allocated_block* ab);
    struct allocated_block* find_process(int pid);
    void free_mem(struct allocated_block* ab);
    int dispose(struct allocated_block* free_ab);
    int do_exit(); 
    int main() {
        printf("begin");
        char choice;      pid = 0;
        printf("...........");
        free_block = init_free_block(mem_size); //初始化空闲区
        printf("...........");
        while (1) {
            display_menu();    //显示菜单
            fflush(stdin);
            choice = getchar();    //获取用户输入
            switch (choice) {
            case '1': set_mem_size(); break;     //设置内存大小
            case '2': set_algorithm(); flag = 1; break;//设置算法
            case '3': new_process(); flag = 1; break;//创建新进程
            case '4': kill_process(); flag = 1;   break;//删除进程
            case '5': display_mem_usage();    flag = 1; break;    //显示内存使用
            case '0': do_exit(); exit(0);    //释放链表并退出
            default: break;
            }
        }
        return 0;
    }
    /*初始化空闲块,默认为一块,可以指定大小及起始地址*/
    struct free_block_type* init_free_block(int mem_size){
        struct free_block_type *fb;
        fb=(struct free_block_type *)malloc(sizeof(struct free_block_type));
        if(fb==NULL){
            printf("No mem\n");
            return NULL;
            }
        current_free_mem_size = mem_size;
        fb->size = mem_size;
        fb->start_addr = DEFAULT_MEM_START;
        fb->next = NULL;
        return fb;
    }
    /*显示菜单*/
    void display_menu(){
        printf("\n");
        printf("1 - Set memory size (default=%d)\n", DEFAULT_MEM_SIZE);
        printf("2 - Select memory allocation algorithm\n");
        printf("3 - New process \n");
        printf("4 - Terminate a process \n");
        printf("5 - Display memory usage \n");
        printf("0 - Exit\n");
    }
    /*设置内存的大小*/
    int set_mem_size(){
        int size;
        if(flag!=0){  //防止重复设置
            printf("Cannot set memory size again\n");
            return 0;
            }
        printf("Total memory size =");
        scanf("%d", &size);
        if(size>0) {
            mem_size = size;
            free_block->size = mem_size;
            }
        flag=1; 
        return 1;
    }
    /* 设置当前的分配算法 */
    void set_algorithm(){
        int algorithm;
        printf("\t1 - First Fit\n");
        printf("\t2 - Best Fit \n");
        printf("\t3 - Worst Fit \n");
        scanf("%d", &algorithm);
        if(algorithm>=1 && algorithm <=3)  
                  ma_algorithm=algorithm;
        //按指定算法重新排列空闲区链表
        rearrange(ma_algorithm); 
    }
    /*按指定的算法整理内存空闲块链表*/
    void rearrange(int algorithm){
        switch(algorithm){
            case MA_FF:  rearrange_FF(); break;
            case MA_BF:  rearrange_BF(); break;
            case MA_WF: rearrange_WF(); break;
            }
    }
    /*按FF算法重新整理内存空闲块链表*/
    void rearrange_FF(){   
        //请自行补充
        struct free_block_type *head= free_block;
        struct free_block_type *forehand,*pre,*rear;
        int i;
        for(i= 0;i< free_block_count-1;i++)
        {
            forehand= head;
            pre= forehand->next;
            rear= pre->next;
            while(pre->next!= NULL)
            {
                if(forehand== head&&forehand->start_addr>= pre->start_addr)
                {
                    //比较空闲链表中第一个空闲块与第二个空闲块的开始地址的大小
                    head->next= pre->next;
                    pre->next= head;
                    head= pre;
                    forehand= head->next;
                    pre= forehand->next;
                    rear= pre->next;
                }
                else if(pre->start_addr>= rear->start_addr)
                {
                    //比较链表中其它相邻两个结点的开始地址的大小
                    pre->next= rear->next;
                    forehand->next= rear;
                    rear->next= pre;
                    forehand= rear;
                    rear= pre->next;
                }
                else
                {
                    forehand= pre;
                    pre= rear;
                    rear= rear->next;
                }
            }
        }
    }
    /*按BF算法重新整理内存空闲块链表*/
    void rearrange_BF(){
        //请自行补充
        struct free_block_type *head= free_block;
        struct free_block_type *forehand,*pre,*rear;
        int i;
        for(i= 0;i< free_block_count-1;i++)
        {
            forehand= head;
            pre= forehand->next;
            rear= pre->next;
            while(pre->next!= NULL)
            {
                if(forehand== head&&forehand->size<= pre->size)
                {
                    //比较空闲链表中第一个空闲块与第二个空闲块的空间的大小
                    head->next= pre->next;
                    pre->next= head;
                    head= pre;
                    forehand= head->next;
                    pre= forehand->next;
                    rear= pre->next;
                }
                else if(pre->size<= rear->size)
                {
                    //比较链表中其它相邻两个结点的空间的大小
                    pre->next= rear->next;
                    forehand->next= rear;
                    rear->next= pre;
                    forehand= rear;
                    rear= pre->next;
                }
                else
                {
                    forehand= pre;
                    pre= rear;
                    rear= rear->next;
                }
            }
        }
    }
    /*按WF算法重新整理内存空闲块链表*/
    void rearrange_WF(){
        //请自行补充
        struct free_block_type *head= free_block;
        struct free_block_type *forehand,*pre,*rear;
        int i;
        for(i= 0;i< free_block_count-1;i++)
        {
            forehand= head;
            pre= forehand->next;
            rear= pre->next;
            while(pre->next!= NULL)
            {
                if(forehand== head&&forehand->size>= pre->size)
                {
                    //比较空闲链表中第一个空闲块与第二个空闲块空间的大小
                    head->next= pre->next;
                    pre->next= head;
                    head= pre;
                    forehand= head->next;
                    pre= forehand->next;
                    rear= pre->next;
                }
                else if(pre->size>= rear->size)
                {
                    //比较链表中其它相邻两个结点的空间的大小
                    pre->next= rear->next;
                    forehand->next= rear;
                    rear->next= pre;
                    forehand= rear;
                    rear= pre->next;
                }
                else
                {
                    forehand= pre;
                    pre= rear;
                    rear= rear->next;
                }
            }
        }
    }
    /*创建新的进程,主要是获取内存的申请数量*/
    int new_process(){
        struct allocated_block *ab;
        int size;    int ret;
        ab=(struct allocated_block *)malloc(sizeof(struct allocated_block));
        if(!ab) exit(-5);
        ab->next = NULL;
        pid++;
        sprintf(ab->process_name, "PROCESS-%02d", pid);
        ab->pid = pid;    
        printf("Memory for %s:", ab->process_name);
        scanf("%d", &size);
        if(size>0) ab->size=size;
        ret = allocate_mem(ab);  /* 从空闲区分配内存,ret==1表示分配ok*/
        /*如果此时allocated_block_head尚未赋值,则赋值*/
        if((ret==1) &&(allocated_block_head == NULL)){ 
            allocated_block_head=ab;
            return 1;        }
        /*分配成功,将该已分配块的描述插入已分配链表*/
        else if (ret==1) {
            ab->next=allocated_block_head;
            allocated_block_head=ab;
            return 2;        }
        else if(ret==-1){ /*分配不成功*/
            printf("Allocation fail\n");
            free(ab);
            return -1;       
         }
        return 3;
    }
    /*分配内存模块*/
    int allocate(struct free_block_type *pre,struct free_block_type *allocate_free_block,struct allocated_block *ab)
    {
        struct allocated_block *p= allocated_block_head;
        ab->start_addr= allocate_free_block->start_addr;
        if(allocate_free_block->size-ab->size< MIN_SLICE)
        {
            ab->size= allocate_free_block->size;
            if(pre!= NULL)
            {
                pre->next= allocate_free_block;
            }
            else
            {
                free_block= allocate_free_block->next;
            }
            free(allocate_free_block);
        }
        else
        {
            allocate_free_block->start_addr+= ab->size;
            allocate_free_block->size-= ab->size;
        }
        if(p== NULL)
        {
            allocated_block_head= ab;
        }
        else
        {
            while(p->next!= NULL)
                p= p->next;
            p->next= ab;
        }
        current_free_mem_size-= ab->size;
        if(current_free_mem_size== 0)
            free_block= NULL;
        return 0;
    }
    //按照最坏适应算法给新进程分配内存空间
    int allocate_WF(struct allocated_block *ab)
    {
        int ret;
        struct free_block_type *wf= free_block;
        if(wf== NULL)
            return -1;
        if(wf->size>= ab->size)
            allocate(NULL,wf,ab);
        else if(current_free_mem_size>= ab->size)
            ret= mem_retrench(ab);
        else
            ret= -2;
        rearrange_WF();
        return ret;
    }
    //按照最佳适应算法给新进程分配内存空间
    int allocate_BF(struct allocated_block *ab)
    {
        int ret;
        struct free_block_type *pre= NULL,*bf= free_block;
        if(bf== NULL)
            return -1;
        while(bf!= NULL)
        {
            if(bf->size>= ab->size)
            {
                ret= allocate(pre,bf,ab);
                break;
            }
            pre= bf;
            pre= pre->next;
        }
        if(bf== NULL&&current_free_mem_size>ab->size)
            ret= mem_retrench(ab);
        else
            ret= -2;
        rearrange_BF();
        return ret;
    }
    //按照首次适应算法给新进程分配内存空间
    int allocate_FF(struct allocated_block *ab)
    {
        int ret;
        struct free_block_type *pre= NULL,*ff= free_block;
        if(ff== NULL)
            return -1;
        while(ff!= NULL)
        {
            if(ff->size>= ab->size)
            {
                ret= allocate(pre,ff,ab);
                break;
            }
            pre= ff;
            pre= pre->next;
        }
        if(ff== NULL&&current_free_mem_size> ab->size)
            ret= mem_retrench(ab);
        else
            ret= -2;
        rearrange_FF();
        return ret;
    }
    int allocate_mem(struct allocated_block *ab){
        struct free_block_type *fbt, *pre;
        int ret;
        int request_size=ab->size;
        fbt = pre = free_block;
        //根据当前算法在空闲分区链表中搜索合适空闲分区进行分配,分配时注意以下情况:
        // 1. 找到可满足空闲分区且分配后剩余空间足够大,则分割
        // 2. 找到可满足空闲分区且但分配后剩余空间比较小,则一起分配
        // 3. 找不可满足需要的空闲分区但空闲分区之和能满足需要,则采用内存紧缩技术,进行空闲分区的合并,然后再分配
        // 4. 在成功分配内存后,应保持空闲分区按照相应算法有序
        // 5. 分配成功则返回1,否则返回-1
    //请自行补充。。。。。
    switch(ma_algorithm)
        {
            case MA_FF:
                ret= allocate_FF(ab);
                break;
            case MA_BF:
                ret= allocate_BF(ab);
                break;
            case MA_WF:
                ret= allocate_WF(ab);
                break;
            default:
                break;
        }
        return ret;
    }
    /*删除进程,归还分配的存储空间,并删除描述该进程内存分配的节点*/
    void kill_process(){
        struct allocated_block *ab;
        int pid;
        printf("Kill Process, pid=");
        scanf("%d", &pid);
        ab=find_process(pid);
        if(ab!=NULL){
            free_mem(ab); /*释放ab所表示的分配区*/
            dispose(ab);  /*释放ab数据结构节点*/
            }
    }
    /*将ab所表示的已分配区归还,并进行可能的合并*/
    void free_mem(struct allocated_block *ab){
        int algorithm = ma_algorithm;
        struct free_block_type *fbt, *pre, *work;
       fbt=(struct free_block_type*) malloc(sizeof(struct free_block_type));
        // 进行可能的合并,基本策略如下
        // 1. 将新释放的结点插入到空闲分区队列末尾
        // 2. 对空闲链表按照地址有序排列
        // 3. 检查并合并相邻的空闲分区
        // 4. 将空闲链表重新按照当前算法排序
        //请自行补充……
        pre= free_block;
        fbt->start_addr= ab->start_addr;
        fbt->size= ab->size;
        fbt->next= NULL;
        if(pre!= NULL)
        {
            while(pre->next!= NULL)
                pre= pre->next;
            pre->next= fbt;
        }
        else
        {
            free_block= fbt;
        }
        rearrange_FF();
        pre= free_block;
        work= pre->next;
        while(work!= NULL)
        {
            if(pre->start_addr+ pre->size== work->start_addr)
            {
                pre->size+= work->size;
                free(work);
                work= pre->next;
            }
            else
            {
                pre= work;
                work= work->next;
            }
        }
        current_free_mem_size+= ab->size;
    }
    /*释放ab数据结构节点*/
    int dispose(struct allocated_block *free_ab){
        struct allocated_block *pre, *ab;
       if(free_ab == allocated_block_head) { /*如果要释放第一个节点*/
         allocated_block_head = allocated_block_head->next;
            free(free_ab);
            return 1;
            }
        pre = allocated_block_head;  
        ab = allocated_block_head->next;
        while(ab!=free_ab){ pre = ab;  ab = ab->next; }
        pre->next = ab->next;
        free(ab);
        return 2;
       }
    /* 显示当前内存的使用情况,包括空闲区的情况和已经分配的情况 */
    int display_mem_usage(){
        struct free_block_type *fbt=free_block;
        struct allocated_block *ab=allocated_block_head;
        if(fbt==NULL) return(-1);
        printf("----------------------------------------------------------\n");
        /* 显示空闲区 */
        printf("Free Memory:\n");
        printf("%20s %20s\n", "      start_addr", "       size");
        while(fbt!=NULL){
            printf("%20d %20d\n", fbt->start_addr, fbt->size);
            fbt=fbt->next;
            }    
    /* 显示已分配区 */
        printf("\nUsed Memory:\n");
        printf("%10s %20s %10s %10s\n", "PID", "ProcessName", "start_addr", " size");
        while(ab!=NULL){
            printf("%10d %20s %10d %10d\n", ab->pid, ab->process_name, ab->start_addr, ab->size);
            ab=ab->next;
            }
        printf("----------------------------------------------------------\n");
        return 0;
    }
    int mem_retrench(struct allocated_block *ab)
    {
        struct allocated_block *allocated_work,*allocated_pre= allocated_block_head;
        struct free_block_type *free_work,*free_pre= free_block->next;
        if(allocated_pre== NULL)
            return -1;
        allocated_pre->start_addr= 0;
        allocated_work= allocated_pre->next;
        while(allocated_work!= NULL)
        {
            allocated_work->start_addr= allocated_pre->start_addr+ allocated_pre->size;
            allocated_pre= allocated_work;
            allocated_work= allocated_work->next;
        }
        free_block->start_addr= allocated_pre->start_addr+ allocated_pre->size;
        free_block->size= current_free_mem_size;
        free_work= free_pre;
        while(free_pre!= NULL)
        {
            free(free_pre);
            free_pre= free_work;
            if(free_pre!= NULL)
                free_work= free_work->next;
        }
        allocate(NULL,free_block,ab);
        return 1;
    }
    //退出程序并释放空间
    int do_exit()
    {
        struct allocated_block *allocated_ab,*allocated_pre;
        struct free_block_type *free_ab,*free_pre;
        free_pre= free_block;
        allocated_pre= allocated_block_head;
        if(free_pre!= NULL)
        {
            free_ab= free_pre->next;
            while(free_ab!= NULL)
            {
                free(free_pre);
                free_pre= free_ab;
                free_ab= free_ab->next;
            }
        }
        if(allocated_pre!= NULL)
        {
            allocated_ab= allocated_pre->next;
            while(allocated_ab!= NULL)
            {
                free(allocated_pre);
                allocated_pre= allocated_ab;
                allocated_ab= allocated_ab->next;
            }
        }
        allocated_ab= allocated_ab->next;
        return 0;
    }
    //在进程分配链表中寻找指定进程
    struct allocated_block* find_process(int pid)
    {
        struct allocated_block *ab= allocated_block_head;
        if(ab== NULL)
        {
            printf("Here?111\n");
            return NULL;
        }
        while(ab->pid!= pid&&ab->next!= NULL)
            ab= ab->next;
        if(ab->next== NULL&&ab->pid!= pid)
        {
            printf("Here?222\n");
            return NULL;
        }
        return ab;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 11月25日
  • 已采纳回答 11月17日
  • 创建了问题 11月17日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度