Java实现操作系统的进程调度-- 抢占式优先权调度算法

大半年的失踪人口回归,陆续会把草稿箱里的10+篇博客都补充完整,立flag!!!

优先权调度算法

按照根据每个作业的优先数,依次执行每一个作业

 非抢占式优先权调度算法:只确定一次作业的优先级,按照优先数由高到低依次执行每个作业,当前作业完成才能进行下一个作业

 抢占式优先权调度算法:不同于非抢占式优先权调度算法,抢占式优先权调度算法会多次进行优先级排序。我们规定一个时间片,用来把一个作业分成多个部分。一个时间片内执行一个作业的一部分,每经过一个时间片,就进行一次优先级排序,每次都只执行优先级最高的作业,当然作业每执行一次,其优先级会降低。

 

有一群狮子抢食,同一时间只能一只狮子享用,根据物竞天择法则,应当是最强的那头先享用。

非抢占式是最强的吃完-->第二强的吃完-->........-->最弱吃完。像是一个有序的狮群,每头都服从领袖。

而抢占式的竞争更激烈,即使是决斗中的胜者,也只能安稳的吃一口,在这一口之后就会有其他狮子来决斗,再由新获胜的狮子来进食,即一直是每轮比试中的第一名享用。像是一个无领袖的狮群,每个都想当领袖。

下面上代码:

pcb类:

package Processscheduling2;

public class Pcb {
public int id;
public String state="stop";//状态  F完成 W等待  R运行
public int youxianshu;//优先数
public int needtime;//作业长短
public  Pcb(int id,int youxinashu,int needtime){
	this.id=id;
	this.youxianshu=youxinashu;
	this.needtime=needtime;
	}

public  Pcb(int id,int needtime){
	this.id=id;
//	this.youxianshuu=youxinashu;
	this.needtime=needtime;
	}


}

进程调度类:

偷个懒,用线程控制一个时间片的时间,也可以用系统时间差来规定时间片。

每执行一次,该作业所需时间-1,优先数-3

package Processscheduling2;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Scanner;

public class ProcessScheduling extends Thread {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ProcessScheduling p = new ProcessScheduling();
		p.select();
	}

	private int num;
	private ArrayList<Pcb> mes = new ArrayList<Pcb>();
	private ArrayList<Pcb> use = new ArrayList<Pcb>();
	private ArrayList<Pcb> finish = new ArrayList<Pcb>();
	private ArrayList<Pcb> run = new ArrayList<Pcb>();
	private boolean flag = true;
	private int count;
	private String option=null;
	private void select() {
		// TODO Auto-generated method stub
		System.out.println("******************************************");
		System.out.println("*************   优先级调度   ************");
			// 优先数
			System.out.println("请输入进程个数");
			Scanner scan = new Scanner(System.in);
			num = scan.nextInt();
			for (int i = 1; i <= num; ++i) {
				System.out.println("请输入第" + i + "个进程名");
				Scanner sanid = new Scanner(System.in);
				int id = sanid.nextInt();
				System.out.println("请输入第" + i + "个进程优先数");
				Scanner sancount = new Scanner(System.in);
				int sanc = sanid.nextInt();
				System.out.println("请输入第" + i + "个进程所需服务时间");
				Scanner sanneed = new Scanner(System.in);
				int saneed = sanid.nextInt();
				mes.add(new Pcb(id, sanc, saneed));
				use.add(new Pcb(id, sanc, saneed));
				System.out.println("");
			}
			option="youxianshu";
			this.run();
		
	}
	private void judgeSort() {
		// 进行优先数排序PrioCreateProccess()
		for (int i = 0; i < use.size(); ++i) {
			for (int j = 0; j < use.size(); ++j) {
				if (use.get(i).youxianshu > use.get(j).youxianshu) {
					int t = use.get(i).youxianshu;
					int tt = use.get(i).id;
					int ttt = use.get(i).needtime;
					use.get(i).youxianshu = use.get(j).youxianshu;
					use.get(i).id = use.get(j).id;
					use.get(i).needtime = use.get(j).needtime;
					use.get(j).youxianshu = t;
					use.get(j).id = tt;
					use.get(j).needtime = ttt;
				}
			}
		}
	}

	@Override
	public void run() {
	if(option=="youxianshu"){
		count = 0;
		judgeSort();
		count++;
		while (flag) {
			if (run == null) {
				run.add(use.get(0));
				System.out.println("还没有进程被调度");
			}
			use.get(0).youxianshu -= 3;
			use.get(0).needtime -= 1;
			use.get(0).state = "run";
			for (int h = 1; h < use.size(); h++) {
				use.get(h).state = "wait";
			}
			for (int i = 0; i < use.size(); ++i) {
				if (use.get(i).needtime == 0) {
					use.get(i).state = "finish";
				}
			}
			System.out.println("经过了" + (count) + "个时间片后," + use.get(0).id + "被调用." + "还需" + use.get(0).needtime + "时间");
			System.out.println("经过时间片数" + "      " + "进程ID" + "     " + "该进程优先数" + "    " + "所需时间片数" + "     调度状态");
//打印未完成进程		
			for (int j = 0; j < use.size(); j++)
				System.out.println(count + "                  " + use.get(j).id + "        " + use.get(j).youxianshu
						+ "              " + use.get(j).needtime + "             " + use.get(j).state);
//打印完成进程		
			for (int j = 0; j < finish.size(); j++)
				System.out
						.println(count + "                  " + finish.get(j).id + "        " + finish.get(j).youxianshu
								+ "              " + finish.get(j).needtime + "               " + finish.get(j).state);
			judgeSort();
			count++;

			// 如果进程结束,就加入finish,从run中走
			for (int i = 0; i < use.size(); ++i) {
				if (use.get(i).needtime == 0) {
					use.get(i).state = "finish";
					finish.add(use.get(i));
					use.remove(i);
				}
			}
			if (finish.size() == num) {
				flag = false;
				System.out.println("进程全部执行");
			}
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}}
}

