【SCAU操作系统】实验四实现FCFS、SSTF、电梯LOOK和C-SCAN四种磁盘调度算法python源代码及实验报告参考

news2024/12/24 0:09:05

需求分析

设计一个程序将模拟实现FCFS(先来先服务)、SSTF(最短寻道时间优先)、电梯LOOK和C-SCAN(循环扫描)四种磁盘调度算法,并通过图形可视化界面动态展示每种算法的调度过程。

程序所能达到的功能;

实现FCFS、SSTF、电梯LOOK、C-SCAN四种磁盘调度算法。

计算并比较四种算法下磁头移动的总道数。

通过图形界面动态展示算法调度过程。

主程序流程

初始化磁头位置(start)。

调用 generate_requests() 函数生成磁道号序列。

分别调用 fcfs(),sstf(),look(),cscan() 来计算每种算法下的磁头移动道数,并获取移动路径。

比较并输出每种算法下的磁头移动道数。

使用图形库绘制可视化界面,展示每种算法的调度过程。

调用关系:

5b4b0fc45f7e41a09c365656704331b5.png

算法时间复杂性分析:

  1. FCFS:时间复杂度为O(n),因为只需遍历请求列表一次。
  2. SSTF:时间复杂性较高,因为每次选择下一个请求时都需要遍历整个请求列表。在最坏情况下,如果请求列表是按升序排列的,每次选择下一个请求时都需要遍历整个列表,时间复杂度为O(n^2)。
  3. LOOK:LOOK算法是SSTF的变种,它在同一方向移动时不会改变方向。其时间复杂性与SSTF类似,但通常性能会更好,因为它减少了不必要的方向切换。
  4. C-SCAN:C-SCAN算法按照一个方向扫描磁道,直到到达最远端,然后改变方向继续扫描。时间复杂性为O(n),因为磁头只需要遍历整个磁道范围两次(最坏情况下)。

运行结果:

FCFS algorithm movements: 63387

SSTF algorithm movements: 1677

LOOK algorithm movements: 2803

C-SCAN algorithm movements: 2966

b4afbc99c96545fe98f9475306f4f385.png

f76460d6ec0d4c21920e67b2660e9c4e.png

3e0a0e0e11884a149ad2772dd742e9f3.png

174af98acf5b42a3b617a9fde6bc5b8e.png

源代码:

import random
import matplotlib.pyplot as plt

# 生成磁道号序列
def generate_requests():
    requests = []
    for i in range(200):
        requests.append(random.randint(0, 499))
    for i in range(100):
        requests.append(random.randint(500, 999))
    for i in range(100):
        requests.append(random.randint(1000, 1499))
    return requests

# FCFS 算法
def fcfs(requests, start):
    movements = 0
    current = start
    movements_list = [current]
    for request in requests:
        movements += abs(request - current)
        current = request
        movements_list.append(current)
    return movements, movements_list

# SSTF 算法
def sstf(requests, start):
    movements = 0
    current = start
    movements_list = [current]
    while requests:
        next_request = min(requests, key=lambda x: abs(x - current))
        movements += abs(next_request - current)
        current = next_request
        movements_list.append(current)
        requests.remove(next_request)
    return movements, movements_list

# 电梯 LOOK 算法
def look(requests, start):
    if not requests:
        return 0, []  # 如果请求列表为空,则返回0移动数和空列表
    movements = 0
    current = start
    movements_list = [current]
    direction = 1  # 1表示向外,-1表示向内
    while requests:
        if direction == 1:
            next_request = min((x for x in requests if x >= current), default=None)
            if next_request is None:
                direction = -1
                continue
        else:
            next_request = max((x for x in requests if x <= current), default=None)
            if next_request is None:
                direction = 1
                continue
        movements += abs(next_request - current)
        current = next_request
        movements_list.append(current)
        requests.remove(next_request)
    return movements, movements_list

# C-SCAN 算法
def cscan(requests, start):
    if not requests:
        return 0, []
    sorted_requests = sorted([start] + requests)
    current = start
    movements = 0
    movements_list = [start]
    served = set([start])# 标记已服务的请求
    for request in sorted_requests[1:]:
        if request in served:
            continue
        movements += abs(request - current)
        current = request
        served.add(request)
        movements_list.append(current)
    if current != start:
        movements += abs(start - current)
        movements_list.append(start)
    return movements, movements_list

