本科期间的一些学习回忆记录(自己用)


一、课程设计的任务和要求

本次课程设计的题目是,时间片轮转调度算法的模拟实现。要求在充分理解时间片轮转调度算法原理的基础上,编写一个可视化的算法模拟程序。
 具体任务如下:

  1. 根据需要,合理设计PCB结构,以适用于时间片轮转调度算法;
  2. 设计模拟指令格式,并以文件形式存储,程序能够读取文件并自动生成指令序列。
  3. 根据文件内容,建立模拟进程队列,并能采用时间片轮转调度算法对模拟进程进行调度。

任务要求:
4. 进程的个数,进程的内容(即进程的功能序列)来源于一个进程序列描述文件。
5. 需将调度过程输出到一个运行日志文件。
6. 开发平台及语言不限。
7. 要求设计一个Windows可视化应用程序。

二、模拟程序的描述

模拟指令的格式:操作命令+操作时间
● C : 表示在CPU上计算
● I : 表示输入
● O : 表示输出
● W : 表示等待
● H : 表示进程结束
操作时间代表该操作命令要执行多长时间(时间片个数)。这里假设I/O设备的数量没有限制,I和O设备都只有一类。
I,O,W三条指令实际上是不占有CPU的,执行这三条指令就应该将进程放入对应的等待队列(输入等待队列,输出等待队列 ,其他等待队列)。
例如,有一虚拟程序文件prc.txt描述如下,其中,指令后面的数值代表该指令需要执行的时间片个数,如C10,代表需要计算10个时间片:
P1
C10
I20
C40
I30
C20
O30
H00
P2
I10
C50
O20
H00
P3
C10…

三、进程队列及结构图


                                                               图1    PCB结构及队列模型

四、运行结果截图

                                                               图2    程序主界面


                                                               图3    打开文件

                                                               图4    运行过程

五、代码结构


                                                               图5 代码结构

六、主要代码部分

1.TurnQueue

