吉林大学操作系统上机实验五(磁盘引臂调度算法(scan算法)实现)
本次实验无参考,从头开始实现。
一.实验内容
- 模拟实现任意一个磁盘引臂调度算法,对磁盘进行移臂操作
- 列出基于该种算法的磁道访问序列,计算平均寻道长度。
二.实验设计
- 假设磁盘只有一个盘面,并且磁盘是可移动头磁盘。
- 磁盘是可供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。当有进程在 访问某个磁盘时,其它想访问该磁盘的进程必须等待,直到磁盘一次工作结束。当有多个进程 提出输入输出请求而处于等待状态时,可选用适当的磁盘调度算法从若干个等待访问者中选择 一个进程,让它访问磁盘。为此设置“驱动调度”进程。
- “初始化”进程建立一张“进程请求 I/O”表,列出等待访问磁盘的进程要求访问的磁道,表的格式如下:
三.实验准备
- 扫描算法(SCAN)
图一 SCAN算法
- SCAN算法是一种用于磁盘调度的算法,旨在优化磁盘臂的移动,以减少磁盘访问的平均等待时间。SCAN算法也被称为ELEVATOR算法,因为它模仿了电梯(升降机)的行为:磁盘臂在磁盘的一端开始移动,沿着一个方向移动直到到达另一端,然后反向移动,服务沿途的所有请求,直到回到起始端。
- 选择方向:磁盘臂可以往一个方向移动,比如从磁盘的外围磁道向内移动,或者从内向外移动。这个方向通常是由磁盘臂上次移动的方向决定,或者是根据请求的分布情况来设定。
- 服务请求:磁盘臂在移动过程中,会服务所有沿移动方向的未服务请求。
- 到达端点:当磁盘臂到达磁盘的一端时,它会反向移动,同时继续服务沿新移动方向的请求。
- 重复过程:磁盘臂会继续在磁盘的两端之间移动,服务所有请求,直到所有请求都被服务完毕。
- 减少寻址时间:由于磁盘臂只在两个方向上移动,可以减少磁盘臂的移动距离,从而减少寻址时间。
- 防止请求饥饿:与SSTF算法相比,SCAN算法可以确保所有请求最终都会被服务,因为磁盘臂会在两个方向上移动。
- 磁头震荡:虽然SCAN算法可以减少磁盘臂的移动距离,但如果请求集中在磁盘的一端,可能会导致磁盘臂在两端之间频繁移动,造成磁头震荡。
- 响应时间不均:请求的响应时间可能会因为它们在磁盘上的位置而有所不同,位于磁盘两端和中间的请求可能会有不同的响应时间。
四.代码
#include <stdio.h>
#include <stdlib.h>// SCAN 算法的核心函数
int SCAN(int* cyc_list, int* cyc_order, int n, int start, int dir) {int sum, max_int, min_value, index, tag[100] = { 0 };sum = 0; int x_max = cyc_list[0], x_min = cyc_list[0];for (int i = 1; i < n; i++) {if (cyc_list[i] > x_max) {x_max = cyc_list[i];}if (cyc_list[i] < x_min) {x_min = cyc_list[i];}}int turn = 0;for (int i = 0; i < n; i++) {max_int = 9999;for (int j = 0; j < n; j++) {if (dir == 1 && cyc_list[j] > start && tag[j] == 0) {// cyc_list表示待执行柱面min_value = cyc_list[j] - start;if (min_value < max_int) {max_int = min_value;index = j; // 记录距离最小的待执行柱面号的索引}}else if (dir == 0 && cyc_list[j] < start && tag[j] == 0) {min_value = abs(cyc_list[j] - start);if (min_value < max_int) {max_int = min_value;index = j; // 记录距离最小的待执行柱面号的索引}}}// 判断是否需要转向if (dir == 1 && turn == 0 && cyc_list[index] == x_max) {dir = 0;if (i != n - 1) sum += 2 * (500 - x_max);`turn = 1;}else if (turn == 0 && cyc_list[index] == x_min) {dir = 1;if (i != n - 1) sum += 2 * x_min;}sum += max_int; // 累积磁头移动轨道数tag[index] = 1;cyc_order[i] = cyc_list[index];start = cyc_list[index];}return sum;
}// SCAN
void main() {int cyc_list[100], cyc_order[100], n, start, dir, ans = 0;printf("请输入磁臂初始移动方向(1向内,0向外):");//1向大数走,0向小数走scanf("%d", &dir);printf("请输入初始柱面和待执行柱面数量:");scanf("%d%d", &start, &n);printf("请输入待执行柱面:");for (int i = 0; i < n; i++) {scanf("%d", &cyc_list[i]);}ans = SCAN(cyc_list, cyc_order, n, start, dir);printf("SCAN走道顺序为:");for (int i = 0; i < n; i++) {printf("%d", cyc_order[i]);if (i + 1 != n) {printf(" -> ");}}printf("\n");printf("磁头走过总道数为:%d\n", ans);float res = (float)ans / n;printf("平均寻道长度: %.1f\n", res);
}
具体实现:
main函数中录入必要数据。
SCAN函数执行具体选取。
x_max和x_min分别记录输入数据中最大柱面和最小柱面。
int x_max = cyc_list[0], x_min = cyc_list[0];
for (int i = 1; i < n; i++) {if (cyc_list[i] > x_max) {x_max = cyc_list[i];}if (cyc_list[i] < x_min) {x_min = cyc_list[i];}
}
每一次选取时,都选取在磁头移动方向上,距离上次位置(start)最近且未被选取过(tag=0)的点。
max_int = 9999;
for (int j = 0; j < n; j++) {if (dir == 1 && cyc_list[j] > start && tag[j] == 0) {// cyc_list表示待执行柱面min_value = cyc_list[j] - start;if (min_value < max_int) {max_int = min_value;index = j; // 记录距离最小的待执行柱面号的索引}}else if (dir == 0 && cyc_list[j] < start && tag[j] == 0) {min_value = abs(cyc_list[j] - start);if (min_value < max_int) {max_int = min_value;index = j; // 记录距离最小的待执行柱面号的索引}}
}
每次选取后,若开始时向内,则判断是否未转向过且选取点是最大点,若是,则转向。如果该点不是最后一个点,则磁头总移动距离需另外加上移到边界又再次移动到该点的距离。开始时向外类似处理。
// 判断是否需要转向
if (dir == 1 && turn == 0 && cyc_list[index] == x_max) {dir = 0;if (i != n - 1) sum += 2 * (500 - x_max);`turn = 1;
}
else if (turn == 0 && cyc_list[index] == x_min) {dir = 1;if (i != n - 1) sum += 2 * x_min;
}
选取完成后,累积磁头移动轨道数,将该点访问标志(tag)置1,将该点加入序列,更新上次位置(start)为该点柱面数。
sum += max_int; // 累积磁头移动轨道数
tag[index] = 1;
cyc_order[i] = cyc_list[index];
start = cyc_list[index];
五.运行结果
TIPS:模拟硬盘一共有500柱面。
相关文章:

吉林大学操作系统上机实验五(磁盘引臂调度算法(scan算法)实现)
本次实验无参考,从头开始实现。 一.实验内容 模拟实现任意一个磁盘引臂调度算法,对磁盘进行移臂操作列出基于该种算法的磁道访问序列,计算平均寻道长度。 二.实验设计 假设磁盘只有一个盘面,并且磁盘是可移动头磁盘。磁盘是可…...
【深度学习-pytorch篇】4. 正则化方法(Regularization Techniques)
正则化方法(Regularization Techniques) 1. 目标 理解什么是过拟合及其影响掌握常见正则化技术:L2 正则化、Dropout、Batch Normalization、Early Stopping能够使用 PyTorch 编程实现这些正则化方法并进行比较分析 2. 数据构造与任务设定 …...

ESP8266+STM32 AT驱动程序,心知天气API 记录时间: 2025年5月26日13:24:11
接线为 串口2 接入ESP8266 esp8266.c #include "stm32f10x.h"//8266预处理文件 #include "esp8266.h"//硬件驱动 #include "delay.h" #include "usart.h"//用得到的库 #include <string.h> #include <stdio.h> #include …...
WPF【11_5】WPF实战-重构与美化(MVVM 实战)
11-10 【重构】创建视图模型,显示客户列表 正式进入 MVVM 架构的代码实战。在之前的课程中, Model 和 View 这部分的代码重构实际上已经完成了。 Model 就是在 Models 文件夹中看到的两个文件, Customer 和 Appointment。 而 View 则是所有与…...

⭐️⭐️⭐️ 模拟题及答案 ⭐️⭐️⭐️ 大模型Clouder认证:RAG应用构建及优化
考试注意事项: 一、单选题(21题) 检索增强生成(RAG)的核心技术结合了什么? A. 图像识别与自然语言处理 B. 信息检索与文本生成 C. 语音识别与知识图谱 D. 数据挖掘与机器学习 RAG技术中,“建立索引”步骤不包括以下哪项操作? A. 将文档解析为纯文本 B. 文本片段分割(…...

kali系统的安装及配置
1 kali下载 Kali 下载地址:Get Kali | Kali Linux (https://www.kali.org/get-kali) 下载 kali-linux-2024.4-installer-amd64.iso (http://cdimage.kali.org/kali-2024.4/) 2. 具体安装步骤: 2.1 进入官方地址,点击…...
CSS--background-repeat详解
属性介绍 background-repeat 属性在CSS中用于控制背景图像是否以及如何重复。当背景图像的尺寸小于其容器的尺寸时,该属性决定了图像如何填充额外的空间。默认情况下,背景图像会在横向和纵向上重复,直到覆盖整个元素。 常见取值 repeat …...

Redis的大Key问题如何解决?
大家好,我是锋哥。今天分享关于【Redis的大Key问题如何解决?】面试题。希望对大家有帮助; Redis的大Key问题如何解决? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis中的“大Key”问题是指某个键的值占用了过多…...

影楼精修-AI追色算法解析
注意:本文样例图片为了避免侵权,均使用AIGC生成; AI追色是像素蛋糕软件中比较受欢迎的一个功能点,本文将针对AI追色来解析一下大概的技术原理。 功能分析 AI追色实际上可以理解为颜色迁移的一种变体或者叫做升级版,…...

node入门:安装和npm使用
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、安装npm命令nvm 前言 因为学习vue接触的,一直以为node是和vue绑定的,还以为vue跑起来必须要node,后续发现并不是。 看…...
‘js@https://registry.npmmirror.com/JS/-/JS-0.1.0.tgz‘ is not in this registry
解决方法: 1. npm cache clean --force 2.临时切换到官方源 npm config set registry https://registry.npmjs.org/ npm install js0.1.0 npm config set registry https://registry.npmmirror.com/ # 切换回镜像源...
el-table-column如何获取行数据的值
在Element UI的el-table组件中,你可以通过el-table-column的slot-scope属性(在Vue 2.x中)或者#default插槽的scope属性(在Vue 3.x中)来获取当前行的数据。以下是如何实现这一功能的详细步骤: 在el-table-…...
leetcode450.删除二叉搜索树中的节点:迭代法巧用中间节点应对多场景删除
一、题目深度解析与BST特性剖析 在二叉搜索树(BST)中删除节点,需确保删除操作后树依然保持BST特性。题目要求我们根据给定的节点值key,在BST中删除对应节点。BST的核心特性是左子树所有节点值小于根节点值,右子树所有…...

java虚拟机2
一、垃圾回收机制(GC) 1. 回收区域:GC主要回收堆内存区域。堆用于存放new出来的对象 。程序计数器、元数据区和栈一般不是GC回收的重点区域。 2. 回收单位:GC以对象为单位回收内存,而非字节。按对象维度回收更简便&am…...
自监督软提示调优:跨域NLP新突破
自监督的软提示调优方法(SPSS) 这篇论文提出了一种基于自监督的软提示调优方法(SPSS),用于无监督领域自适应。其核心目标是通过挖掘源域和目标域的内部知识,解决传统提示调优在跨域场景中依赖通用知识、模板生成低效的问题。 一、核心实现原理 1. 自监督分层聚类优化(…...

Pydantic 学习与使用
Pydantic 学习与使用 在 Fastapi 的 Web 开发中的数据验证通常都是在使用 Pydantic 来进行数据的校验,本文将对 Pydantic 的使用方法做记录与学习。 **简介:**Pydantic 是一个在 Python 中用于数据验证和解析的第三方库,它现在是 Python 使…...

PCB设计教程【入门篇】——电路分析基础-基本元件(二极管三极管场效应管)
前言 本教程基于B站Expert电子实验室的PCB设计教学的整理,为个人学习记录,旨在帮助PCB设计新手入门。所有内容仅作学习交流使用,无任何商业目的。若涉及侵权,请随时联系,将会立即处理、 目录 前言 1.二极管 1.发光…...

能按需拆分 PDF 为多个文档的工具
软件介绍 彩凤 PDF 拆分精灵是一款具备 PDF 拆分功能的软件。 功能特点 PDF 拆分功能较为常见,很多 PDF 软件都具备,例如 DC 软件提取 PDF 较为方便,但它不能从一个 PDF 里提取出多个 PDF。据印象,其他 PDF 软件也似乎没有能从…...

Apifox 5 月产品更新|数据模型支持查看「引用资源」、调试 AI 接口可实时预览 Markdown、性能优化
Apifox 新版本上线啦! 看看本次版本更新主要涵盖的重点内容,有没有你所关注的功能特性: 自动解析 JSON 参数名和参数值调试 AI 接口时,可预览 Markdown 格式的内容性能优化:新增「实验性功能」选项 使用独立进程执行…...

LiveGBS海康、大华、宇视、华为摄像头GB28181国标语音对讲及语音喊话:摄像头设备与服务HTTPS准备
LiveGBS海康、大华、宇视、华为摄像头GB28181国标语音对讲及语音喊话:摄像头设备与服务HTTPS准备 1、背景2、准备工作2.1、服务端必备条件(注意事项)2.2、语音对讲设备准备2.2.1、大华摄像机2.2.2、海康摄像机 3、开启音频并开始对讲4、相关问…...

Sqlalchemy 连mssql坑
连接失败: (pyodbc.OperationalError) (08001, [08001] [Microsoft][ODBC Driver 17 for SQL Server]SSL Provider: [error:0A00014D:SSL routines::legacy sigalg disallowed or unsupported] (-1) (SQLDriverConnect)) (Background on this error at: https://sqlalche.me/e/…...
Prompt Engineering 提示工程介绍与使用/调试技巧
1. 介绍 Prompt Engineering 是一种人工智能(AI)技术,它通过设计和改进 AI 的 prompt 来提高 AI 的表现。Prompt Engineering 的目标是创建高度有效和可控的 AI 系统,使其能够准确、可靠地执行特定任务。 如果你从来没有使用过Pr…...

LLaMaFactory - 支持的模型和模板 常用命令
一、 环境准备 激活LLaMaFactory环境,进入LLaMaFactory目录 cd LLaMA-Factoryconda activate llamafactory 下载模型 #模型下载 from modelscope import snapshot_download model_dir snapshot_download(Qwen/Qwen2.5-0.5B-Instruct) 二、启动一个 Qwen3-0.6B…...

大模型深度学习之双塔模型
前言 双塔模型(Two-Tower Model)是一种在推荐系统、信息检索和自然语言处理等领域广泛应用的深度学习架构。其核心思想是通过两个独立的神经网络(用户塔和物品塔)分别处理用户和物品的特征,并在共享的语义空间中通过相…...
MySQL 8主从同步实战指南:从原理到高可用架构落地
MySQL 8主从同步实战指南:从原理到高可用架构落地 本文将用3000字深度解析MySQL 8主从复制机制,配合全流程部署指南及电商平台实战案例,助你构建高性能数据库集群 一、主从复制核心原理剖析 1.1 复制架构全景图 #mermaid-svg-vdts3hTIyCtz4byk {font-family:"trebuche…...

瑞数6代jsvmp简单分析(天津电子税x局)
国际惯例 今天帮朋友看一个gov网站的瑞数加密(天津电子税x局) 传送门(登陆入口界面) 瑞数6特征 1.服务器会发两次包,第一次响应状态码为412,第二次响应状态码为200。 2.有三重debugger,其中有…...
缓存架构方案:Caffeine + Redis 双层缓存架构深度解析
在高并发、低延迟的现代互联网系统中,缓存是提升系统性能和稳定性的重要手段。随着业务复杂度的增长,单一缓存方案(如仅使用Redis或仅使用本地缓存)已难以满足高性能与一致性需求。 本文将围绕 Caffeine Redis 的双层缓存架构展…...
AI笔记 - 模型调试 - 调试方式
模型调试方式 基础信息打印模型信息计算参数量和计算量过滤原则profile方法get_model_complexity_info方法FlopCountAnalysis方法 基础信息 # 打印执行的设备数量:device_count:1 print(f"device_count:{torch.cuda.device_count()}")# 打印当前网络执行…...

榕壹云物品回收系统实战案例:基于ThinkPHP+MySQL+UniApp的二手物品回收小程序开发与优化
摘要:本文深入解析了一款基于ThinkPHPMySQLUniApp框架开发的二手物品回收小程序——榕壹云物品回收系统的技术实现与商业价值。通过剖析项目背景、核心技术架构、功能特性及系统优势,为开发者与潜在客户提供全面的参考指南,助力资源循环利用与…...

《软件工程》第 9 章 - 软件详细设计
目录 9.1 详细设计的任务与过程模型 9.2 用例设计 9.2.1 设计用例实现方案 9.2.2 构造设计类图 9.2.3 整合并优化用例实现方案 9.3 子系统设计 9.3.1 确立内部设计元素 9.3.2 导出设计类图 9.4 构件设计 9.5 类设计 9.5.1 精化类间关系 9.5.2 精化属性和操作 9.5.…...