效果图:

 

  • 9
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
1. 实验目的 调度的实质是操作系统按照某种预定的策略来分配资源。进程调度的目的是分配CPU资源。由于进程调度程序执行的频率很高,因此调度算法的好坏直接影响到操作系统的性能。本实验的目的是编程模拟实现几种常用的进程调度算法,通过对几组进程分别使用不同的调度算法,计算进程的平均周转时间和平均带权周转时间,比较各种算法的性能优劣。 2. 实验原理 [1]. 进程调度算法描述 进程调度算法包括先来先服务调度算法、最短作业时间优先抢占和非抢占)、最高响应比调度算法4种。(每个人必须做FCFS,然后在后面的三种中任选一种,即每个人必须做2种调度算法的模拟。) [2]. 衡量算法性能的参 计算进程的平均周转时间和平均带权周转时间。 3. 实验内容 (1)编程实现本实验的程序,要求: [1]. 建立进程的进程控制块,进程控制块至少包括: a) 进程名称; b) 进程需要执行时间; c) 进入就绪队列时间; d) 进程执行开始时间 e) 进程执行结束时间 [2]. 编程实现调度算法。 [3]. 进程及相关信息的输入。这些信息可以直接从键盘上输入,也可以从文件读取。 [4]. 时间片与时间流逝的模拟。本实验需要对算法的执行计时,程序应该提供计算时间的方法。一种最简单的方法是使用键盘,比如每敲一次空格代表一个时间片的流逝。另一种方法是使用系统时钟。 [5]. 一组进程序列执行完毕,打印出结果信息。程序需要计算出每个进程的开始执行时间、结束时间、周转时间和带权周转时间,并为整个进程序列计算平均周转时间和平均带权周转时间。程序将计算结果按一定的格显示在计算机屏幕上或输出到文件中。打印出进程调度顺序图。 [6]. 实现据在磁盘文件上的存取功能。 (2)对下列就绪进程序列分别使用上面的几种算法进行调度,计算每种算法下的平均周转时间和平均带权周转时间。 进程号 到达时间 要求执行时间 0 0 1 1 1 35 2 2 10 3 3 5 4 6 9 5 7 21 6 9 35 7 11 23 8 12 42 9 13 1 10 14 7 11 20 5 12 23 3 13 24 22 14 25 31
抢占静态优先权调度算法是一种进程调度算法,它根据进程的静态优先级来决定进程的调度顺序。在Java中,可以使用以下步骤来实现抢占优先权调度算法: 1. 定义一个进程控制块(PCB)类,包含作业名、到达时间、服务时间、优先级、开始执行时间、完成时间、周转时间、带权周转时间等属性。 2. 创建一个进程队列,将所有进程按照到达时间从小到大排序。 3. 定义一个优先级比较器,用于将进程按照优先级从高到低排序。 4. 循环遍历进程队列,每次选择优先级最高的进程进行执行,直到所有进程都执行完毕。 下面是Java代码的一个简单实现: ```java import java.util.*; class PCB { String threadName; // 作业名 int timeArrival; // 到达时间 int timeSever; // 服务时间 int priority; // 优先级 int timeStart; // 开始执行时间 int timeComplete; // 完成时间 int timeTurnaround; // 周转时间 double timeWeightedTurnaround; // 带权周转时间 public PCB(String threadName, int timeArrival, int timeSever, int priority) { this.threadName = threadName; this.timeArrival = timeArrival; this.timeSever = timeSever; this.priority = priority; } } class PriorityComparator implements Comparator<PCB> { public int compare(PCB p1, PCB p2) { return p2.priority - p1.priority; } } public class NonPreemptivePriorityScheduling { public static void main(String[] args) { List<PCB> processList = new ArrayList<PCB>(); processList.add(new PCB("P1", 0, 5, 3)); processList.add(new PCB("P2", 1, 3, 1)); processList.add(new PCB("P3", 2, 8, 2)); processList.add(new PCB("P4", 3, 6, 4)); Collections.sort(processList, new Comparator<PCB>() { public int compare(PCB p1, PCB p2) { return p1.timeArrival - p2.timeArrival; } }); int currentTime = 0; for (PCB process : processList) { process.timeStart = currentTime; process.timeComplete = currentTime + process.timeSever; process.timeTurnaround = process.timeComplete - process.timeArrival; process.timeWeightedTurnaround = (double) process.timeTurnaround / process.timeSever; currentTime = process.timeComplete; } Collections.sort(processList, new PriorityComparator()); System.out.println("作业名\t到达时间\t服务时间\t优先级\t开始时间\t完成时间\t周转时间\t带权周转时间"); for (PCB process : processList) { System.out.println(process.threadName + "\t" + process.timeArrival + "\t\t" + process.timeSever + "\t\t" + process.priority + "\t\t" + process.timeStart + "\t\t" + process.timeComplete + "\t\t" + process.timeTurnaround + "\t\t" + process.timeWeightedTurnaround); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值