存储管理算法设计实验报告

时间:2024.4.8

操作系统实验报告

              题目:存储管理算法设计

              院系:计算机科学与工程学院

班级:

姓名:

学号:

一、实验题目

存储管理算法设计

二、实验日期

20##年11月3日

三、实验目的与要求

1、通过本实验,帮助学生理解存储管理的功能,掌握动态异长分区的存储分配与回收算法。

2、常用的动态异长分区的分配算法有:最先适应算法、最佳适应算法和最坏适应算法;要求选择任意一种算法,设计相应的数据结构,模拟内存空间的分配和回收。实验报告中给出程序中使用的数据结构及流程图。

四、实验环境

RedHat LINUX 6.0

五、实验内容

流程图:

             

六、实验结果与分析

   

七、实验心得与体会

通过本次实验,了解并掌握了操作系统的存储管理算法的运行机理,以及常用的三种算法最佳适应算法、最先适应算法及最坏适应算法的基本思想;并通过对程序代码的调试过程,更加深刻理解了操作系统是怎么进行存储管理的。

八、实验程序代码

头文件variable_partition.h

#include <unistd.h>

#include <curses.h>

#include <stdlib.h>

#include <pthread.h>

#include <time.h>

#include <string.h>

#include <semaphore.h>

#define MAX_THREAD 3

#define BF_initialize_require_memory_list FF_initialize_require_memory_list

#define WF_initialize_require_memory_list FF_initialize_require_memory_list

#define BF_initialize_thread_residence_memory_list

FF_initialize_thread_residence_memory_list

#define WF_initialize_thread_residence_memory_list

FF_initialize_thread_residence_memory_list

#define WF_delete_freearea_list FF_delete_freearea_list

#define BF_delete_freearea_list FF_delete_freearea_list

#define WF_delete_require_memory_list FF_delete_require_memory_list

#define BF_delete_require_memory_list FF_delete_require_memory_list

#define WF_delete_thread_residence_memory_list

FF_delete_thread_residence_memory_list

#define BF_delete_thread_residence_memory_list

FF_delete_thread_residence_memory_list

typedef struct freearea{

    struct freearea *next;

    int start_address;

    int size;

}FREEAREA;

typedef struct require_memory{

    struct require_memory *next;

    char thread_name[10];

    int size;

    int duration;

}REQUIRE_MEMORY;

typedef struct thread_residence_memory{

    struct thread_residence_memory *next;

    char thread_name[10];

    int start_address;

    int size;

}THREAD_RESIDENCE_MEMORY;

FREEAREA init_free_area_table[5]={

    {NULL,10,10},

    {NULL,40,30},

    {NULL,80,5},

    {NULL,145,15},

    {NULL,180,20}

};

REQUIRE_MEMORY init_thread_require_memory_table[3]={

    {NULL,"thread_1",20,4},

    {NULL,"thread_2",10,5},

    {NULL,"thread_3",5,6}

};

THREAD_RESIDENCE_MEMORY init_thread_residence_memory_table[5]={

    {NULL,"a",0,10},

    {NULL,"b",20,20},

    {NULL,"c",70,10},

    {NULL,"d",85,60},

    {NULL,"e",160,20}

};

FREEAREA *p_free_area_list=NULL;

REQUIRE_MEMORY *p_thread_require_memory_queue=NULL;

THREAD_RESIDENCE_MEMORY *p_thread_residence_memory_list=NULL;

THREAD_RESIDENCE_MEMORY *tail_thread_residence_memory_list=NULL;

pthread_mutex_t CS_THREAD_MEMORY_LIST;

pthread_mutex_t CS_SCREEN;

pthread_mutex_t CS_FREEAREA_LIST;

pthread_t h_thread[MAX_THREAD];

sem_t thread_end[MAX_THREAD];

void display_thread_residence_memory_list();

FREEAREA *FF_initialize_freearea_list(FREEAREA *init_table,int num);

void FF_delete_freearea_list();

REQUIRE_MEMORY *FF_initialize_require_memory_list(REQUIRE_MEMORY *init_table,

int num);

void FF_delete_require_memory_list();

THREAD_RESIDENCE_MEMORY *FF_initialize_thread_residence_memory_list

(

THREAD_RESIDENCE_MEMORY *init_table,

int num

);

void  FF_delete_thread_residence_memory_list();

void* FF_thread(void *data);

int   FF_require_memory(int size);