package Queue;import java.util.*;import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.JTextField;import IOFile.WriteLogFile;
import ResourceUnit.Instruction;
import ResourceUnit.PCB;public class TurnQueue {private ReadyQueue rq;private IWaitQueue iq = new IWaitQueue(this);//把当前对象作为该队列的调度管理对象private OWaitQueue oq = new OWaitQueue(this);private WaitQueue wq = new WaitQueue(this);private long interval;//日志文件需要,记录时间间隔private JTextField currP;//图形界面的显示private JTextArea jrq,jiq,joq,jwq;private JButton jsb;//程序运行结束,将暂停调度键设置为不可操作private void isEndTurn(){if(rq.readyQueue.size() == 0 && iq.iWaitQueue.size() == 0 && oq.oWaitQueue.size() == 0&& wq.waitQueue.size() == 0){rq.readyQueueTimer.cancel();iq.iWaitQueueTimer.cancel();oq.oWaitQueueTimer.cancel();wq.waitQueueTimer.cancel();jsb.setEnabled(false);}}private StringBuilder outChanged(LinkedList<PCB> list){StringBuilder sb = new StringBuilder();Iterator<PCB> iter = list.iterator();while(iter.hasNext()){PCB p = iter.next();Instruction i = p.getList().getFirst();sb.append(p.name+":"+i.getiName()+i.getRunTime()+"\t");}sb.append('\n');return sb;}private void outReadyQueue(){StringBuilder sb = new StringBuilder();if(rq.readyQueue.size() > 0){         Iterator<PCB> iter = rq.readyQueue.iterator();currP.setText(iter.next().name);while(iter.hasNext()){sb.append(iter.next().name  + "\n");}}else{currP.setText("当前CPU没有指令运行");jrq.setText("");}jrq.setText(sb.toString());}private void outWaitQueue(JTextArea jta,LinkedList<PCB> list){StringBuilder sb = new StringBuilder();Iterator<PCB> iter = list.iterator();while(iter.hasNext()){sb.append(iter.next().name + "\n");}jta.setText(sb.toString());}public TurnQueue(LinkedList<PCB> list,int turnTime,JButton jsb,JTextField currP,JTextArea jrq, JTextArea jiq, JTextArea joq, JTextArea jwq){rq = new ReadyQueue(list, turnTime, this);this.jsb = jsb;this.currP = currP;this.jrq = jrq;this.jiq = jiq;this.joq = joq;this.jwq = jwq;/*启动调度* 遍历后备就绪队列,将每个PCB的第一条指令为非C指令的PCB挂到对应等待队列上* 并为对应等待队列设置定时器* */for(int i = 0; i < rq.readyQueue.size(); i++){char iName = QueueUtil.getFirst(rq.readyQueue, i).getiName();if(iName == 'C'){continue;}if(iName == 'I'){iq.iWaitQueue.add(list.remove(i));}else if(iName == 'O'){oq.oWaitQueue.add(list.remove(i));}else if(iName == 'W'){wq.waitQueue.add(list.remove(i));}else{//要么为H指令,要么指令出错,两种情况都有问题,都要删掉该PCBrq.readyQueue.remove(i);}}if(iq.iWaitQueue.size() != 0){iq.setTimer();}if(oq.oWaitQueue.size() != 0){oq.setTime();}if(wq.waitQueue.size() != 0){wq.setTime();}if (rq.readyQueue.size() != 0){            rq.setTimer();}//输出所有队列interval = System.currentTimeMillis();WriteLogFile.writeLogFile("当前时间点:原点0\n");WriteLogFile.writeLogFile("\t就绪队列:" + outChanged(rq.readyQueue));WriteLogFile.writeLogFile("\t输入等待队列:" + outChanged(iq.iWaitQueue));WriteLogFile.writeLogFile("\t输出等待队列:" + outChanged(oq.oWaitQueue));WriteLogFile.writeLogFile("\t其他等待队列:" + outChanged(wq.waitQueue));outReadyQueue();outWaitQueue(jiq, iq.iWaitQueue);outWaitQueue(joq, oq.oWaitQueue);outWaitQueue(jwq, wq.waitQueue);}public void rAtomOperation(){WriteLogFile.writeLogFile("当前时间点:" + (System.currentTimeMillis() - interval)/1000 + "\n");rq.reduceFirstITime();if(0 == QueueUtil.getFirst(rq.readyQueue, 0).getRunTime()){//当前指令执行结束rq.readyQueue.getFirst().getList().removeFirst();//删除这条指令//根据后面的指令判断接下来的操作char iName = QueueUtil.getFirst(rq.readyQueue, 0).getiName();switch (iName) {case 'I':/*若后一条指令为I指令,则将输入等待队列定时器任务取消,然后将等待队列上的I指令的运行时间减去*已运行的时间,挂上新指令,并重新定时。*执行到上一句时,iTask任务已做和未做都没问题。*由于I队列是进程同步的,如果此时iTask在另一个线程正在执行*此时下面的代码将会等待iTask处理结束后,本进程才能获得I队列*/iq.inQueue(rq.readyQueue, 0);WriteLogFile.writeLogFile("\t输入等待队列:" + outChanged(iq.iWaitQueue));outWaitQueue(jiq, iq.iWaitQueue);break;case 'O':oq.inQueue(rq.readyQueue, 0);WriteLogFile.writeLogFile("\t输出等待队列:" + outChanged(oq.oWaitQueue));outWaitQueue(joq, oq.oWaitQueue);break;case 'W':wq.inQueue(rq.readyQueue, 0);WriteLogFile.writeLogFile("\t其他等待队列:" + outChanged(wq.waitQueue));outWaitQueue(jwq, wq.waitQueue);break;case 'H':rq.readyQueue.remove(0);break;}}else{//当前指令未执行结束rq.readyQueue.add(rq.readyQueue.remove(0));//直接将队首PCB挂在队尾}//重新为就绪队列制定定时任务if(rq.readyQueue.size() != 0){                    rq.setTimer();}else{//判断是否所有队列为空,是则结束所有TimerisEndTurn();}WriteLogFile.writeLogFile("\t就绪队列:" + outChanged(rq.readyQueue));outReadyQueue();}public void iAtomOperation(){/*遍历当前队列,把每个PCB的队首指令运行时间减去已运行时间,若指令运行时间变为零,删除该指令*并根据下一条指令把该PCB挂到对应队列(若下条指令为H,则删除此PCB)*若新队列为就绪队列,则简单的将其挂到队尾即可*若新队列非就绪队列且非空,则将新队列上所有PCB的队首指令减去已运行的时间,然后重新该队列定时*/WriteLogFile.writeLogFile("当前时间点:" + (System.currentTimeMillis() - interval)/1000 + "\n");for(int i = 0; i < iq.iWaitQueue.size(); i++){iq.reduceiITime(i);if(0 == QueueUtil.getFirst(iq.iWaitQueue, i).getRunTime()){//运行时间为0,该指令运行结束,删除该指令iq.iWaitQueue.get(i).getList().removeFirst();char iName = QueueUtil.getFirst(iq.iWaitQueue, i).getiName();switch (iName) {case 'C':rq.readyQueue.add(iq.iWaitQueue.remove(i));if(rq.readyQueue.size() == 1){//表明再添加之前就绪队列已经为空,此时已经没有定时任务了rq.setTimer();}WriteLogFile.writeLogFile("\t就绪队列:" + outChanged(rq.readyQueue));outReadyQueue();break;case 'O'://下一步要向输出等待进程添加进程,要重新制定定时任务oq.inQueue(iq.iWaitQueue, i);WriteLogFile.writeLogFile("\t输出等待队列:" + outChanged(oq.oWaitQueue));outWaitQueue(joq, oq.oWaitQueue);break;case 'W':wq.inQueue(iq.iWaitQueue, i);WriteLogFile.writeLogFile("\t其他等待队列:" + outChanged(wq.waitQueue));outWaitQueue(jwq, wq.waitQueue);break;case 'H':iq.iWaitQueue.remove(i);break;}}}//最后重新setIWaitQueueTimerif(iq.iWaitQueue.size() != 0){         iq.setTimer();}else{isEndTurn();}WriteLogFile.writeLogFile("\t输入等待队列:" + outChanged(iq.iWaitQueue));outWaitQueue(jiq, iq.iWaitQueue);}public void oAtomOperation(){//同iAtomOperation情况WriteLogFile.writeLogFile("当前时间点:" + (System.currentTimeMillis() - interval)/1000 + "\n");for(int i = 0; i < oq.oWaitQueue.size(); i++){oq.reduceiITime(i);if(0 == QueueUtil.getFirst(oq.oWaitQueue, i).getRunTime()){//运行时间为0,该指令运行结束,删除该指令oq.oWaitQueue.get(i).getList().removeFirst();char iName = QueueUtil.getFirst(oq.oWaitQueue, i).getiName();switch (iName) {case 'C':rq.readyQueue.add(oq.oWaitQueue.remove(i));if(rq.readyQueue.size() == 1){//表明再添加之前就绪队列已经为空,此时已经没有定时任务了rq.setTimer();}WriteLogFile.writeLogFile("\t就绪队列:" + outChanged(rq.readyQueue));outReadyQueue();break;case 'I':iq.inQueue(oq.oWaitQueue, i);WriteLogFile.writeLogFile("\t输入等待队列:" + outChanged(iq.iWaitQueue));outWaitQueue(jiq, iq.iWaitQueue);break;case 'W':wq.inQueue(oq.oWaitQueue, i);WriteLogFile.writeLogFile("\t其他等待队列:" + outChanged(wq.waitQueue));outWaitQueue(jwq, wq.waitQueue);break;case 'H':oq.oWaitQueue.remove(i);break;}}}//最后重新setOWaitQueueTimerif(oq.oWaitQueue.size() != 0){           oq.setTime();}else{isEndTurn();}WriteLogFile.writeLogFile("\t输出等待队列:" + outChanged(oq.oWaitQueue));outWaitQueue(joq, oq.oWaitQueue);}public void wAtomOperation(){//同iAtomOperation情况WriteLogFile.writeLogFile("当前时间点:" + (System.currentTimeMillis() - interval)/1000 + "\n");for(int i = 0; i < wq.waitQueue.size(); i++){wq.reduceiITime(i);if(0 == QueueUtil.getFirst(wq.waitQueue, i).getRunTime()){//运行时间为0,该指令运行结束,删除该指令wq.waitQueue.get(i).getList().removeFirst();char iName = QueueUtil.getFirst(wq.waitQueue, i).getiName();switch (iName) {case 'C':rq.readyQueue.add(wq.waitQueue.remove(i));if(rq.readyQueue.size() == 1){//表明再添加之前就绪队列已经为空,此时已经没有定时任务了rq.setTimer();}WriteLogFile.writeLogFile("\t就绪队列:" + outChanged(rq.readyQueue));outReadyQueue();break;case 'I':iq.inQueue(wq.waitQueue, i);WriteLogFile.writeLogFile("\t输入等待队列:" + outChanged(iq.iWaitQueue));outWaitQueue(jiq, iq.iWaitQueue);break;case 'O':oq.inQueue(wq.waitQueue, i);WriteLogFile.writeLogFile("\t输出等待队列:" + outChanged(oq.oWaitQueue));outWaitQueue(joq, oq.oWaitQueue);break;case 'H':wq.waitQueue.remove(i);break;}}}//最后重新setWaitQueueTimerif(wq.waitQueue.size() != 0){            wq.setTime();}else{isEndTurn();}WriteLogFile.writeLogFile("\t其他等待队列:" + outChanged(wq.waitQueue));outWaitQueue(jwq, wq.waitQueue);}//暂停调度的方法public void pauseTurn(){rq.pause();iq.pause();oq.pause();wq.pause();WriteLogFile.writeLogFile("当前时间点:" + (System.currentTimeMillis() - interval)/1000 + "\n");WriteLogFile.writeLogFile("此时调度暂停.......\n\n");}//重新开始调度的方法public void reStartTurn(){rq.reStart();iq.reStart();oq.reStart();wq.reStart();WriteLogFile.writeLogFile("当前时间点:" + (System.currentTimeMillis() - interval)/1000 + "\n");WriteLogFile.writeLogFile("此时调度重新开始。\n\n");}
}

