操作系统上机随笔《实验三》

这篇具有很好参考价值的文章主要介绍了操作系统上机随笔《实验三》。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

一天一个实验,今天是第三天,接着开赶进度

1,实验目的

理解动态异长存储分区资源管理,掌握所需数据结构和管理程序,了解各种存储分配算法的优点和缺点。

2,实验内容

  • 分析UNIX最先适应(FF)存储分配算法,即map数据结构、存储分配函数malloc()和存储释放函数mfree(),找出与算法有关的成分。
  • 修改上述与算法有关的成分,使其分别体现BF分配原则和WF分配原则。

3,实验准备

这个实验的内容也很好理解,知识点的内容就在教材的P108页,在使用链表的存储管理这一小节里面有关于BF和WF的简要介绍,如图:

操作系统上机随笔《实验三》

我又找了一个帖子简要的介绍了这两个算法:

(20条消息) 实例分析首次适应算法、最佳适应算法、最差适应算法_焕听的博客-CSDN博客_循环首次适应算法例题讲解

(实验设计只要求我们设计出BF和WF的分配算法,回收算法先不考虑)

4,实验设计

  • 按内容要求编写最佳适应和最坏适应存储分配算法。
  • 编写测试程序,对存储分配表进行初始化。然后对用户输入的请求和释放,按算法动态更新存储分配表,并将每次更新之后的存储分配表在屏幕上显示出来。 

实验代码

#ifdef  HAVE_CONFIG_H
#include  <config.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#define MAPSIZE 100
struct map  //存储资源表结构
{
    int m_addr;
    int m_size;
};
struct map map[MAPSIZE];  //存储资源表
//BF存储分配函数
int BF_malloc(struct map *mp,int size)  
{
    register int a,s;
    register struct map *bp,*bpp;
    for(bp = mp; bp->m_size; bp++)
    {
       if (bp->m_size >= size)
        {
            a = bp->m_addr;
            s = bp->m_size;
            for(bpp = bp; bpp->m_size; bpp++)
            {   //最佳适应
                if(bpp->m_size >= size && bpp->m_size < s)
                {
                    a = bpp->m_addr;
                    s = bpp->m_size;
                    bp = bpp;
                }
            }

            bp->m_addr += size;
            if ((bp->m_size -= size) == 0)
                do
                {
                    bp++;
                    (bp-1)->m_addr = bp->m_addr;
                }
                while((bp-1)->m_size = bp->m_size);
            return(a);
        }
    }
    return(-1);
}

//WF存储分配函数
int WF_malloc(struct map *mp,int size) 
{
    register int a,s;
    register struct map *bp,*bpp;
    for(bp = mp; bp->m_size; bp++)
    {
        if (bp->m_size >= size)
        {
            a = bp->m_addr;
            s = bp->m_size;
            for(bpp = bp; bpp->m_size; bpp++) 
            {   //最坏适应
                if(bpp->m_size > s) 
                {
                    a = bpp->m_addr;
                    s = bpp->m_size;
                    bp = bpp;
                }
            }
bp->m_addr += size;
            if ((bp->m_size -=size) == 0)
                do
                {
                    bp++;
                    (bp-1)->m_addr = bp->m_addr;
                }
                while((bp-1)->m_size = bp->m_size);
            return(a);
        }
    }
    return(-1);
}

//存储释放函数
void mfree(struct map *mp,int aa,int size) 
{
    register struct map *bp;
    register int t;
    register int a;
    a = aa;
    for(bp = mp; bp->m_addr<=a && bp->m_size != 0; bp++)
        ;
    if(bp>mp && (bp-1)->m_addr+(bp-1)->m_size==a)
    {  //与前合并
         (bp-1)->m_size += size;
         if (a+size == bp->m_addr)
         {   //前后合并
              (bp-1)->m_size += bp->m_size;
              while (bp->m_size)
              {
                  bp++;
                  (bp-1)->m_addr = bp->m_addr;
                  (bp-1)->m_size = bp->m_size;
              }
         }
    }

else
    {
         if (a+size == bp->m_addr && bp->m_size)
         {   //与后合并
              bp->m_addr -= size;
              bp->m_size += size;
         }
         else if (size)
              do
              {   //无合并
                   t = bp->m_addr;
                   bp->m_addr = a;
                   a = t;
                   t = bp->m_size;
                   bp->m_size = size;
                   bp++;
              }
              while (size = t);
    }
}
void init()
{
    struct map *bp;
    int addr,size;
    int i=0;
    bp=map;
    printf("Please input starting addr and total size:");
    scanf("%d,%d",&addr,&size);
    getchar();
    bp->m_addr=addr;
    bp->m_size=size;
    (++bp)->m_size=0;  //表尾
}