void  FF_release_memory(int start_address,int size);

void  FF();

void* BF_thread(void *data);

int   BF_require_memory(int size);

void  BF_release_memory(int start_address,int size);

void  BF_insert_freearea(FREEAREA *free_node);

void  BF();

void  BF_initialize_freearea_list(FREEAREA *init_table,int num);

void* WF_thread(void *data);

void  WF_insert_freearea(FREEAREA *free_node);

void  WF_initialize_freearea_list(FREEAREA *init_table,int num);

int   WF_require_memory(int size);

void  WF_release_memory(int start_address,int size);

void  WF();

源文件variable_partition.cpp

#include "variable_partition.h"

int main(int argc,char *argv[]){

    char select;

    bool end=false;

    initscr();

    while(!end){

        clear();

        refresh();

        printw("|-----------------------------------|\n");

        printw("|  1:first fit allocation           |\n");

        printw("|  2:best  fit allocation           |\n");

        printw("|  3:worst fit allocation           |\n");

        printw("|  4:exit                           |\n");

        printw("|-----------------------------------|\n");

        printw("select a function(1~4):");

        do{

            select=(char)getch();

        }while(select!='1'&&select!='2'&&select!='3'&&select!='4');

        clear();

        refresh();

        switch(select){

        case '1':

            FF();

            break;

        case '2':

            BF();

            break;

        case '3':

            WF();

            break;

        case '4':

            end=true;

        }

        printw("\nPress any key to return to main menu.");

        refresh();

        getch();

       

    }

    endwin();

    return 0;

}

void display_thread_residence_memory_list(){

    THREAD_RESIDENCE_MEMORY *p;

   p=p_thread_residence_memory_list;

    int i=13;

    move(10,0);

    printw("|-------------------|--------------------|------------------|\n");

    printw("| thread_name       | start_address(kB)  | size(KB)         |\n");

    printw("|-------------------|--------------------|------------------|\n");

    while(p!=NULL){

       move(i,0);

       printw("| %s",p->thread_name);

       move(i,20);

       printw("| %d",p->start_address);

       move(i,41);

       printw("| %d",p->size);

       move(i,60);

       printw("|\n");

       p=p->next;

       i++;

    };

    move(i,0);

        printw("|-------------------|--------------------|------------------|\n\n");

    refresh();

}

FREEAREA *FF_initialize_freearea_list(FREEAREA *init_table,int num){

  FREEAREA *temp;

  FREEAREA *head=NULL;

  FREEAREA *tail=NULL;

  int i;

  for(i=0;i<num;i++){

     temp=(FREEAREA *)malloc(sizeof(FREEAREA));

     temp->start_address=init_table[i].start_address;

     temp->size=init_table[i].size;

     temp->next=NULL;

     if(head==NULL)

         head=tail=temp;

     else{

         tail->next=temp;

         tail=tail->next;

     }

  };

  return head;

}

void FF_delete_freearea_list(){

    FREEAREA *temp;

    temp=p_free_area_list;

    while(temp!=NULL){

        temp=p_free_area_list->next;

        free(p_free_area_list);

        p_free_area_list=temp;

    }

    p_free_area_list=NULL;

}

REQUIRE_MEMORY *

FF_initialize_require_memory_list(REQUIRE_MEMORY *init_table,int num)

{

  REQUIRE_MEMORY *temp;

  REQUIRE_MEMORY *head=NULL;

  REQUIRE_MEMORY *tail=NULL;

  int i;

  for(i=0;i<num;i++){

     temp=(REQUIRE_MEMORY *)malloc(sizeof(REQUIRE_MEMORY));

     strcpy(temp->thread_name,init_table[i].thread_name);

     temp->size=init_table[i].size;

     temp->duration=init_table[i].duration;

     temp->next=NULL;

     if(head==NULL)

         head=tail=temp;

     else{

         tail->next=temp;

         tail=tail->next;

     }

  };

  return head;

}

void FF_delete_require_memory_list(){

    REQUIRE_MEMORY *temp;

    temp=p_thread_require_memory_queue;

    while(temp!=NULL){

        temp=p_thread_require_memory_queue->next;

        free(p_thread_require_memory_queue);

        p_thread_require_memory_queue=temp;

    }

    p_thread_require_memory_queue=NULL;

}

THREAD_RESIDENCE_MEMORY

*FF_initialize_thread_residence_memory_list

