操作系统实验一

article/2025/10/29 3:30:05

操作系统实验一

进程调度算法

一、实验目的

1.理解操作系统进程管理中进行进程调度的过程和调度算法的思想原理;

创建进程控制块PCB,并合理组织就绪队列。

2.理解进程的状态及变化,动态显示每个进程的当前状态及进程的调度情况。

掌握几种调度算法。

  • 理解几种进程调度的方式

  • 用代码将几种进程调度的方式表现出来

二、实验原理

(1)先到先服务调度算法:按照进程提交给系统的先后次序来进行调度。

(2)短作业优先调度算法:按照进程所要求的运行时间来衡量。

(3)时间片轮转调度算法:根据先来先服务排序,以一个时间片为单位,依次执行不同的进程。

(4)优先权调度算法:按照进程的优先权来衡量。

三、实验要求

能够考虑社会、健康、安全、法律、文化及环境等因素的影响,针对先来先服务、短进程优先、时间片轮转、高相应比优先调度算法进行建模,设计实验方案,运用恰当的集成开发工具编程模拟实现上述算法,要求:

  1. 有录入界面,动态录入进程个数、时间片大小、创建进程控制块(PCB)通过录入界面录入进程标识符、进程到达时间、服务时间等信息;
  2. 有算法选择界面,能够根据需要选择不同调度算法;
  3. 有输出界面,能够输出不同调度算法下诸进程的进程标识符、到达时间、服务时间、开始时间、完成时间、周转时间、带权周转时间以及一批作业的平均周转时间、平均带权周转时间;

四、实现过程

  1. 定义一个静态内部类,代码初始化时优先加载,放入进程标识符、进入时间以及服务时间等
  2. 将进程放入到一个数组中
  3. 对于FCFS算法思想:因为是按照进入时间的前后作为进入内存的优先级,所以先按照进入时间从小到大排序,使用直接选择排序算法,将进程按照进入时间排成从小到大的队列,设置一个标志位,temover记录上次进程的结束时间,需要考虑:如果上一个结束的时间比这个进程进入时间大,则这个进程已经进入,需要等待到temover时间才能开始,直接使用temover作为这个进程的开始时间。
  4. 对于SJF算法思想:先按照进入时间从小到大排序,然后对进来的进程再次进行排序,这次排序需要按照服务时间进行排序。
  5. 对于高响应比优先级算法:首先要知道优先级的计算公式,然后还是先按照进入时间排序,再按照优先级排序
  6. 对于RR算法:照样是先按照进入时间进行排序,然后创建一个队列queue,将进程放入队列中。

五、实现截图

在这里插入图片描述

在这里插入图片描述

六、源代码

注解挺多,可以作为参考