2. PCB

package ResourceUnit;import java.util.LinkedList;public class PCB {public String name;private LinkedList<Instruction> list = new LinkedList<Instruction>();public PCB(){}public PCB(String name){this.name = name;}public LinkedList<Instruction> getList(){return list;}public void addInstruction(Instruction i){list.add(i);}public void deleteInstruction(){list.removeFirst();}}

七、完整资源

下载链接:
操作系统课程设计—时间片轮转调度算法的进程调度程序实现
包含

  1. 完整的项目代码,运行时出现错误:
    java: 错误: 无效的源发行版:13
    自行检查JDK版本
  2. 课程设计任务书
  3. 课程设计报告

操作系统课程设计——进程调度模拟程序(JAVA语言实现)相关推荐

  1. java编写文件系统的方法_操作系统课程设计模拟文件系统Java

    [实例简介] 一个操作系统课程设计,使用java语言模拟磁盘文件系统实现,实现了FAT算法 [实例截图] [核心代码] e692cc3b-c785-40f6-babe-2f9d5383f034 └── ...

  2. 《操作系统》课程设计报告——用JAVA语言模仿实现“吃水果”问题

    引言 操作系统是计算机的核心总控软件,是计算机系统的指挥和管理中心,是计算机系统的灵魂.进程管理与文件系统是操作系统都是操作系统的五大重要功能之一.通过模拟操作系统的实现,加深学生对计算机操作系统内核 ...

  3. java 2048游戏_JAVA2048游戏 本课程设计是基于java语言的2048小游戏设计 联合开发网 - pudn.com...

    JAVA2048游戏 所属分类:游戏 开发工具:Java 文件大小:789KB 下载次数:4 上传日期:2020-11-23 10:57:11 上 传 者:滴滴滴大萌 说明:  本课程设计是基于jav ...

  4. 操作系统课程设计进程调度模拟

    程序下载链接:https://download.csdn.net/download/m0_56241309/86945709 进程调度模拟 摘要:进程调度是操作系统中必不可少的一种调度,在3中OS中都 ...

  5. java 课程设计文本编辑器,JAVA课程设计--文本编辑器

    JAVA课程设计--文本编辑器 Java 语言课程期末作业 1 Java 语言课程期末作业 题 目 第 8 题,文本编辑器 学 院 计算机学院 专 业 计算机科学与技术 班 别 学 号 姓 名 201 ...

  6. java时间片轮转调度(操作系统课程设计)

    操作系统课程设计之时间片轮转调度算法模拟(Java版本可视化) 1. 课程设计要求 本次课程设计的题目是,时间片轮转调度算法的模拟实现.要求在充分理解时间片轮转调度算法原理的基础上,编写一个可视化的算 ...

  7. 操作系统分区分配java算法_合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc...

    合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc 1课程设计动态分区分配存储管理设计题目学号专业班级学生姓名号指导教师22010年12月合肥工业大学课程设计任务书设计题目动态分区分 ...

  8. 操作系统作业调度算法c语言,操作系统课程设计报告电梯调度算法c语言实现.doc...

    操作系统课程设计报告电梯调度算法c语言实现 操作系统课程设计报告电梯调度算法c语言实现 :调度 算法 电梯 课程设计 操作系统 操作系统课程设计报告 模拟操作系统课程设计 写一个简单的操作系统 篇一: ...

  9. linux课程设计死锁避免,linux操作系统课程设计—车辆死锁.doc

    linux操作系统课程设计-车辆死锁.doc 键入文字"操作系统原理"课程设计BX090709吴沛儒操作系统原理课程设计报告姓名吴沛儒班级BX0907学号9指导老师胡静二〇一一年十 ...

