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

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

一、实验目的:用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");
	}
	
    }

}

 

[提示] (1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。进程控制块的格式为: 进程名 指针 要求运行时间 已运行时间 状态进程名----作为进程的标识,假设五个进程进程名分别是Q1,Q2,Q3,Q4,Q5。 指针----进程按顺序排成循环队列,用指针指出下一个进程进程控制块首地址,最后一个进程的指针指出第一个进程进程控制块首地址。 要求运行时间----假设进程需要运行的单位时间数。 已运行时间----假设进程已经运行的单位时间数,初始值为“0”。 状态----有两种状态,“就绪”状态和“结束”状态,初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态变为“结束”,用“E”表示。 (2)每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“要求运行时间”。 把五个进程按顺序排成循环队列,用指针指出队列连接情况。另用一标志单元记录轮到运行的进程。 (3)处理器调度总是选择标志单元指示的进程运行。由于本实验模拟处理器调度的功能,所以,对被选进程并不实际启动运行,而是执行: 已运行时间-1 来模拟进程的一次运行,表示进程已经运行过一个单位的时间。 请注意:在实际的系统,当一个进程被选运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片。在这里省去了这些工作,仅用“已运行时间+1”来表示进程已经运行满一个时间片。 (4)进程运行一次后,应把该进程进程控制块的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间与已运行时间,若该进程要求运行时间≠已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应把它的状态修改为“结束”(E)且退出队列。此时,应把该进程进程控制块的指针值送到前面一个进程的指针位置。 (5)若“就绪”状态进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。 (6)在所设计的称序应有显示或打印语句,能显示或打印每次被选进程进程名以及运行一次后进称对列的变化。 (7)为五个进程任意确定一组“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选进程进程名以及进程控制块的动态变化过程
第二题[提示] (1) 假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。进程控制块的格式为: 进程名 指针 要求运行时间 已运行时间 状态进程名----作为进程的标识,假设五个进程进程名分别是Q1,Q2,Q3,Q4,Q5。 指针----进程按顺序排成循环队列,用指针指出下一个进程进程控制块首地址,最后一个进程的指针指出第一个进程进程控制块首地址。 要求运行时间----假设进程需要运行的单位时间数。 已运行时间----假设进程已经运行的单位时间数,初始值为“0”。 状态----有两种状态,“就绪”状态和“结束”状态,初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态变为“结束”,用“E”表示。 (2) 每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“要求运行时间”。 把五个进程按顺序排成循环队列,用指针指出队列连接情况。另用一标志单元记录轮到运行的进程。 (3) 处理器调度总是选择标志单元指示的进程运行。由于本实验模拟处理器调度的功能,所以,对被选进程并不实际启动运行,而是执行: 已运行时间+1 来模拟进程的一次运行,表示进程已经运行过一个单位的时间。 请注意:在实际的系统,当一个进程被选运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片。在这里省去了这些工作,仅用“已运行时间+1”来表示进程已经运行满一个时间片。 (4) 进程运行一次后,应把该进程进程控制块的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间与已运行时间,若该进程要求运行时间≠已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应把它的状态修改为“结束”(E)且退出队列。此时,应把该进程进程控制块的指针值送到前面一个进程的指针位置。 (5) 若“就绪”状态进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。 (6) 在所设计的称序应有显示或打印语句,能显示或打印每次被选进程进程名以及运行一次后进称对列的变化。 (7) 为五个进程任意确定一组“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选进程进程名以及进程控制块的动态变化过程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值