package com.zkb;import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;public class process {static class pro{public String name; //进程标识符public int insertTime;//进入时间public int serviceTime;//服务时间public int startTime;//开始时间public int overTime;//完成时间public int turnoverTime;//周转时间public double turnAroundTime;//带全周转时间}pro[] processes;public void init(){Scanner scanner = new Scanner(System.in);System.out.println("你要输入的进程数:");int amount = scanner.nextInt();processes = new pro[amount];for (int i=0;i<amount;i++){System.out.println("第"+(i+1)+"进程是:");System.out.println("请输入你的进程名");processes[i] = new pro();processes[i].name= scanner.next();System.out.println("你的进入时间是:");processes[i].insertTime = scanner.nextInt();System.out.println("你的估计运行时间是:");processes[i].serviceTime = scanner.nextInt();}}//先来先服务进程调度算法public void FCFS(){sort();int temover=0;//记住每次进程结束的时间,作为下次的开始时间for (int i = 0; i < processes.length; i++) {if (i==0){processes[i].startTime = processes[i].insertTime;processes[i].overTime = processes[i].startTime+processes[i].serviceTime;temover = processes[i].overTime;//记住结束的时间}else {//如果上一个结束的时间比这个进程进入时间大,则这个进程已经进入//需要等待到temover时间才能开始,直接使用temover作为这个进程的开始时间if (temover>=processes[i].insertTime){processes[i].startTime=temover;processes[i].overTime = processes[i].startTime+processes[i].serviceTime;temover = processes[i].overTime;}else{//否则这个进程还没有进入,需要等到这个进程的进入时间才能开始processes[i].startTime = processes[i].insertTime;processes[i].overTime = processes[i].startTime+processes[i].serviceTime;temover = processes[i].overTime;//记住结束的时间}}computationTime();//计算周转时间和带全周转时间}}//短进程优先算法public void SJF(){sort();int temover= processes[0].insertTime;for (int i = 0; i < processes.length; i++) {int effect = effective(temover,i);//查看进来了几个进程sort1(i,effect);//对进来的进程进行排序if(temover >= processes[i].insertTime){processes[i].startTime=temover;processes[i].overTime = processes[i].startTime+processes[i].serviceTime;temover = processes[i].overTime;}else {//否则这个进程还没有进入,需要等到这个进程的进入时间才能开始processes[i].startTime = processes[i].insertTime;processes[i].overTime = processes[i].startTime+processes[i].serviceTime;temover = processes[i].overTime;//记住结束的时间}}computationTime();}//优先级调度算法public void priority(){sort();int temover= processes[0].insertTime;for (int i = 0; i < processes.length; i++) {int effect = effective(temover,i);//查看进来了几个进程sort2(i,effect,temover);//对进来的进程进行优先级排序if(temover >= processes[i].insertTime){processes[i].startTime=temover;processes[i].overTime = processes[i].startTime+processes[i].serviceTime;temover = processes[i].overTime;}else {//否则这个进程还没有进入,需要等到这个进程的进入时间才能开始processes[i].startTime = processes[i].insertTime;processes[i].overTime = processes[i].startTime+processes[i].serviceTime;temover = processes[i].overTime;//记住结束的时间}}computationTime();}//时间片调度算法public void RR(){sort();//首先按照进入的时间进行排个小序Scanner scanner = new Scanner(System.in);System.out.println("请输入你的时间片是多少:");int RR = scanner.nextInt();int temover = processes[0].insertTime;//记录上个进程结束时间Queue<Integer> queue = new LinkedList<>();//建一个队列去更新进来的进程,模拟进程调度int[] serviceTem = new int[processes.length];//存放所有的进程估计运行的时间的,开始全部置位0int i=1; //看队列进入了几个进程queue.offer(0);//排完序,肯定先执行第一个while (!queue.isEmpty()||i<processes.length){//RR的值重新赋予int cur=RR;//如果某一个当某一个进程执行完之后,但后面的进程还没有入队,就会有队列为空的表现.// 所以他就得再次执行陷入先服务,所以我们得给队列手动进入后面的进程.if (queue.isEmpty()){for (int tep = 0; tep < processes.length; tep++) {if (serviceTem[tep]==0){queue.offer(tep);temover = processes[tep].insertTime;//更改下结束时间i=i+1;break;}}}//出队列,进行执行int tem=queue.poll();if (serviceTem[tem]==0){//当数组里估计运行时间为0的话,那就是第一次初始化,可以进行赋初值processes[tem].startTime=temover;}while(cur!=0){//模拟实现时间片轮转,执行RR次,只等相等或者用完时间片if (serviceTem[tem]!=processes[tem].serviceTime){++serviceTem[tem];temover++;}if (serviceTem[tem] == processes[tem].serviceTime){processes[tem].overTime = temover;break;}cur--;}//注意我这个进程进入顺序.//i记录进程个数,去遍历所有进程,看还有那个没进入,如果进程到了,就插入队列.if (i<processes.length){int j=i;for (; j < processes.length ;j++) {if (processes[j].insertTime<=temover){queue.offer(j);i=i+1;}}}//如果当前进程没有执行完,就再次进入队列if (serviceTem[tem] != processes[tem].serviceTime){queue.offer(tem);}}computationTime();}public void print(){System.out.println("| 作业 | 进入时间 | 估计运行时间 | 开始时间 | 结束时间 | 周转时间 | 带权周转时间 |");System.out.println("----------------------------------------------------------------------------------------------");for(int i = 0; i < processes.length; i++){System.out.print("|   " + processes[i].name + "  |");System.out.print("   " + processes[i].insertTime + "     |");System.out.print("      " + processes[i].serviceTime + "      |");System.out.print("     " + processes[i].startTime + "    |");System.out.print("    " + processes[i].overTime + "    |");System.out.print("    " + processes[i].turnoverTime + "     |");System.out.printf("%11.2f", processes[i].turnAroundTime);System.out.print("  |");System.out.println();//            System.out.printf("       " + processes[i].turnAroundTime + "    |");}double s=0,t=0,a=0,b=0;for(int i = 0; i < processes.length; i++) {s=s+processes[i].turnoverTime;a = a + processes[i].turnAroundTime;}t=s/processes.length;b=a/processes.length;System.out.println("平均周转时间:" +t);System.out.println("平均带权周转时间:"+b);System.out.println("----------------------------------------------------------------------------------------------");}public void menu() {System.out.println("欢迎来到进程调度");System.out.println("***********************");System.out.println("*****1.初始化**********");System.out.println("*****2.FCFS算法********");System.out.println("*****3.SJF算法*********");System.out.println("*****4.优先级算法******");System.out.println("*****5.RR算法**********");System.out.println("*****6.exit************");System.out.println("***********************");}public  void perform(){Scanner scanner = new Scanner(System.in);int choice = 0;while(true) {menu();System.out.println("请输入你的选择");choice = scanner.nextInt();if (choice == 1) {init();} else if (choice == 2) {System.out.println("FCFS算法结果:");FCFS();} else if (choice == 3) {System.out.println("SJF算法结果:");SJF();} else if (choice == 4){System.out.println("优先级算法结果:");priority();}else if(choice == 5){System.out.println("RR算法结果:");RR();}else if (choice == 6) {System.out.println("Good bye !!!");break;}else{System.out.println("你的输入有误,请重输");continue;}print();}}public static void main(String[] args) {process m1 = new process();m1.perform();}private void sort2(int start, int end, int temover) {//根据优先级排序for (int i = start; i < end ; i++) {for (int j = i+1; j < end ; j++) {int now = (temover-processes[i].insertTime+processes[i].serviceTime)/processes[i].serviceTime;int next = (temover-processes[j].insertTime+processes[j].serviceTime)/processes[j].serviceTime;if (next>now){pro tem= processes[i];processes[i] = processes[j];processes[j] = tem;}}}}private void sort1(int start, int end) {//根据服务时间排序for (int i = start; i < end ; i++) {for (int j = i+1; j < end ; j++) {if (processes[i].serviceTime>processes[j].serviceTime){pro tem= processes[i];processes[i] = processes[j];processes[j] = tem;}}}}private int effective(int temover, int start) {int end;//返回有效值的下标for(end = start;end<processes.length;end++){if (processes[end].insertTime>temover){break;}}return end;}private void computationTime() {for (int i = 0; i < processes.length; i++) {processes[i].turnoverTime=processes[i].overTime-processes[i].insertTime;processes[i].turnAroundTime = (double) processes[i].turnoverTime/processes[i].serviceTime;}}private void sort() {//根据进入时间直接选择排序for (int i = 0; i < processes.length; i++) {for (int j = i+1; j <processes.length ; j++) {if (processes[i].insertTime>=processes[j].insertTime){pro tem= processes[i];processes[i] = processes[j];processes[j] = tem;}}}}
}
= 0; i < processes.length; i++) {for (int j = i+1; j <processes.length ; j++) {if (processes[i].insertTime>=processes[j].insertTime){pro tem= processes[i];processes[i] = processes[j];processes[j] = tem;}}}}
}

