操作系统——磁盘调度算法的模拟与实现

news2024/10/7 12:29:16

一、实验题目

磁盘调度算法的模拟与实现

二、实验目的

(1) 了解磁盘结构以及磁盘上数据的组织方式。

(2) 掌握磁盘访问时间的计算方式。

(3) 掌握常用磁盘调度算法及其相关特性。

三、总体设计(含背景知识或基本原理与算法、模块介绍、设计步骤等)

共享设备的典型代表为磁盘,磁盘物理块的地址由柱面号、磁头号、扇区号来指定,完成磁盘某一个物理块的访问要经过三个阶段:寻道时间Ts、旋转延迟时间Tw和读写时间Trw。

寻道时间Ts是磁头从当前磁道移动到目标磁道所需要的时间;旋转延迟时间Tw是当磁头停留在目标磁道后,目标物理块从当前位置旋转到磁头位置的时间;读写时间Trw是目标物理块内容与内存中对应交换的时间。磁盘调度的原则是公平和高吞吐量,衡量指标有访问时间T和平均访问时间Ta:

T=Ts+Tw+Trw

Ta=Tsa+Twa+Trwa

寻道时间和旋转延迟时间成为调度算法的主要考虑因素。减少访问时间就是要减少寻道时间和旋转延迟时间。

(1)先来先服务算法(FCFS)First Come First Service

这是一种比较简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。此算法由于未对寻道进行优化,在对磁盘的访问请求比较多的情况下,此算法将降低设备服务的吞吐量,致使平均寻道时间可能较长,但各进程得到服务的响应时间的变化幅度较小。

(2)最短寻道时间优先算法(SSTF) Shortest Seek Time First

该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比较好的吞吐量,但却不能保证平均寻道时间最短。其缺点是对用户的服务请求的响应机会不是均等的,因而导致响应时间的变化幅度很大。在服务请求很多的情况下,对内外边缘磁道的请求将会无限期的被延迟,有些请求的响应时间将不可预期。

(3)扫描算法(SCAN)电梯调度

扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。例如,当磁头正在自里向外移动时,扫描算法所选择的下一个访问对象应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。这时,同样也是每次选择这样的进程来调度,即其要访问的磁道,在当前磁道之内,从而避免了饥饿现象的出现。由于这种算法中磁头移动的规律颇似电梯的运行,故又称为电梯调度算法。此算法基本上克服了最短寻道时间优先算法的服务集中于中间磁道和响应时间变化比较大的缺点,而具有最短寻道时间优先算法的优点即吞吐量较大,平均响应时间较小,但由于是摆动式的扫描方法,两侧磁道被访问的频率仍低于中间磁道。

(4)循环扫描算法(C-SCAN)

    在扫描算法的基础上规定磁头单向移动来提供服务,回返时直接快速移动至起始端而不服务任何请求。

四、详细设计(含主要的数据结构、程序流程图、关键代码等)

 

关键代码:

void FCFS()

{

  printf("先来先服务 FCFS\n");

  printf("被访问的下一个磁道\t\t\t磁道号移动距离\n");

    int su=kai;

      sum=0;

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

      { if(su<s[i])

      s1[i]=s[i]-su;

      else

      s1[i]=su-s[i];

      su=s[i];

      sum+=s1[i];

      }

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

       {

         printf("\t%d\t\t\t\t\t%d\t\t\n",s[i],s1[i]);

       }

      printf("寻道长度:%d\n",sum);

}

void SSTF()

{

      printf("最短寻道 SSTF:\n");

      printf("被访问的下一个磁道\t\t\t磁道号移动距离\n");

      int su=kai;

      int s2[100];

      sum=0;

      for(int i=0;i<m;i++)

      s2[i]=c1[i];

      for(int i=0;i<n;i++)

      s2[i+m]=c2[i];

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

      { if(su<s2[i])

      s1[i]=s2[i]-su;

      else

      s1[i]=su-s2[i];

      su=s2[i];

      sum+=s1[i];

      }

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

       {

         printf("\t%d\t\t\t\t\t%d\t\t\n",s2[i],s1[i]);

       }

       printf("寻道长度:%d\n",sum);

    }

void SCAN()

{

     printf("扫描算法 SCAN:\n");

     printf("被访问的下一个磁道:\t\t\t磁道号移动距离:\n");

      int su=kai;

      int s2[100];

      sum=0;

      for(int i=0;i<n;i++)

      s2[i]  =c2[i];

      for(int i=0;i<m;i++)

      s2[i+n]=c1[i];

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

      { if(su<s2[i])

        s1[i]=s2[i]-su;

        else

        s1[i]=su-s2[i];

        su=s2[i];

        sum+=s1[i];

      }

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

       {

         printf("\t%d\t\t\t\t\t%d\t\t\n",s2[i],s1[i]);

       }

       printf("寻道长度:%d\n",sum);

    }

void CSAN()

