操作系统- 实验一 模拟处理机调度的时间片轮转法(Java实现)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38712932/article/details/85088839

                                                      实验一  模拟处理机调度的时间片轮转法

一、实验目的:用c/c++模拟时间片轮转法

二、实验内容:输入进程的个数,每个进程的名称及每个进程需要工作的时间,本实验中假定对CPU时间片设置为一个时间单位,首先输入进程的个数,然后输入进程名称,最后输入进程所需要的处理时间。然后通过模拟程序,显示以下信息:

1)处理机对进程的调度过。

2)计算每个进程的周转时间(假设N个进程在0时刻几乎同时达到,处理机对进程的调度顺序和输入进程的顺序一致)。

三、示例:

若输入:

3

  

A               2

B               3   

C               4  

进程名称      每个进程需要工作的时间

 

显示:

CPU时刻:1

正在运行的进程:A

Name   run  req  status

A      1    2     R  R:就绪  E 结束

B      0    3     R

C      0    4     R

CPU时刻:2

正在运行的进程:B

Name   run  req  status

A      1    2     R

B      1    3     R

C      0    4     R

CPU时刻:3

正在运行的进程:C

Name   run  req  status

A      1    2     R  R:就绪  E 结束

B      1    3     R

C      1    4     R

CPU时刻:4

正在运行的进程:A

Name   run  req  status

A      2    2     E  

B      1    3     R

C      1    4     R

CPU时刻:5

正在运行的进程:B

Name   run  req  status

B      2    3     R

C      1    4     R

CPU时刻:6

正在运行的进程:C

Name   run  req  status

B      2    3     R

C      2    4     R

CPU时刻:7

正在运行的进程:B

Name   run  req  status

B      3    3     E

C      2    4     R

CPU时刻:8

正在运行的进程:C

Name   run  req  status

C      3    4     R

CPU时刻:9

正在运行的进程:C

Name   run  req  status

C      4    4     E

 

A的周转时间:4ms

B的周转时间:7ms

C的周转时间:9ms

 

 

四、实验提示

1)采用什么数据结构用来存放每个进程的信息?

  每个进程的信息包括:进程的名称和进程需要工作的时间

2)怎么样控制进程轮转的循环和结束?

解决思路:

首先对进行遍历,每次遍历CPU时间+1,然后当前遍历到的时间片运行时间+1

然后如果当前时间片的运行时间等于所需要的运行时间,那么状态就从R->E结束

随后将该时间片进行弹出集合,同时记录弹出的时间片名和当前CPU时间(即为当前时间片的周转时间)

package com.eternally.test;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class Process {
    public String name;// 进程名
    public int run;// 已经运行的时间

    public Process(String name, int run, int needtime) {
	this.name = name;
	this.run = run;
	this.needtime = needtime;
    }

    public int needtime;// 所需要的时间
}

public class Test1 {

    public static void main(String[] args) {
	List<String> listname=new ArrayList<>();//记录淘汰的进程名
	List<Integer> listtime=new ArrayList<>();//记录淘汰的进程的淘汰时间
	int cputime = 0;// CPU运行时间

	Scanner in = new Scanner(System.in);
	int n = in.nextInt();
	String name;
	int ttime;
	int needtime;
	List<Process> list = new ArrayList<>();
	for (int i = 0; i < n; i++) {
	    name = in.next();
	    needtime = in.nextInt();
	    Process pcb = new Process(name, 0, needtime);// 运行时间初始化为0
	    list.add(pcb);
	}

	for (int i = 0; i < list.size(); i++) {
	    cputime++;
	    System.out.println("CPU时刻:" + cputime);
	    System.out.println("正在运行的进程:"+list.get(i).name);
	    System.out.println("Name   run  req  status");
	    list.get(i).run++;//当前进程的运行时间+1
	    for(int j = 0;j <list.size();j ++) {
		System.out.print(list.get(j).name+"   "+list.get(j).run+"   "+list.get(j).needtime+"   ");
		System.out.println(list.get(j).run==list.get(j).needtime?"E":"R");
	    }
	    if(list.get(i).needtime==list.get(i).run) {
		listtime.add(cputime);
		listname.add(list.get(i).name);
		list.remove(i);
		i--;
	    }else {
		if (i == (list.size() - 1)) {
			i = -1;
		    }
	    }
	}
	for(int i =0;i < n;i ++) {
	    System.out.println(listname.get(i)+"的周转时间:"+listtime.get(i)+"ms");
	}
	
    }

}

猜你喜欢

转载自blog.csdn.net/qq_38712932/article/details/85088839