http://chatgpt.dhexx.cn/article/IwpGL0HI.shtml

相关文章

操作系统实验一·创建进程

创建进程 1实验目的2实验内容&#xff1a;2.1Windows实现2.2Linux实现 3实验环境3.1Windows3.2Linux虚拟机 4程序设计和实现4.1Windows实现4.1.1函数解释4.1.2程序代码4.1.3运行结果 4.2Linux实现4.2.1函数解释4.2.2程序代码4.2.3运行结果 Use system calls to implement a “m…

操作系统实验

实验一 命令解释程序 实验内容 利用C语言编写一个微型命令解释程序minishell.c&#xff0c;该程序可接收并解释以下命令&#xff1a; (1) dir 列出当前目录 (2) cop file1 file2 拷贝文件 (3) era filename 删除文件 (4) disp string 显示字符串 (5) end 结束&#xff0c;退出…

操作系统实验报告

操作系统 一、实验一 通过 VMware 虚拟机软件安装 Linux二、实验目的三、实验内容&#xff08;实验原理/运用的理论知识、算法/程序流程图、步骤和方法、关键源代码&#xff09;四、实验结果与分析五、小结与心得体会 一、实验二 Windows 进程管理二、实验目的三、实验内容&…

操作系统实验——银行家算法

文章目录 一、实验目的二、实验内容和要求三、实验原理算法实现 四、实验程序代码如下&#xff1a; 五、验证数据和运行结果运行结果截图 六、思考与分析附 一、实验目的 掌握银行家算法思想&#xff0c;并能编程实现。 二、实验内容和要求 1、在Linux环境下编译运行程序&am…