{

     printf("循环扫描 CSAN:\n");

     printf("被访问的下一个磁道:\t\t\t磁道号移动距离:\n");

      int su=kai;

      int j=0;

      int s2[100];

      sum=0;

      for(int i=0;i<n;i++)

      s2[i]  =c2[i];

      for(int i=m-1;i>=0;j++,i--)

      s2[j+n]=c1[i];

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

      { if(su<s2[i])

        s1[i]=s2[i]-su;

 else

        s1[i]=su-s2[i];

        su=s2[i];

        sum+=s1[i];

      }

      //sum=sum/num;

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

       {printf("\t%d\t\t\t\t\t%d\t\t\n",s2[i],s1[i]);

       }

       printf("寻道长度:%d\n",sum);

        }

五、实验结果与分析

先是创建磁道:

 

>创建磁道后,选择算法,进行排序。并求出 被访问磁道顺序,磁道号移动距离,寻到长度。

 

 

六、小结与心得体会

这个实验实现了一个简单的磁盘调度算法模拟程序。它提供了以下功能:

创建磁道:用户可以输入磁道的起始位置、最长磁道号以及磁道的个数,并检查输入的合法性。

先来先服务(FCFS):按照请求的顺序依次访问磁道,计算磁道号移动距离和寻道长度。

最短寻道(SSTF):选择与当前磁头位置最近的磁道进行访问,计算磁道号移动距离和寻道长度。

扫描算法(SCAN):磁头从起始位置开始,依次向一个方向移动,直到最边界,然后改变方向,计算磁道号移动距离和寻道长度。

循环扫描算法(CSCAN):磁头从起始位置开始,依次向一个方向移动,直到最边界,然后回到起始位置,计算磁道号移动距离和寻道长度。

该程序实现了基本的磁盘调度算法,可以有效地模拟磁盘访问过程,并计算出寻道长度。

*不同的调度算法在不同的磁盘访问模式下可能会有不同的性能表现,可以通过多次测试和比较来选择合适的算法。

*代码实现较为简单,没有加入错误处理和异常情况的处理,可以进一步完善代码以提高程序的稳定性和健壮性。

*通过该程序的实现,可以更好地理解磁盘调度算法的原理和实际应用,对操作系统的磁盘管理有更深入的了解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/683348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络--网络编程(1)

简单认识一下传输层中的UDP和TCP&#xff1a; TCP&#xff1a;有链接&#xff0c;可靠传输&#xff0c;面向字节流&#xff0c;全双工 UDP&#xff1a;无连接&#xff0c;不可靠传输&#xff0c;面向数据报&#xff0c;全双工 有链接类似于打电话&#xff0c;通了就是有链接。…

软件测试项目中如何做好单元测试

前言 如《Unit Testing》书里提到&#xff0c;学习单元测试不应该仅仅停留在技术层面&#xff0c;比如你喜欢的测试框架&#xff0c;mocking 库等等&#xff0c;单元测试远远不止「写测试」这件事&#xff0c;你需要一直努力在单元测试中投入的时间回报最大化&#xff0c;尽量…

kotlin Flow系列之-SharedFlow

文章目录 前言SharedFlow之创建SharedFlow之缓存系统buffer&Slots SharedFlow源码发送数据接收数据SharedFlow存在的bug 前言 Kotlin中Flow被分为冷流 热流 两大类。比如经常被使用的flow{}函数就可以创建一个冷流。而本文的主角SharedFlow就是一个热流。冷流需要调用Flow…

Makefile基本原理详解及使用

1、什么是 Makefile 一个企业级项目&#xff0c;通常会有很多源文件&#xff0c;有时也会按功能、类型、模块分门别类的放在不同的目录中&#xff0c;有时候也会在一个目录里存放了多个程序的源代码。 这时&#xff0c;如何对这些代码的编译就成了个问题。Makefile 就是为这个问…

电路图中常见符号总结

前辈说不会FPGA电路原理图&#xff0c;就不能知道如何去控制、如何去实现 因此本篇记录看的原理图中见到的符号&#xff0c;虽然都很基础&#xff0c;但我都不会&#xff0c;难受&#xff0c;因此只能看一点记一点 >_< >_< >_< >_< >_&…

如何学习和提升软件测试与调试的能力?

要学习和提升软件测试和调试能力&#xff0c;可以考虑以下方法&#xff1a; 学习软件测试基础知识&#xff1a; 了解软件测试的基本概念、原则和方法。可以通过阅读相关书籍、参加在线课程或培训来学习软件测试的基础知识。 掌握测试技术和工具&#xff1a; 了解各种测试技术…

南卡OE Pro新品上线即刻售罄:秒空背后的热潮是什么?

近日&#xff0c;南卡OE Pro品牌的最新产品上线&#xff0c;却在瞬间被抢购一空&#xff0c;引起了广大耳机爱好者的热烈关注和激烈讨论。这一现象再次展示了南卡OE Pro在耳机市场的强劲号召力和深受用户喜爱的地位。让我们一起揭开这场秒空背后的热潮&#xff0c;探究引发如此…

全网首个Ozon选品数据分析软件重磅上线!

