操作系统导论课程设计-资源管理软件的设计

本文详细介绍了四个操作系统课程设计项目:动态异长分区内存管理的最差适应算法、采用有序分配法预防死锁的哲学家就餐问题、假脱机打印程序与虚拟设备以及写者优先的读者/写者问题。每个项目涵盖了设计目的、数据结构、算法描述、源程序和运行结果分析,展示了如何通过多线程技术和信号量解决内存管理、死锁预防、打印队列管理和进程同步等问题。
摘要由CSDN通过智能技术生成

课 程 设 计 说 明 书

课程设计名称

    操作系统导论课程设计   

专        业

                           

班        级

                           

学生姓

                           

指导教

                           

2023 年 5月 29 日


课 程 设 计 任 务 书


课程设计题目

资源管理软件的设计

起止日期

2023529 日— 20236 月9 日

设计地点

设计任务及日程安排:

设计任务:

  1. 分析与设计动态异长分区的分配算法,并进行功能扩充;(1-3中选一)
  2. 分析与设计哲学家就餐问题,并进行功能扩充;(4-6中选一)
  3. 分析假脱机打印程序与虚拟设备,并进行功能扩充;(7必选)
  4. 分析读者/写者问题,并设计新的测试数据进行测试;(8-10中选一)

日程安排:

本次设计共二周时间,日程安排如下:

第1-2天:分析动态异长分区的分配去配算法,并进行功能扩充,编写设计报告;

第3-4天:分析与设计哲学家就餐问题,编写设计报告;

第5天:第一阶段检查。

第6-7天:分析读者/写者问题,并设计新的测试数据进行测试,编写设计报告;

第8-9天:完成假脱机打印程序,编写设计报告;

第10天:课程考核。

设计报告要求:

  1. 每个题目编写一份设计报告,每位同学独立完成。
  2. 针对每个题目分析的部分给出算法流程,功能扩充的部分给出算法流程和源代码。

设计3  动态异长分区内存分配与去配算法的设计-最差适应算法

1.设计目的

理解存储管理的功能,掌握动态异长分区内存管理中的最差适应算法。

2.设计要求

本设计要求模拟最差适应算法的分配算法和回收算法。

3.数据结构

struct freearea{                    //表示空闲区域的数据结构

struct freearea *next;                  //指向下一个结点的指针

int start_address;                     //空闲区起始地址

int size;                              //空闲区大小

}FREEAREA;

struct require_memory{             //记录线程申请内存的数据结构

    struct require_memory *next;           //指向下一个结点的指针

char thread_name[10];                //线程名

int size;                             //申请内存大小(以KB为单位)

int duration;                         //在内存的驻留时间(以秒为单位)

}REQUIRE_MEMORY;

struct thread_residence_memory{         //描述线程驻留区的数据结构

    struct thread_residence_memory *next;       //指向下一个结点的指针

char thread_name[10];                     //线程名

int start_address;                          //驻留区起始地址

int size;                                   //驻留区大小

}THREAD_RESIDENCE_MEMORY;

4.算法描述

(1)函数调用关系图:

(2)初始化函数WF()程序流程图:

(3)线程函数WF_thread()程序流程图:

(4)分配函数程序流程图:

(5)回收函数程序流程图:

5.源程序

//最差适应分配算法的内存申请函数

int WF_require_memory(int size){

int start_address;//定义需要找到的空闲区起始地址

    FREEAREA* p;//定义移动指针

    FREEAREA* p_next;//指向移动指针的下一个地址

    FREEAREA* ptr;//记录找到的最大的空闲区

    FREEAREA* ptr_f;//记录找到的最大的空闲区的上一个区域

    FREEAREA* p_free_area_list_next;//定义头指针的下一个地址

    EnterCriticalSection(&CS_FREEAREA_LIST);  //保护空闲表临界区

    p=p_free_area_list;//空闲区头指针,下一个指针均指向空闲区链表

    p_next=p->next;ptr=p;ptr_f=p;

    p_free_area_list_next=p_free_area_list->next;

    start_address=-1;

    while (p->next!=NULL) {//找到空闲分区中尺寸最大的结点

        if(ptr->size<p_next->size){

         ptr=p_next;

         ptr_f=p;

        }

        p=p_next;

        p_next=p_next->next;

    }

    if(size==ptr->size){//看找到的空闲区是否等于进程的请求

     if(ptr==p_free_area_list){

     start_address=p_free_area_list->start_address;

     p_free_area_list=p_free_area_list_next;

     free(ptr);

     }

     else{

     start_address=ptr->start_address;

     ptr_f->next=ptr->next;

    

     free(ptr);

     }

    }

    if(size<ptr->size){//如果空闲区大于进程的请求,分割

     start_address=ptr->start_address;

     ptr->start_address+=size;

     ptr->size-=size;

    }

    //如果小于,分配不了

    LeaveCriticalSection(&CS_FREEAREA_LIST);    //释放空闲表临界区

    return start_address;

}