操作系统实验(进程调度)

操作系统实验&#xff08;进程调度&#xff09; 一、实验目的二、实验内容三、实验准备3.1优先权算法3.2时间片轮转调度算法 四、实验 一、实验目的 1.1理解有关进程控制块、进程队列的概念。   1.2掌握进程优先权调度算法和时间片轮转调度算法的处理逻辑。 二、实验内容 2.1…

【MFC】CCriticalSection类在Release编译下调用Lock函数会报0xC0000008错误

【MFC】CCriticalSection类在Release编译下调用Lock函数会报错0xC0000008 问题描述方法一 CRITICAL_SECTION代替CCriticalSection方法二 使用WaitForSingleObject和ReleaseMutex()结语 问题描述 通过以下伪代码方式描述问题&#xff1a; 主对话框类内创建成员变量及结构体变量…

联合使用类CCriticalSection和类CSingleLock同步线程

&#xff08;1&#xff09;新建一个控制台工程SellTicketTest2&#xff0c;并在向导的“应用程序设置”中勾选“MFC”。 &#xff08;2&#xff09;打开SellTicketTest2.cpp&#xff0c;在开头中引入头文件。 #include "afxmt.h"&#xff08;3&#xff09;添加变量&…

单独使用CCriticalSection对象来同步线程

&#xff08;1&#xff09;新建一个控制台工程SellTicketTest&#xff0c;并在向导的“应用程序设置”中勾选“MFC”&#xff0c;因为CCriticalSection属于MFC类&#xff0c;如图所示。 &#xff08;2&#xff09;在SellTicketTest.cpp开头中引入头文件。 #include "afx…

linux查看java线程死锁_ccriticalsection 多线程 死锁_c++ 线程死锁_linux 线程 死锁

qq_407283393122018-12-10 一个很蠢的造成死锁的问题 wanglt3113172018-12-12 什么是死锁&#xff0c;死锁的原因&#xff0c;如何避免 apanying902019-01-09 c3p0连接死锁 Cain_1507662016-09-20 notify产生死锁的场景(备忘) liuchuanyangyan9132017-02-23 C3P0配置错误导致的…