#FCFS
# 生成磁道号序列
requests = generate_requests()
# 设置磁头初始位置
start = random.randint(0, 1499)
fcfs_movements, fcfs_movements_list = fcfs(requests, start)
print("FCFS algorithm movements:", fcfs_movements)
# 可视化界面
plt.figure(figsize=(10, 6))
plt.plot(range(len(fcfs_movements_list)), fcfs_movements_list, label='FCFS', marker='o', linestyle='-')
plt.title("Disk Scheduling Algorithms")
plt.xlabel("Time")
plt.ylabel("Disk Track")
plt.legend()
plt.show()
#SSTF
# 生成磁道号序列
requests = generate_requests()
# 设置磁头初始位置
start = random.randint(0, 1499)
sstf_movements, sstf_movements_list = sstf(requests, start)
print("SSTF algorithm movements:", sstf_movements)
# 可视化界面
plt.figure(figsize=(10, 6))
plt.plot(range(len(sstf_movements_list)), sstf_movements_list, label='SSTF', marker='x', linestyle='--')
plt.title("Disk Scheduling Algorithms")
plt.xlabel("Time")
plt.ylabel("Disk Track")
plt.legend()
plt.show()

#LOOK
# 生成磁道号序列
requests = generate_requests()
# 设置磁头初始位置
start = random.randint(0, 1499)
look_movements, look_movements_list = look(requests, start)
print("LOOK algorithm movements:", look_movements)
# 可视化界面
plt.figure(figsize=(10, 6))
plt.plot(range(len(look_movements_list)), look_movements_list, label='LOOK', marker='s', linestyle='-')
plt.title("Disk Scheduling Algorithms")
plt.xlabel("Time")
plt.ylabel("Disk Track")
plt.legend()
plt.show()

#cscan
# 生成磁道号序列
requests = generate_requests()
# 设置磁头初始位置
start = random.randint(0, 1499)
cscan_movements, cscan_movements_list = cscan(requests, start)
print("C-SCAN algorithm movements:", cscan_movements)
# 可视化界面
plt.figure(figsize=(10, 6))
plt.plot(range(len(cscan_movements_list)), cscan_movements_list, label='C-SCAN', marker='d', linestyle='-.')
plt.title("Disk Scheduling Algorithms")
plt.xlabel("Time")
plt.ylabel("Disk Track")
plt.legend()
plt.show()

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

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

相关文章

消费增值的真面目!绿色积分的合理运用!

各位朋友&#xff0c;大家好&#xff01;我是吴军&#xff0c;来自一家备受瞩目的软件开发企业&#xff0c;担任产品经理一职。今天&#xff0c;我非常荣幸能有机会与大家分享一种在市场上备受瞩目的新型商业模式——消费增值模式。 随着环保和可持续发展理念日益深入人心&…

网络、HTTP、HTTPS、Session、Cookie、UDP、TCP

OSI 七层模型 应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 TCP/IP 五层模型 应用层&#xff1a;为用户的应用进程提供网络通信服务&#xff08;协议&#xff1a;域名系统DNS协议&#xff0c;HTTP协议&#xff0c;SMTP协议&#xff09;传输层&#xff1a;负…

Gopher的Rust第一课:第一个Rust程序

经过上一章[1]的学习&#xff0c;我想现在你已经成功安装好一个Rust开发环境了&#xff0c;是时候撸起袖子开始写Rust代码了&#xff01; 程序员这个历史并不算悠久的行当&#xff0c;却有着一个历史悠久的传统&#xff0c;那就是每种编程语言都将一个名为“hello, world”的示…

【渗透测试】|基于dvwa的CSRF初级,中级,高级

一、渗透测试 二、渗透测试过程中遇到的问题和解决 在初级csrf中&#xff0c;想要通过伪造一个404页面&#xff0c;达到修改密码的效果 伪造404页面的html代码如下&#xff1a; <html> <head> </head> <body> <img src"http://192.xx.xx.xx/…

python PyQt5 数字时钟程序

效果图&#xff1a; 概述 本文档将指导您如何使用Python的PyQt5库创建一个简单的时钟程序。该程序将显示当前时间&#xff0c;并具有以下特性&#xff1a; 始终在最前台显示。窗口可拖动。鼠标右键点击窗口可弹出退出菜单。时间标签具有红色渐变效果。窗口初始化时出现在屏幕…

解析智慧物流园区系统的多方位优势

智慧物流园区系统是基于物联网、大数据、人工智能等先进技术的应用系统&#xff0c;旨在实现物流园区的高效、智能化管理。随着物流行业的快速发展&#xff0c;传统物流园区已经无法满足日益增长的需求。智慧物流园区系统的出现填补了现有物流园区管理的空白&#xff0c;带来了…

Windows11系统安装QEMU虚拟化软件

