进程调度

Posted cky-2907183182

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程调度相关的知识,希望对你有一定的参考价值。

//进程一

public class Process1
    public  int name;                //进程ID名
    public  int priority;            //优先权数
    public  int cputime;             //进程需要的时间
    public  String state;             //进程状态
    

    //设置 process类的构造方法


    Process1(int i, int priority , int cputime , String state)
    
        this.name = i;
        this.priority = priority;
        this.cputime = cputime;
        
        this.state = state;
    
    public String toString()
        return "进程名:" + name + "  优先级为:" + priority + "  需要运行的时间:" + cputime + "  进程状态:" + state;
    


//进程二

public class Process2
    public int name;
    public int needTime;
    public int ocpTime;
    public String state;
    
    Process2(int i, int needTime , int ocpTime , String state)
    
        this.name = i;
        this.needTime = needTime;
        this.ocpTime = ocpTime;    
        this.state = state;
    
    
    public String toString()
        return "进程名:" + name + "  需要时间片:" + needTime + "  已占用时间片:" + ocpTime + "  进程状态:" + state;
    



//测试类

import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
import java.util.concurrent.ThreadLocalRandom;
import java.util.LinkedList;

public class ProcessTest
    public static LinkedList<Process1> input1()
        LinkedList<Process1> l = new LinkedList<Process1>();   
        System.out.println("要创建进程数:");
        Scanner s = new Scanner(System.in);
        int num = s.nextInt();
        for (int i = 1; i <= num; i++)
            ThreadLocalRandom ran = ThreadLocalRandom.current();
            int a = ran.nextInt(10,20);
            int b = ran.nextInt(1,20);
            Process1 p = new Process1(i,a,b,"ready");  
            l.add(p);
            
        s.close();
        return l;
        
    
    
    
    public static LinkedList<Process2> input2()
        LinkedList<Process2> l = new LinkedList<Process2>();   
        System.out.println("要创建进程数:");
        Scanner s = new Scanner(System.in);
        int num = s.nextInt();
        for (int i = 1; i <= num; i++)
            ThreadLocalRandom ran = ThreadLocalRandom.current();
            int a = ran.nextInt(10,20);
            Process2 p = new Process2(i,a,0,"ready");  //
            l.add(p);
            
        s.close();
        return l;
        
    
    
    //比较器
    class PriorityComparator implements Comparator<Process1>
        public int compare(Process1 p1, Process1 p2)
            if (p1.priority < p2.priority)
                return 1;
             else if (p1.priority > p2.priority)
                return -1;
             else
                return 0;
            
        
    
    public void run1()
        
        LinkedList<Process1> l = ProcessTest.input1();
        Collections.sort(l, new PriorityComparator());//排序
        
        for(Process1 p:l)
        System.out.println(p);
        
        
        System.out.println("===============================");
        
        
        while(!l.isEmpty())
            
            l.peek().state = "running";
            
            for(Process1 p:l)
                System.out.println(p);
                
            
            l.peek().priority -= 3;
            l.peek().cputime -= 1;
            l.peek().state = "ready";
            
            Collections.sort(l, new PriorityComparator());
                    
            
            System.out.println("===============================");
            
            for(int i = 0;i < l.size();i++)
                if(l.get(i).cputime<=0)
                    l.get(i).state = "finish";
                    
                    //System.out.println(l.get(i));
                    System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
                    
                    System.out.println("结束进程:"+l.get(i));
                    
                    System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
                    
                    l.remove(i);
                
                        
        
        
        System.out.println("End");
        
    
    
    public void run2()
        LinkedList<Process2> l = ProcessTest.input2();
        for(Process2 p:l)
            System.out.println(p);
            
        
        System.out.println("===============================");
        
        while(!l.isEmpty())
            l.peek().state = "runnig";
            
            for(Process2 p:l)
                System.out.println(p);
                    
            
            l.peek().state = "ready";
            
            l.peek().needTime--;
            l.peek().ocpTime++;
            
            //更改队列元素顺序
            Process2 temp = l.get(0);
            for(int i =0;i < l.size()-1;i++)
                l.set(i, l.get(i+1));
            
            l.set(l.size()-1,temp );
            
            
            System.out.println("===============================");
            
            
            for(int i = 0;i < l.size();i++)
                if(l.get(i).needTime<=0)
                    l.get(i).state = "finish";
                    
                    //System.out.println(l.get(i));
                    System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
                    
                    System.out.println("结束进程:"+l.get(i));
                    
                    System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
                    
                    l.remove(i);
                
                        
        
        
        System.out.println("END");
        
        
    

    
    public static void main(String[] args)
        
        ProcessTest pro = new ProcessTest();
        System.out.println("输入“y”或“n”:");
        Scanner s = new Scanner(System.in);
        String cmd = s.next();
        if(cmd.equals("y"))
            pro.run1();
        else if(cmd.equals("n"))
            pro.run2();
        else
            System.out.println("输入非法,重新运行");
        
        s.close();
    



以上是关于进程调度的主要内容,如果未能解决你的问题,请参考以下文章

五种进程调度算法的总结;

Linux 进程调度

浅析Linux下进程的调度策略与优先级

第4章 进程调度

处理机调度-进程调度

进程调度算法Linux进程调度算法