MFC线程同步—— CCriticalSection类使用

多个线程访问临界区时&#xff0c;可以使用临界区对象。临界区对象是一个独占性共享资源&#xff0c;任一时刻只有一个线程可以拥有临界区。拥有临界区的线程可以访问被保护起来的资源或代码段&#xff0c;其他希望进入临界区的线程将被挂起等待&#xff0c;直到拥有临界区的线…

CCriticalSection与CSingleLock

CCriticalSection An object of class CCriticalSection represents a “critical section” — a synchronization object that allows one thread at a time to access a resource or section of code. Critical sections are useful when only one thread at a time can be …

关键部分CCriticalSection使用

类CCriticalSection的对象表示一个“临界区”&#xff0c;它是一个用于同步的对象&#xff0c;同一时刻仅仅同意一个线程存取资源或代码区。临界区在控制一次仅仅有一个线程改动数据或其他的控制资源时很实用。比如&#xff0c;在链表中添加一个结点就仅仅同意一次一个线程进行…

模拟售票大厅实例——多线程时访问共享变量时的安全(CMutex或CCriticalSection的应用)

当程序运行时&#xff0c;可以通过多线程来提高程序运行的效率和拥有更好的体验。但多线程&#xff08;或多进程&#xff09;同时也带来很多的问题&#xff1a;最严重的莫过于对同一个对象或变量访问时&#xff0c;由于线程运行异步的原因&#xff0c;会造成程序运行出现无法控…

在MFC下面实际演示CCriticalSection 的使用

Q&#xff1a;CCriticalSection是什么&#xff1f; A&#xff1a;CCriticalSection是一种线程同步策略 或者说技术 或者方法 总之呢就是这么个意思。。。。 参考资料&#xff1a; http://blog.csdn.net/akof1314/article/details/5773076 http://www.cnblogs.com/hlxs/archi…

Android对话框总结(普通对话框,单选对话框,多选对话框,自定义对话框)

个人推荐: &#x1f4e2;&#x1f4e2;&#x1f4e2; 前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下 "通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。点击跳转到教程。 一:AlterDialog对话框 二:普通对话框 运行效果…

Android对话框显示输入框

在弹出的对话框显示输入框有两种方法&#xff1a; 法一&#xff1a;新建一个布局&#xff0c;并在对话框中引用它。 法二&#xff1a;直接在Activity中定义Edit并在对话框中用getText方法得到输入信息。

Android对话框的使用

Android对话框的使用 对话框&#xff08;Dialog&#xff09;是Android系统在Activity或者其他组件运行过程中提供的一种提示机制。它可以帮助应用完成一些必要的提示功能&#xff0c;同时提供一些与用户交互的功能。 对话框分为很多种&#xff0c;下面将一一介绍…

android 自定义对话框

// 基础库 implementation com.github.goweii.AnyLayer:anylayer:2.5.0 // 通用弹窗&#xff08;依赖基础库&#xff09; implementation com.github.goweii.AnyLayer:anylayer-common:2.5.0 编写dialog_layout 布局 <?xml version"1.0" encoding"utf-8&qu…

Android对话框的使用总结

一&#xff0e;相关概念 一个对话框一般是一个出现在当前Activity之上的一个小窗口. 处于下面的Activity失去焦点, 对话框接受所有的用户交互. 对话框一般用于提示信息和与当前应用程序直接相关的小功能. Android API 支持下列类型的对话框对象: &#xff08;一&#x…

Android对话框控件读写,Android 对话框控件

对话框控件 一、概述 对话框是 UI 设计中常用的控件&#xff0c;在windows操作系统中&#xff0c;对话框可分为模式对话框和非模式对话框。 模式对话框在使用时&#xff0c;项目中其它UI是不允许操作的&#xff0c;如保存对文件话框 非模式对话框允许操作其它的 UI Android 的对…