【萌啦OZON数据】分析工具重磅上线&#xff01;在线解析俄罗斯市场、开启热销选品新玩法&#xff01;1对1免费指导&#xff0c;详细演示软件选品&#xff0c;快速上手&#xff01; 欧洲第四大电商市场OZON 近日&#xff0c;俄罗斯电商平台Ozon2023年Q1业绩新鲜出炉。数据显示&a…

OpenStack(T版)基础环境准备

文章目录 OpenStack(T版)基础环境准备centos硬件安装版本安装两台centos7服务器虚拟网络编辑器配置网络修改主机名主机名映射关闭防火墙和SElinux配置时间服务器安装openstack(T版)包安装SQL数据库(controller)安装消息队列rabbitmq(controller)安装分布式内存对象缓存系统memc…

代码随想录算法训练营第46天 | 139.单词拆分 + 多重背包理论基础 + 背包问题总结

今日任务 目录 139.单词拆分 - Medium 多重背包理论基础 背包问题总结 递推公式 遍历顺序 139.单词拆分 - Medium 题目链接&#xff1a;力扣-139. 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意…

操作系统——实现一个简单的 shell 命令行解释器

一&#xff1a;实验题目 实现一个简单的 shell 命令行解释器 二&#xff1a;实验目的 本实验主要目的在于进一步学会如何在 Linux 系统下使用进程相关的系统调用&#xff0c;了解 shell 工作 的基本原理&#xff0c;自己动手为 Linux 操作系统设计一个命令接口。 三&…

WebSocket是什么,怎么用

74. WebSocket是什么&#xff0c;怎么用 当涉及到实时通信和即时更新的需求时&#xff0c;WebSocket 是一种强大且常用的解决方案。 1. 什么是 WebSocket&#xff1f; WebSocket 是一种在客户端和服务器之间实现双向通信的协议。它允许服务器主动向客户端推送数据&#xff0…

在Mac上安装Aspectj1.9.8(用于Java17)

1. 确定所使用的Java版本和AspectJ的对应关系 2. 下载AspectJ包 3. 安装AspectJ 4. 添加AspectJ对应的环境变量 5. 测试AspectJ 5.1 简单命令行测试安装是否成功 5.2 在IDEA中添加对AspectJ的支持【todo】 5.3 敲测试代码并进行测试【todo】 -----------------------------…

如何将window文件夹挂载到VMware系统mnt目录

背景&#xff1a;项目开发过程中&#xff0c;通常是在Windows上编码&#xff0c;有些框架和软件只能够在Linux上面执行&#xff0c;如果在 VMware中的Linux上面开发不太方便&#xff0c;因此需要在Windows上面开发好再同步到Linux上面运行。 软件&#xff1a; Samba客户端 V…

nodejs安装及环境变量配置(修改全局安装依赖工具包和缓存文件夹及npm镜像源)

本机环境&#xff1a;win11家庭中文版 一、官网下载 二、安装 三、查看nodejs及npm版本号 1、查看node版本号 node -v 2、查看NPM版本号&#xff08;安装nodejs时已自动安装npm&#xff09; npm -v 四、配置npm全局下载工具包和缓存目录 1、查看安装目录 在本目录下创建no…

抓包技术的应用示例

前言 最近瑞幸在搞活动&#xff0c;每天免费送10000份咖啡&#xff0c;我是个不喝咖啡的人儿&#xff0c;所以没咋关注&#xff0c;今早我们的团宠小妹&#xff0c;拉着我 10点整拼手速&#xff0c;想着帮她抢一杯&#xff0c;于是点开瑞幸咖啡小程序主页&#xff0c;banner 栏…

数学建模常用算法之主成分分析

数学建模常用算法之主成分分析 引言步骤实例以及代码 引言 主成分分析是一种降维算法&#xff0c;它能将多个指标转换为少数几个主成分&#xff0c;这些主成分是原始变量的线性组合&#xff0c;且彼此之间互不相关&#xff0c;且能反映出原始数据的大部分信息。 一般来说&#…

机器学习笔记 - vision transformer(ViT)简述

一、ViT简述 视觉转换器 vision_transformer(ViT) 因其令人印象深刻的准确率和计算效率而迅速成为卷积神经网络 (CNN) 在计算机视觉任务中的首选替代品。ViT模型在许多数据集和任务组合中的表现比CNN高出近4倍,从而确立了自己作为非常强大的竞争者的地位。 同样,基于转换…

采样中断服务程序原理

采样中断服务程序框图如图2&#xff0d;6所示。采样中断服务程序主要包括采样计算&#xff0c;TV、TA断线自检和保护起动元件三个部分。同时还可以根据不同的保护特点&#xff0c;增加一些检测被保护系统状态的程序。 一、采样计算概述 进入采样中断服务程序&#xff0c;首先进…

抖音林客服务商入驻申请

抖音林客服务商后台提供了以下主要功能&#xff1a; 数据报告&#xff1a;可以查看账户的广告投放、效果等数据报告&#xff0c;并进行数据分析和优化。 广告投放平台&#xff1a;可以创建和管理广告投放计划、定向和出价等设置&#xff0c;以及监控广告投放效果。 …