标签:get int void list 调度 算法 进程 public
设计目的:
进程管理是操作系统中的重要功能,用来创建进程、撤消进程、实现进程状态转换,它提供了在可运行的进程之间复用CPU的方法。在进程管理中,进程调度是核心,因为在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态,当就绪进程个数大于处理器数目时,就必须依照某种策略决定哪些进程优先占用处理器。本设计模拟在单处理器情况下的进程调度,加深对进程运行状态和进程调度过程、调度算法的理解。
设计内容:
设计程序模拟单处理机系统中的进程调度算法,实现动态优先权进程调度算法, 对N个进程采用动态优先权算法的进程调度。
设计思路:
1.每个用来标识进程的进程控制块PCB,包括以下信息:进程标识数ID,进程优先数PRIORITY,进程已占用的CPU时间CPUTIME,进程还需占用的CPU时间NEEDTIME,进程状态STATE等。
2.优先数改变的原则:进程在就绪队列中呆一个时间片,优先数增加1,进程每运行一个时间片优先数减3。(注:优先数改变策略也可以自己设计)
3.设置调度前的初始状态。
4.将每个时间片内的进程情况显示出来。
动态优先权进程调度算法流程图如图1所示:
实现提示:
1.就绪队列应包含如下操作:
入队操作:将新的进程按照优先级大小插入就绪队列,保证队列按优先级大小呈递减状态。
出队操作:将就绪队列中优先级最大的进程弹出队列,由于就绪队列中是按优先级大小排列的,所以也是弹出第一个就绪进程。
队列更新操作:每个时间片后,更新就绪队列中进程的优先级。每过一个时间片段后,就绪队列中每个进程的优先级+1。
2. 每个时间片后,按照一定格式输出各进程的状态。
public class Main {
/**
* @param args
* @throws InterruptedException
* @throws FileNotFoundException
*/
public static void main(String[] args) throws InterruptedException, FileNotFoundException {
// TODO Auto-generated method stub
Queue queue = new Queue();
queue.in();
while(!queue.list.isEmpty()){
queue.out();
queue.print();
}
}
}
public class PCB {
int id;//进程标识数
int priority;//进程优先数
int cpuTime;//进程已占用的CPU时间
int needTime;//进程还需占用的CPU时间
String state;//进程状态
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getPriority() {
return priority;
}
public void setPriority(int priority) {
this.priority = priority;
}
public int getCpuTime() {
return cpuTime;
}
public void setCpuTime(int cpuTime) {
this.cpuTime = cpuTime;
}
public int getNeedTime() {
return needTime;
}
public void setNeedTime(int needTime) {
this.needTime = needTime;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
//import java.lang.management.ManagementFactory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
public class Queue {
ArrayList<PCB> list = new ArrayList<PCB>();
int index = 0; //下标
int i=0;
//随机生成任意个个进程
public void in(){
Scanner in = new Scanner(System.in);
for(int i=0;i<(int)(Math.random()*10+1);i++){
PCB process = new PCB();
process.setId(list.hashCode());//Integer.valueOf(ManagementFactory.getRuntimeMXBean().getName().split("@")[0]).intValue()
process.setPriority((int)(Math.random()*10));
process.setCpuTime(0);
process.setNeedTime((int)(Math.random()*10+1));
process.setState("ready");
list.add(process);
}
}
//按照进程的优先级对进程进行排序
public void out(){
Collections.sort(list, new Comparator<PCB>() {
public int compare(PCB o1, PCB o2) {
return o2.getPriority() - o1.getPriority();
}
});
}
public void print() throws InterruptedException{
i++;
System.out.println("当前运行的是第"+i+"个进程:");
System.out.println("进程ID:"+list.get(0).getId()+" "+"进程优先数:"+list.get(0).getPriority()+" "+"进程已占用的CPU时间:"
+list.get(0).getCpuTime()+" "+"进程还需占用的CPU时间:"+list.get(0).getNeedTime()+" "+"进程状态:"+list.get(0).getState());
while(list.get(0).needTime!=0)
{
Thread.sleep(1000);
list.get(0).state="running";
list.get(0).priority-=2;
list.get(0).cpuTime++;
list.get(0).needTime--;
for(int i=0;i<list.size();i++){
if(list.get(i).state=="ready"){
list.get(i).priority++;
}
}
if(list.get(0).needTime==0)
list.get(0).state="end";
System.out.println("进程ID:"+list.get(0).getId()+" "+"进程优先数:"+list.get(0).getPriority()+" "+"进程已占用的CPU时间:"
+list.get(0).getCpuTime()+" "+"进程还需占用的CPU时间:"+list.get(0).getNeedTime()+" "+"进程状态:"+list.get(0).getState());
}
list.remove(0);
System.out.println("----------------------------------------------------------------------------------------------");
}
}
标签:get,int,void,list,调度,算法,进程,public 来源: https://blog.csdn.net/weixin_44468506/article/details/93348871
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。