(THREAD_RESIDENCE_MEMORY *init_table,int num)

{

  THREAD_RESIDENCE_MEMORY *temp;

  THREAD_RESIDENCE_MEMORY *head=NULL;

  THREAD_RESIDENCE_MEMORY *tail=NULL;

  int i;

  for(i=0;i<num;i++){

     temp=(THREAD_RESIDENCE_MEMORY *)malloc(sizeof(THREAD_RESIDENCE_MEMORY));

     strcpy(temp->thread_name,init_table[i].thread_name);

     temp->start_address=init_table[i].start_address;

     temp->size=init_table[i].size;

     temp->next=NULL;

     if(head==NULL)

         head=tail=temp;

     else{

         tail->next=temp;

         tail=tail->next;

     }

  };

  tail_thread_residence_memory_list=tail;

  return head;

}

void FF_delete_thread_residence_memory_list(){

    THREAD_RESIDENCE_MEMORY *temp=p_thread_residence_memory_list;

   

    temp=p_thread_residence_memory_list;

    while(temp!=NULL){

        temp=p_thread_residence_memory_list->next;

        free(p_thread_residence_memory_list);

        p_thread_residence_memory_list=temp;

    }

    p_thread_residence_memory_list=NULL;

}

void* FF_thread(void *data){

        int start_address=-1;

    int i=(((REQUIRE_MEMORY *)(data))->thread_name)[7]-49;

    THREAD_RESIDENCE_MEMORY *temp;

    pthread_mutex_lock(&CS_SCREEN);

    printw("create thread:%s\n",((REQUIRE_MEMORY *)(data))->thread_name);

    refresh();

    pthread_mutex_unlock(&CS_SCREEN);

   

    while(1){

        start_address=FF_require_memory(((REQUIRE_MEMORY *)(data))->size);

        if(start_address>=0)

            break;

        else

            sleep(1);

    }

    temp=(THREAD_RESIDENCE_MEMORY *)malloc(sizeof(THREAD_RESIDENCE_MEMORY));

    strcpy(temp->thread_name,((REQUIRE_MEMORY *)(data))->thread_name);

    temp->start_address=start_address;

    temp->size=((REQUIRE_MEMORY *)(data))->size;

    temp->next=NULL;

    pthread_mutex_lock(&CS_THREAD_MEMORY_LIST);

   

    tail_thread_residence_memory_list->next=temp;

    tail_thread_residence_memory_list=tail_thread_residence_memory_list->next;

    pthread_mutex_unlock(&CS_THREAD_MEMORY_LIST);

   

    sleep(((REQUIRE_MEMORY *)(data))->duration);

   

    FF_release_memory(start_address,((REQUIRE_MEMORY *)(data))->size);

    sem_post(&thread_end[i]);

    return 0;

}

int FF_require_memory(int size){

    int start_address=-1;

    FREEAREA *p;

    FREEAREA *p_next;

    pthread_mutex_lock(&CS_FREEAREA_LIST);

    p=p_next=p_free_area_list;

    while(p_next!=NULL){

        if(size==p_next->size){

            start_address=p_next->start_address;

            if(p_next==p_free_area_list)

                p_free_area_list=p_next->next;

            else

                p->next=p_next->next;

            free(p_next);

            break;

        }

        else

            if(size<p_next->size){

                start_address=p_next->start_address;

                p_next->start_address+=size;

                p_next->size-=size;

                break;

            }

            else

            {

                p=p_next;

                p_next=p_next->next;

            }

    }

   pthread_mutex_unlock(&CS_FREEAREA_LIST);

    return start_address;

}

void FF_release_memory(int start_address,int size){

    pthread_mutex_lock(&CS_FREEAREA_LIST);

   

    pthread_mutex_unlock(&CS_FREEAREA_LIST);

}