Windows11系统安装QEMU虚拟化软件 QEMU软件是一个通用的开源机器模拟器和虚拟机。本文档适用于在Windows 11系统平台上安装QEMU软件。 1. 安装准备 1.1 安装平台 Windows 11 1.2. 软件信息 软件名称软件版本安装路径QEMUQEMU-8.2.93D:\qemu 1.3软件下载 QEMU官网官网下…

AI办公自动化:kimi批量新建文件夹

工作任务&#xff1a;批量新建多个文件夹&#xff0c;每个文件夹中的年份不一样 在kimi中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写关于录制电脑上的键盘和鼠标操作的Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹&…

【鸟叔的Linux私房菜】2-主机规划与磁盘分区

文章目录 2.1 Linux与硬件的搭配各硬件设备在Linux的文件名使用虚拟机学习 2.2 磁盘分区磁盘连接方式和设备文件名的关系MBR(MS-DOS)与GPT磁盘分区表MBR(MS-DOS)GPT磁盘分区表 启动流程的BIOS与UEFI启动检测程序BIOS搭配MBR/GPT的启动流程UEFI BIOS搭配 GPT启动的流程 Linux安装…

解决SSH客户端远程连接CentOS7虚拟机时加载过慢问题

1、编辑 /etc/ssh/sshd_config 文件&#xff0c;将 useDNS 中的 yes 改为 no &#xff0c;关闭UseDNS加速&#xff1a; vi /etc/ssh/sshd_config2、重启ssh服务: systemctl restart sshd

构建php环境、安装、依赖、nginx配置、ab压力测试命令、添加php-fpm为系统服务

目录 php简介 官网php安装包 选择下载稳定版本 &#xff08;建议使用此版本&#xff0c;文章以此版本为例&#xff09; 安装php解析环境 准备工作 安装依赖 zlib-devel 和 libxml2-devel包。 安装扩展工具库 安装 libmcrypt 安装 mhash 安装mcrypt 安装php 选项含…

【Linux】22. 线程控制

Linux线程控制 POSIX线程库 与线程有关的函数构成了一个完整的系列&#xff0c;绝大多数函数的名字都是以“pthread_”打头的 要使用这些函数库&#xff0c;要通过引入头文<pthread.h> 链接这些线程函数库时要使用编译器命令的“-lpthread”选项 线程创建 pthread_cr…

成都爱尔眼科蔡裕主任解说什么是近视性黄斑病变

近视性黄斑病变&#xff0c;属于黄斑病变的其中一种。 黄斑是眼内一个部位&#xff0c;它位于眼底的后极部&#xff0c;视网膜的中心部&#xff0c;管理着光、形、色。黄斑变性是指由于年龄、遗传、不良环境、慢性光损伤等各种因素的影响&#xff0c;使眼部视网膜处的黄斑发生…

kafka-主题创建(主题操作的命令)

文章目录 1、topic主题操作的命令1.1、创建一个3分区1副本的主题1.1.1、获取 kafka-topics.sh 的帮助信息1.1.2、副本因子设置不能超过集群中broker的数量1.1.3、创建一个3分区1副本的主题1.1.4、查看所有主题1.1.5、查看主题详细描述 1、topic主题操作的命令 kafka发送消息会存…

彩光赋能中国智造 极简光3.X助力“数智”转型

蒸汽时代、电气时代、信息时代三大工业革命后 互联网和智能制造主导的工业4.0时代来临 大数据、云计算、人工智能等新兴技术 对企业园区的网络架构、负载能力等 提出了新要求,也使得光纤较于传统铜缆 在距离、性能、延时上的优势日益凸显 基于此 围绕未来园区网建设的企…

【NumPy】深入了解NumPy的multiply函数:高效矩阵和数组乘法指南

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

positivessl泛域名证书500元13个月

随着创建网站的门槛变低&#xff0c;不论是个人用户还是企事业单位用户创建的域名网站也越来越多&#xff0c;怎么维护网络环境的安全成为了各个用户需要解决的问题。为了保护网站的数据安全&#xff0c;防止恶意攻击和数据泄露&#xff0c;大多数用户选择为域名网站安装数字证…

基于51单片机的直流电机调速设计

一.硬件方案 本系统采用STC89C51控制输出数据&#xff0c;由单片机IO口产生PWM信号&#xff0c;送到直流电机&#xff0c;直流电机通过测速电路将实时转速送回单片机&#xff0c;进行转速显示&#xff0c;从而实现对电机速度和转向的控制&#xff0c;达到直流电机调速的目的。…

excel 点击单元格的内容 跳转到其他sheet设置

如图点击1处跳转到2 按照如下图步骤操作即可

【机器学习聚类算法实战-5】机器学习聚类算法之DBSCAN聚类、K均值聚类算法、分层聚类和不同度量的聚集聚类实例分析

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…