void show_map()
{
     int i=0;
     //system("clear");  //清屏
     struct map *bp;
     bp=map;
     printf("\nCurrent memory map...\n");
     printf("Address\t\tSize\n");
     while(bp->m_size!=0)
     {
         printf("<%d\t\t%d>\n",bp->m_addr,bp->m_size);
        bp++;
     }
     printf("\n");
}
main()
{
    int a,s;
    char c;
    int i;
    init();
    printf("please input, b for BF, w for WF:");
    scanf("%c",&c);
    getchar();
    do
    {
        show_map(); //显示存储资源表

        printf("Please input,1 for request,2 for release,0 for exit:");
        scanf("%d",&i);
        getchar();
        switch(i)
        {
            case 1:
                printf("Please input size:");
                scanf("%d", &s);
        getchar();
                if(c=='b')  //BF
                    a=BF_malloc(map,s);
                else  //WF
                    a=WF_malloc(map,s);
                if(a==-1)
                    printf("request can't be satisfied\n");
                else
                    printf("alloc memory at address:%d,size:%d\n",a,s);
                break;
            case 2:
                printf("Please input addr and size:");
                scanf("%d,%d",&a,&s);
        getchar();
                mfree(map,a,s);
                break;
            case 0:
                exit(0);
        }
    }
    while(1);
}

修改:

1,!!!!!!!一定要把main函数里的int c,改为char c;如果不改的话无论程序运行过程中输入b还是w,执行的都是WF,这一点我调试了好久好久才发现的。

2,另外程序中但凡有scanf的地方后面都要加上getchar把缓冲区里的清空!!!这一点也很重要,否则你程序运行过程中该输入的地方没法输入的。

3,另外在main函数的do-while循环中把第一个printf删去,这个放的地方不对啊,而且这个scanf里面应该是%c。

操作系统上机随笔《实验三》

输出结果:

BF:

操作系统上机随笔《实验三》

 操作系统上机随笔《实验三》

说明:

可以看到当内存还有(20,55)和(70,100)这两个时,当我们再使用15的内存,使用BF算法会选择出合适内存中最小的一块,也就是(70,100),然后空闲内存还有(20,55)和(85,100),我们再使用10的内存,使用BF算法会选择出合适内存中最小的一块,也就是(85,100),然后空闲内存还有(20,55)和(95,100)。

WF:

操作系统上机随笔《实验三》

操作系统上机随笔《实验三》

说明:

可以看到当内存还有(20,55)和(70,100)这两个时,当我们再使用15的内存,使用WF算法会选择出合适内存中最大的一块,也就是(20,55),然后空闲内存还有(35,55)和(70,100),我们再使用10的内存,使用BF算法会选择出合适内存中最大的一块,也就是(70,100),然后空闲内存还有(35,55)和(85,100)。

分析实验结果:

函数功能:

BF_malloc函数:

调用该函数,在目前的map内,找到自己传入参数size的合适的并且范围最小的一块内存,并且占用该内存中size大小。

WF_malloc函数:

调用该函数,在目前的map内,找到自己传入参数size的合适的并且范围最大的一块内存,并且占用该内存中size大小。

mfree函数:

调用该函数,在目前的map内,释放出首地址为aa的,大小为size的一块内存,并且将该内存与已有的空闲内存进行合并。

init函数:

调用该函数是为了初始化map,获取该map大小。

show_map函数:

打印出目前map中空闲的内存块。

Main函数:

主函数,调用该函数,指明选择BF还是WF,并且在while循环中可以不断对内存进行操作。

函数之间调用关系:

在main函数中首先选择使用BF还是WF,然后调用init函数进行初始化map,然后在do-while循环中首先调用show_map函数打印出目前map空闲内存块,然后输入参数进行选择,输入1代表要占用内存,调用BF_malloc/WF_malloc选择合适的内存占用;输入2代表要释放内存,调用mfree函数释放内存;输入0代表结束程序。

关键语句功能说明:

for(bpp = bp; bpp->m_size; bpp++)

      {   //最佳适应

            if(bpp->m_size >= size && bpp->m_size < s)

            {

                 a = bpp->m_addr;

                 s = bpp->m_size;

                 bp = bpp;

            }

      }

这一段在BF函数里面,主要作用是遍历目前的map,然后在其中找出范围大于size的,并且返回最小的一块内存的起点。

for(bpp = bp; bpp->m_size; bpp++)

      {   //最坏适应

             if(bpp->m_size > s)

             {

                  a = bpp->m_addr;

                  s = bpp->m_size;

                  bp = bpp;

             }

      }

这一段在WF函数里面,主要作用是遍历目前的map,然后在其中找出范围大于size的,并且返回最大的一块内存的起点。

if(bp>mp && (bp-1)->m_addr+(bp-1)->m_size==a)

{  //与前合并

             (bp-1)->m_size += size;

             if (a+size == bp->m_addr)

             {   //前后合并

                 (bp-1)->m_size += bp->m_size;

                 while (bp->m_size)

                 {

                       bp++;

                       (bp-1)->m_addr = bp->m_addr;

                       (bp-1)->m_size = bp->m_size;

                 }

             }

      }