//最差适应分配算法:内存释放函数//start_address,((REQUIRE_MEMORY *)(data))->size

void WF_release_memory(int start_address,int size){

  FREEAREA *p,*pp,*p_pre,*p_next,*temp=p_free_area_list;

    int flag=0;//记录合并方式的标识

    for(p=p_free_area_list;p!=NULL;p=p->next){//通过循环来查找哪里能合并

     if(p->start_address==start_address+size){//第一种合并方法

            ++flag;

            p_next=p;

        }

else if(p->start_address+p->size==start_address){//第二种合并方法

            flag+=2;

            p_pre=p;

        }

    }

    if(flag==0){//如果没有合并区域

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

        p->start_address=start_address;

        p->size=size;

        WF_insert_freearea(p);

    }

else if(flag==1||flag==2){

        if(flag==1){//如果合并方式为第一种

            p_next->start_address-=size;

            p_next->size+=size;

            p=p_next;

        }

else{//如果合并方式为第二种

            p_pre->size+=size;

            p=p_pre;

        }

        if(p==p_free_area_list){}

        else{//如果指针p不为头节点

            while(temp->next!=p){

             temp=temp->next;

            }

            if(p->size>=p_free_area_list->size){

                temp->next=p->next;

                p->next=p_free_area_list;

                p_free_area_list=p;

            }

else{

                if(p->size<=temp->size){}

                else{

                    p_pre=p_free_area_list;

                    while(p_pre->next->size>p->size){

                     p_pre=p_pre->next;

                    }

                    temp->next=p->next;

                    p->next=p_pre->next;

                    p_pre->next=p;

                }

            }

        }

    }

else{

        if(p_pre==p_free_area_list){

            p_pre->size+=p_next->size+size;

            while(temp->next!=NULL){

             if(temp->next==p_next){

             temp->next=p_next->next;

             }

            }

            free(p_next);

        }

else if(p_next==p_free_area_list){

            p_next->start_address=p_pre->start_address;

            p_next->size+=p_pre->size+size;

            while(temp->next!=NULL){

             if(temp->next==p_pre){

                 temp->next=p_pre->next;

                }

            }

            free(p_pre);

        }

else{

            while(temp->next!=NULL){

                if(temp->next==p_pre){

                 temp->next=p_pre->next;

                }

                if(temp->next==p_next){

                 temp->next=p_next->next;

                }

            }

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

            p->start_address=p_pre->start_address;

            p->size=p_pre->size+p_next->size+size;

            pp=p_free_area_list;

            while(pp->next!=NULL){

                if (pp->next==p_pre){

                 pp->next=p_pre->next;

                }

                else if(pp->next==p_next){

                 pp->next=p_next->next;

                }

                if(pp->next!=NULL){

                 pp=pp->next;

                }

            }

            free(p_pre);

            free(p_next);

            WF_insert_freearea(p);

        }

    }

    EnterCriticalSection(&CS_THREAD_MEMORY_LIST);//访问线程驻留区域

    THREAD_RESIDENCE_MEMORY *rp=p_thread_residence_memory_list,*f;

    while(rp->next->start_address!=start_address)

        rp=rp->next;

    f=rp->next;

    rp->next=f->next;

    free(f);

    while (rp->next!=NULL)

        rp=rp->next;

    tail_thread_residence_memory_list=rp;

    LeaveCriticalSection(&CS_THREAD_MEMORY_LIST);

}

6.运行结果及分析

测试数据

起始地址

0

10

20

40

70

80

85

145

160

180

占用者

a

b

c

d

e

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青竹小轩_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值