OS作业模拟SJF和FCFS
一个OS的作业, 用于模拟短作业优先 和 先来先服务两种作业调度方式.
#!/usr/bin/python3.5
## Modify the SJF and FCFS algorithm in the topic of dealing with jobs.
job_num = 5
class Job():
# 定义作业
def __init__(self, arr_time=-1, sev_time=-1, cpt_time=-1, wghted_run_time=-1):
self.arr_time = arr_time
self.sev_time = sev_time
self.cpt_time = cpt_time
self.wghted_run_time = wghted_run_time
self.run_time = self.cpt_time - self.arr_time
# 初始化工作
job0 = Job(arr_time=0, sev_time=4)
job1 = Job(arr_time=1, sev_time=1)
job2 = Job(arr_time=4, sev_time=2)
job3 = Job(arr_time=5, sev_time=1)
job4 = Job(arr_time=6, sev_time=3)
job_list = []
for i in range(job_num):
job_list.append(locals()['job' + str(i)])
def FCFS(job_list):
# 先来先服务算法, 比较简单, 不赘述.
avg_run_time = 0
avg_wght_run_time = 0
print('NO.\t\tarr_time\tsev_time\tweighted_run_time')
curr_cpt_time = 0
for i in job_list:
curr_cpt_time += i.sev_time
i.cpt_time = curr_cpt_time
i.wghted_run_time = (i.cpt_time - i.arr_time) / i.sev_time
i.run_time = i.cpt_time - i.arr_time
print("job{}\t{}\t\t\t{}\t\t\t{}".format(str(job_list.index(i)), i.arr_time, i.cpt_time, i.wghted_run_time))
avg_run_time = sum([i.run_time for i in job_list]) / len(job_list)
avg_wght_run_time = sum([i.run_time for i in job_list]) / sum([i.sev_time for i in job_list])
print('avg_run_time: ', avg_run_time)
print('avg_wght_run_time: ', avg_wght_run_time)
return 0
def SJF(job_list):
# 短作业优先算法(非抢占式).
job_list_back_up = job_list.copy()
print('NO.\t\tarr_time\tsev_time\tweighted_run_time')
curr_cpt_time = 0
curr_time = 0
# 预留初始作业表, 用于之后的确定作业序号.
arr_time_list_initial = [i.arr_time for i in job_list.copy()]
for n in range(len(job_list)):
# 遍历先存的作业构成的作业表, 选出已经或刚好在等待的作业, 选出它们之中运行时间最短的.
arr_time_list = [i.arr_time for i in job_list]
for i in range(len(arr_time_list)):
arr_time_list[i] -= curr_time
arr_time_list[i] = max(0, arr_time_list[i]) # 已经等待或刚好等待都记为刚到
min_list = [i for i in range(len(arr_time_list)) if arr_time_list[i] == min(arr_time_list)] # 选出刚到的作业的序号
t_list = [job_list[i] for i in min_list] # 将"刚到"的作业存入t_list
ely_cpt_time = [i.sev_time for i in t_list] # 计算它们的服务时间
idx = ely_cpt_time.index(min(ely_cpt_time)) # 选出"刚到"的作业中服务时间最短的
curr_job = job_list.pop(min_list[idx]) # 选出目标作业, 进行一系列的操作
curr_job_no = arr_time_list_initial.index(curr_job.arr_time)
curr_cpt_time += curr_job.sev_time
curr_job.cpt_time = curr_cpt_time
curr_job.wghted_run_time = (curr_job.cpt_time - curr_job.arr_time) / curr_job.sev_time
curr_job.run_time = curr_job.cpt_time - curr_job.arr_time
print("job{}\t{}\t\t\t{}\t\t\t{}".format(curr_job_no, curr_job.arr_time, curr_job.sev_time,
curr_job.wghted_run_time))
curr_time += curr_job.sev_time
avg_run_time = sum([i.run_time for i in job_list_back_up]) / len(job_list_back_up)
avg_wght_run_time = sum([i.run_time for i in job_list_back_up]) / sum([i.sev_time for i in job_list_back_up])
print('avg_run_time: ', avg_run_time)
print('avg_wght_run_time: ', avg_wght_run_time)
return 0
while True:
algorithm_choice = input("FCFS or SJF?\n")
if algorithm_choice == 'FCFS':
FCFS(job_list)
break
elif algorithm_choice == 'SJF':
SJF(job_list)
break
elif algorithm_choice == 'q':
break
else:
print("Invalid choice, enter 'q' to quit.\n")
本文版权归郑鹏(默盒)和博客园共有,原创文章,未经允许不得转载,否则保留追究法律责任的权利。
OS作业模拟SJF和FCFS的更多相关文章
- OS作业模拟进程分配与回收
OS的一个作业, 模拟进程的分配与管理 # initialize the memories and the process list(actually a dict) total_memory = 1 ...
- C语言模拟实现先来先服务(FCFS)和短作业优先(SJF)调度算法
说明 该并非实现真正的处理机调度,只是通过算法模拟这两种调度算法的过程. 运行过程如下: 输入进程个数 输入各个进程的到达事件 输入各个进程的要求服务事件 选择一种调度算法 程序给出调度结果:各进程的 ...
- python作业模拟计算器开发(第五周)
作业需求: 模拟计算器开发: 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/1 ...
- day4作业模拟实现一个ATM + 购物商城程序
作业需求: 模拟实现一个ATM + 购物商城程序 1.额度 15000或自定义: 2.实现购物商城,买东西加入 购物车,调用信用卡接口结账: 3.可以提现,手续费5%: 4.每月22号出账单,每月10 ...
- Python作业模拟登陆(第一周)
模拟登陆:1. 用户输入帐号密码进行登陆2. 用户信息保存在文件内3. 用户密码输入错误三次后锁定用户 思路: 1. 用户名密码文件为passwd,锁定用户文件为lock 2. 用户输入账号密码采用i ...
- Day1作业-模拟登录
# /usr/bin/env python# -*- coding: utf-8 -*-# Author:jenvid.yangimport getpassimport shutiluserspwd ...
- 调度算法FCFS、SJF和优先权调度的介绍和例题
调度算法 一.先来先服务FCFS (First Come First Serve) 1.思想: 选择最先进入后备/就绪队列的作业/进程,入主存/分配CPU 2.优缺点 优点:对所有作业/进程公平,算法 ...
- OS实验报告——作业调度模拟程序
一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行, ...
- Java实现进程调度算法(一) FCFS(先来先服务)
一.概述 因为这次os作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示. 也因为我这次要实现多个类似算法,所以将一些共性单独提取出来作为一个类. 如果只想要和算法有关的核心代 ...
随机推荐
- Linux配置LNMP环境(一)配置Nginx
注意:配置版本nginx-1.12.0,使用虚拟机安装linux.教程中的下载地址可能有变化.注意(在您看本教程之前首先需要对linux的基本操作熟悉) 1. 先cd到/usr/local/src ...
- 数据结构(C语言版)顺序栈相关算法的代码实现
这两天完成了栈的顺序存储结构的相关算法,包括初始化.压栈.出栈.取栈顶元素.判断栈是否为空.返回栈长度.栈的遍历.清栈.销毁栈.这次的实现过程有两点收获,总结如下: 一.清楚遍历栈的概念 栈的遍历指的 ...
- ArchSummit全球架构师峰会2017年深圳站 漫谈
自去年6月跳槽到某CDN厂,从偏向移动端开发又回到了专注后端,关于做一个移动应用独立开发者的计划暂时搁置,但是如马云所讲: "梦想还是要有的,万一实现了呢".去年下半年辛苦加班加点 ...
- poj 1948 Triangular Pastures 小结
Description Like everyone, cows enjoy variety. Their current fancy is new shapes for pastures. The o ...
- 将ArrayList<HashMap<String, String>>转为ArrayList<Bundle>类型的解决方案
Bundle是一种利用键值对存储的数据格式,而我们在程序中通常利用HashMap存储数据.在开发中,通过Http请求得到JSONArray类型的返回值,我选择利用ArrayList<HashMa ...
- Oracle查询多行数据合并成一行数据
例如: select base_id, translate (ltrim (text1, '/'), '*/', '*,') xmmc,translate (ltrim (text2, '/'), ' ...
- MetaWebBlogApi开发经验
背景 花了一天的时间为某笔记软件开发了一款插件,能够发布笔记到博客园,本文就是记录开发时遇到的问题和解决方案,希望有大佬能开发出更好用的博客编辑器. 为什么要开发? 现在有很多开源的建站工具hexo, ...
- CJOJ 1010【NOIP2003】加分二叉树 / Luogu 1040 加分二叉树(树型动态规划)
CJOJ 1010[NOIP2003]加分二叉树 / Luogu 1040 加分二叉树(树型动态规划) Description 设 一个 n 个节点的二叉树 tree 的中序遍历为( 1,2,3,-, ...
- UltraEdit MAC破解方法
在终端输入 printf '\x31\xC0\xFF\xC0\xC3\x90' | dd seek=$((0x92D370)) conv=notrunc bs=1 of=/Applications/U ...
- USB的包结构及包分类
USB的传输总是低位在前,高位在后. USB的传输方向:从设备到主机的数据为输入:从主机到设备的数据叫做输出. 1. 包结构 以同步域开始,紧跟着一个包标识符PID(Packet Identifier ...