else

      {

           if (a+size == bp->m_addr && bp->m_size)

           {   //与后合并

                bp->m_addr -= size;

                bp->m_size += size;

           }

           else if (size)

               do

               {   //无合并

                   t = bp->m_addr;

                   bp->m_addr = a;

                   a = t;

                   t = bp->m_size;

                   bp->m_size = size;

                   bp++;

               }

               while (size = t);

}

这一段是在内存释放合并函数里的,主要功能是把函数传入的参数的一块内存放入map表内,并且将目前的map表进行一次遍历,如果有两块内存是相连的,则将其合并在一起。

5,思考题

挖坑文章来源地址https://www.toymoban.com/news/detail-495989.html

参考

  • (20条消息) 实例分析首次适应算法、最佳适应算法、最差适应算法_焕听的博客-CSDN博客_循环首次适应算法例题讲解

到了这里,关于操作系统上机随笔《实验三》的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机操作系统实验:进程调度实验

    前言 二、实验目的 三、实验要求 四、实验原理 五、实验过程 六、代码详解 总结 计算机操作系统是管理计算机硬件和软件资源的核心软件,它负责为用户提供一个友好、高效、安全的使用环境。进程调度是操作系统的一个重要功能,它决定了进程在处理器上的执行顺序和时

    2024年02月07日
    浏览(52)
  • 操作系统实验(进程调度)

      1.1理解有关进程控制块、进程队列的概念。   1.2掌握进程优先权调度算法和时间片轮转调度算法的处理逻辑。   2.1设计进程控制块PCB的结构,分别适用于优先权调度算法和时间片轮转调度算法。   2.2建立进程就绪队列。   2.3编制两种进程调度算法:优先权调度

    2024年02月06日
    浏览(46)
  • 操作系统期末实验:多用户二级文件系统

    期末实验不是python写的,所以很可能是当时在github上找了一个,然后改了改hhh 如果后续找到了链接就放过来 设计一个多用户的二级文件系统,能够实现简单的文件操作。具体包括如下几条命令: (1)Dir 列文件目录; (2)Create 创建文件 (3)Delete 删除文件 (4)Deldir 删除

    2024年01月18日
    浏览(41)
  • 操作系统实验之文件管理

    目录 一、实验目的 二、实验内容 三、实验思路 四、主要数据结构 五、实验流程图 六、实现代码 七、运行结果 通过这次实验,掌握文件系统的用户管理,掌握普通文件、目录文件管理的基本原理。 1、通过初始化操作建立一个模拟外存空间的虚拟磁盘文件,在该文件中保存

    2024年02月05日
    浏览(48)
  • 操作系统 | 实验八 文件管理

    掌握文件的存取方法;掌握文件的逻辑结构和物理结构;掌握存储空间的分配和回收;掌握磁盘管理与调度。 用程序模拟磁盘的调度过程,并计算各磁盘调度算法包括先来先服务算法、最短寻道时间优先算法、扫描算法和循环扫描算法的平均寻道长度。 本实验是模拟操作系

    2024年02月06日
    浏览(47)
  • 操作系统实验五 存储管理

    ★观前提示 : 本篇内容为操作系统实验内容 ,代码等内容经测试没有问题,但是 可能会不符合每个人实验的要求 ,因此以下内容建议 仅做思路参考 。 一、实验目的 掌握 虚拟内存 的管理机制。 了解虚拟存储技术的 特点 。 掌握请求分页存储管理的 页面置换算法 。 二、

    2024年02月06日
    浏览(43)
  • 操作系统实验之存储管理

    一、实验目的 1、了解虚拟存储技术的特点,掌握请求页式存储管理的主要页面置换算法原理。 2、掌握请求页式存储管理中页面置换算法的模拟设计方法。 3、通过随机产生页面访问序列开展有关算法的测试及性能比较。 二、实验内容 设计一个虚拟存储区和内存工作区,并

    2024年02月08日
    浏览(44)
  • 操作系统实验:进程同步控制

    前言 一、开发语言及实验平台或实验环境 二、实验目的 三、实验要求 四、实验原理 五、实验过程 六、代码详解 七、diy一下 总结 计算机操作系统是一门研究计算机系统的基本原理和设计方法的课程,它涉及到计算机系统的结构、功能、性能和管理等方面。操作系统实验是

    2024年02月05日
    浏览(41)
  • 操作系统-进程调度实验报告

    1.实现四种不同及进程调度算法: 先来先服务、时间片轮转调、优先级调度以及短作业优先调度算法。 2.通过实验理解有关进程控制块,进程队列等的概念。 1.运行素材中的代码,观察其执行结果是否正确?各个调度算法的功能是否完善?如果没有,则完善。 2. 按照下表

    2024年02月06日
    浏览(39)
  • 操作系统 | 实验五 页面置换算法

    (1)加深对页面置换算法的理解。 (2)掌握几种页面置换算法的实现方法。 (3)通过实验比较各种置换算法的优劣。 参考用C语言实现的先进先出算法FIFO的代码,实现最佳置换算法OPT和最近最少使用算法LRU。使得随机给出一个页面执行序列,计算不同置换算法的缺页数,

    2024年02月04日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包