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作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示. 也因为我这次要实现多个类似算法,所以将一些共性单独提取出来作为一个类. 如果只想要和算法有关的核心代 ...
随机推荐
- [Paper Reading]--Exploiting Relevance Feedback in Knowledge Graph
<Exploiting Relevance Feedback in Knowledge Graph> Publication: KDD 2015 Authors: Yu Su, Sheng ...
- Java学习笔记之集合
集合(Collection)(掌握) (1)集合的由来? 我们学习的是Java -- 面向对象 -- 操作很多对象 -- 存储 -- 容器(数组和StringBuffer) -- 数组而数组的长度固定 ...
- VIM基础知识整理(附思维导图)
这是当时初学VIM后做的一个思维导图,图片稍大,所以从freemind导出了html文本po在下面:图片在最下方,放大可清晰浏览. VIM 普通模式 普通编辑命令 功能:浏览,普通编辑 x:删除光标所 ...
- 数据结构(C语言版)链表相关操作算法的代码实现
这次实现的是带头结点的单链表的初始化.遍历.创建.插入.删除.判断链表是否为空.求链表长度函数,编译环境是vs2013. 其中插入和删除函数中循环的条件目前还不太明白. #include<ios ...
- .NET C#到Java没那么难,DB篇
前言 .NET C#到Java没那么难,都是面向对象的语言,而且语法还是相似的,先对比一下开发环境,再到Servlet,再到MVC,都是一样一样的,只是JAVA的配制项比较多而已,只要配好一个,后面都 ...
- HashMap的存储原理
HashMap是java中相当重要的数据结构,使用HashMap的场景非常之多,因此,了解HashMap实现的过程和原理,是非常有必要的,在一些面试中也会经常被问到.好了,我们赶紧来研究java内部是 ...
- 《JavaScript高级程序设计》 -- 变量、作用域和内存问题(二)
1.基本类型与引用类型 基本类型:值保存在变量中 (Number.String.Boolean.Undefined.Null).在内存中占据固定大小空间,被保存在栈内存中 引用类型:值是保存在内存中的 ...
- python基础(3):输入输出与运算符
今天总结一下最基础的输入输出和运算符 输入: python3里都是input("") input() name = input() #输入的值会直接赋值给name name ...
- 95后实习生的远程办公体验(asp.net mvc\C#技术栈)
这个月我们做了一件别人看起来很疯狂的事情,就是让一批95后的实习生实行远程办公,效果还不错,于是写此文总结一下. 其实认真算算,我自己的远程工作经验有十年了吧,在北京工作的时候天气不好就申请在家办公, ...
- Azkaban使用简单笔记
官方文档:http://azkaban.github.io/ Azkaban主要的组成:1. 关系型数据库--MySQL2. AzkabanWebServer3. AzkabanExcutorServ ...