void FF(){

    int i=0;

    int j=0;

        REQUIRE_MEMORY *p;

    for(j=0;j<MAX_THREAD;j++){

       sem_init(&thread_end[j],0,0);

    }

  

    pthread_mutex_init(&CS_THREAD_MEMORY_LIST,NULL);

    pthread_mutex_init(&CS_FREEAREA_LIST,NULL);

    pthread_mutex_init(&CS_SCREEN,NULL);

    printw("First Fit\n");

    refresh();

    p_free_area_list=FF_initialize_freearea_list(init_free_area_table,5);

    p_thread_require_memory_queue

=FF_initialize_require_memory_list(init_thread_require_memory_table,3);

    p_thread_residence_memory_list

=FF_initialize_thread_residence_memory_list

(init_thread_residence_memory_table,5);

    p=p_thread_require_memory_queue;

    while(p!=NULL){

          pthread_create(&h_thread[i],NULL,FF_thread,p);

          i++;

  p=p->next;

    };

  

   for(j=0;j<MAX_THREAD;j++){

        sem_wait(&thread_end[j]);

}

   

    pthread_mutex_lock(&CS_SCREEN);

    printw("after all threads have finished:\n");

    refresh();

    display_thread_residence_memory_list();

    pthread_mutex_unlock(&CS_SCREEN);

   

    FF_delete_freearea_list();

    FF_delete_require_memory_list();

    FF_delete_thread_residence_memory_list();

    for(j=0;j<MAX_THREAD;j++){

       sem_destroy(&thread_end[j]);

    }

    getch();

    printw("\n");

    refresh();

}

   

更多相关推荐:
存储管理实验报告

软件学院计算机课程实验报告册课程名称计算机操作系统实验学期20xx年至20xx年第2学期学生所在院系软件学院年级11软件专业班级软工1班学生姓名朱水云学号1115114034指导教师陈自刚实验最终成绩软件学院实...

操作系统存储管理实验报告

北京邮电大学操作系统实验实验报告实验日期20xx1220实验名称存储管理一实验目的2二实验内容2三实验分析2对于伙伴算法2对于虚拟存储区和内存工作区的不同算法3四编程实现3伙伴算法3原理3伙伴的概念3内存的释放...

《操作系统》存储管理实验报告

《操作系统》存储管理实验报告____大学____学院实验报告

存储管理实验报告

北方工业大学北方工业大学20xx513第2页共8页北方工业大学20xx513第3页共8页北方工业大学20xx513第4页共8页北方工业大学20xx513第5页共8页北方工业大学20xx513第6页共8页北方工业...

存储管理实验报告

实验四存储管理实验报告一实验目的存储管理的主要功能之一是合理地分配空间请求页式管理是一种常用的虚拟存储管理技术本实验的目的是通过请求页式管理中页面置换算法模拟设计了解虚拟存储技术的特点掌握请求页式存储管理的页面...

存储管理实验报告

GDOUB11112广东海洋大学学生实验报告书学生用表实验名称存储管理学院系学生姓名课程名称专业学号操作系统课程号班级实验日期软件学院软件工程实验地点一实验目的修改MINIX操作系统内存管理的源程序将MINIX...

存储管理实验报告

实验三存储管理一实验目的一个好的计算机系统不仅要有一个足够容量的存取速度高的稳定可靠的主存储器而且要能合理地分配和使用这些存储空间当用户提出申请存储器空间时存储管理必须根据申请者的要求按一定的策略分析主存空间的...

可变分区存储管理实验报告

沈阳工程学院学生实验报告实验室名称信息工程系信息安全实验室实验课程名称操作系统实验项目名称可变分区存储管理班级计专本121姓名郑永凯学号20xx461127实验日期20xx年5月27日实验台编号F608指导教师...

可变分区存储管理+实验报告+程序+设计思路和感悟

实验题目可变分区存储管理一实验目的可变分区存储管理方式是操作系统中存储管理的重要方式其主要思想是用户作业进行连续存储每次按照用户的请求如果内存中有能满足用户作业大小的空闲区就采用不同的算法分配给用户否则不分配可...

动态分区存储管理实验报告

实验报告实验题目动态分区存储管理姓名王辉学号20xx1101416班级四班组别协作者指导教师赵卿实验概述实验目的及要求目的1加深对存储管理概念的理解2熟练存储管理对作业的插入和回收过程中的内存地址分配3深入了解...

请求页式存储管理模拟实验源代码及实验报告

请求页式存储管理模拟实验源代码及实验报告自己写的程序写得比较简单只为方便学弟学妹们呵呵dlnuincludeltiostreamgtincludeltprocesshgtincludeltstdlibhgtin...

存储管理实验报告 昆工

昆明理工大学信息工程与自动化学院学生实验报告20xx20xx学年第二学期课程名称操作系统开课实验室44420xx年5月12日一实验目的存储管理的主要功能之一是合理地分配空间请求页式管理是一种常用的虚拟存储管理技...

存储管理实验报告(53篇)