最新文章

  1. LeetCode Monotonic Array(数组单调性)
  2. Apache Spark学习:将Spark部署到Hadoop 2.2.0上
  3. php 数组转对象_[基础编程学习] [PHP7数组详解]:第1章 (8)数组和对象
  4. Consul和服务网格的智能网络
  5. python+mysql:实现一千万条数据插入数据库
  6. 数据分析——朴素贝叶斯原理示意图
  7. 放弃 Windows 后 ,开源操作系统能成为主流桌面系统吗?
  8. 简单的ftp服务器(客户端、服务器端、socket)
  9. 安装jenkins时出现 No such plugin: cloudbees-folder的解决办法
  10. 【DP】【四边形不等式】邮局(P4767)
  11. 编译内核_Linux内核编译(自己实现的网卡上面测试c1000k案例)
  12. 时间序列分析实验报告总结_时间序列分析实验报告
  13. GO string 转map_go 学习笔记之数组还是切片都没什么不一样
  14. 力扣周赛 第281场 Java题解
  15. 3d建模师就业前景?
  16. ffmpeg使用,读取码率和写入码率的注意事项
  17. vue cli3 配置sass全局变量设置不生效,sass混合器文件全局引入
  18. 分布式数据库TiDB介绍
  19. 美国大学生足球联赛数据集football——node2vec
  20. !《掘地求生》制作心得及源码分享 unity制作

热门文章

  1. 电脑中rar压缩文件的密码忘记了怎么办?
  2. 微软mcp证书有用吗_最全微软MCP认证攻略
  3. python概率编程_Python中的概率编程
  4. WIFI大师分销系统小程序源码+流量主+详细搭建视频教程
  5. jq 中英文切换_怎样用jquery/js 实现中英文切换的功能?
  6. tpg色卡查询_PANTONE潘通TPG色卡是家居+纺织色彩指南 (原TPX新版)_FHIP100 _ 深圳千通彩色彩管理有限公司...
  7. c语言中式等号右边赋予左边吗,二项式定理公式、各种例题讲解及练习
  8. 最新kali之pixiewps
  9. 计算机软件系统由程序和相应的文档组成,全国计算机等级考试一级B考试选择题(计算机软件系统及解析)...
  10. 自己做的WinForm版本的DVD中文游戏300,用电脑回忆儿时记忆