操作系统实验——基于Java的模拟操作系统进程切换(简易版)

实验任务

创建一个进程,给出工作量,每个进程所占的时间片大小为20个单位,实现就绪状态到执行状态之间的转化。如果一个进程在执行,点击其I/O请求即可产生阻塞,实现了等待一个事件的状态转移。阻塞状态到就绪状态需要事件发生,本程序为了简化,过40个时间单位自动解锁。本程序可以在VC、或其他程序设计语言中实现,容易使用时钟控件。在控制台模式下,该方式不是非常合适。

开始实验

一、 实验目的:

通过实验进一步了解进程状态之间的转换和进程控制等相关操作,通过实验的方法模拟进程在操作系统中是如何进行切换的,并掌握进程的数据结构;

二、 实验内容:

  1. 模拟进程PCB块,包括进程信息(id,名称,所需时间片,优先级,当前状态等)
  2. 建立三个队列(执行队列、就绪队列、等待队列) 在此我选用Java中的集合类ArrayList来实现。
  3. 根据用户输入进行系统交互和进程转换
  4. 用do-while语句和switch语句实现用户输入
  5. 要实现的功能:
  1. 新建进程(输入进程号、时间片)
  2. 将进程变为就绪状态 就绪
  3. 将进程变为等待状态 阻塞
  4. 将进行变为执行状态 执行
  5. 进程执行一次消耗5个时间片,执行完后自动变为就绪状态等待下一次执行
  6. 不能使除就绪状态的进程变为等待状态
  7. 进程在三个队列中只能存在一个
  8. 有IO请求的时候停止当前运行进程

三、 实验步骤:

1. 创建一个进程类 包含的信息有 id、名称、所需时间片、优先级、当前状态;及其获取这些信息的方法

在这里插入图片描述

2. 系统类,定义了主函数main()和某些工具方法及方法函数

图:系统类定义的队列
在这里插入图片描述
在这里插入图片描述

图:系统类中的调用关系
在这里插入图片描述

图:系统类提供的相关工具方法及函数
在这里插入图片描述

3. 详解运行方法 runProcess()是如何实现的:

首先分析运行进程所需要的条件:进程状态为就绪或者运行而且时间片不小于0
可以用两种分支来进行运行程序:
1.进程为就绪状态,将进程从就绪队列中删除,并添加到运行队列中,修改程序状态和时间片
2.进程为运行状态,修改时间片,并添加到运行队列尾等待下一次运行

相关源码:
//运行一个进程

	private static void runProcess() {
   
		// TODO Auto-generated method stub
		Process process;
		if (!Dlists.isEmpty()) {
   
			process = Dlists.get(0);
			if (process.getState()==2) {
   
				System.out.println("直接");
				for (int i = 5; i >= 1; i--) {
   
					try {
   
						Thread.sleep(200);
					} catch (InterruptedException e) {
   
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					System.out.println("进程"+process.getPid()+"正在运行");
					process.setPtime(process.getPtime()-1);
				}
				System.out.println("进程"+process.getPid()+"剩余运行时间:"+process.getPtime()+"\t 进程结束运行");
		readProcess(process.getPid());
			}else {
   
			System.out.println("当前队列进程无法运行不为2");
			readProcess(process.getPid());
			
		}
	}
	else if (!Rlists.isEmpty()) {
   
		System.out.println("间接");
		process = Rlists.get(0);
		if ((process.getState()==1&&(process.getPtime()>0))) {
   
			process.setState(2);
			Rlists.remove(0);
		Dlists.add(process);
			
			for (int i = 5; i >= 1; i--) {
   
				try {
   
					Thread.sleep(200);
				} catch (InterruptedException e) {
   
						// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println("进程"+process.getPid()+"正在运行");
					process.setPtime(process.getPtime()-1);
				}
				System.out.println("进程"+process.getPid()+"剩余运行时间:"+process.getPtime()+"\t 进程结束运行");
		readProcess(process.getPid());
		}else if (process.getState()==1) {
   
			Rlists.remove(0);
			System.out.println("进程"+process.getPid()+"时间片剩余不足,已销毁");
		}else if (process.getState()!=1){
   
			System.out.println("当前队列进程无法运行不为1");
			System.out.println(process.getState());
		}else {
   
		System.out.println("当前队列进程无法运行");
		System.out.println(process.getState());
		System.out.println(process.getPtime());
		}
	}else 
1.目的: 自行编制模拟程序,通过形象化的状态显示,深入理解进程的概念、进程之间的状态转换及其所带来的PCB内容 、组织的变化,理解进程与其PCB间的一一对应关系。 2. 内容及要求: 1) 设计并实现一个模拟进程状态转换及其相应PCB内容、组织结构变化的程序。 2) 独立编写、调试程序。进程的数目、进程的状态模型(三状态、五状态、七状态或其它)以及PCB的组织形式可自行选择。 3) 合理设计与进程PCB相对应的数据结构。PCB的内容要涵盖进程的基本信息、控制信息、资源需求及现场信息。 4) 设计出可视性较好的界面,应能反映出进程状态的变化引起的对应PCB内容、组织结构的变化。 5) 代码书写要规范,要适当地加入注释。 6) 认真进行预习,完成预习报告。 7) 实验完成后,要认真总结,完成实验报告。 3.使用的数据结构及说明: 在本实验中,主要用到的数据结构是PCB的结构,其中PCB的数据结构如下: struct PCB { int P_Id; //PCB的ID号 char P_Name[10]; //PCB的名称 char P_State[10]; //PCB状态 int P_Runtime; //PCB的所需要的运行时间 int P_Requiry; //PCB所需要的资源要求 struct PCB * next ; //PCB块的下一个指针 } ; 其中,P_Id,P_Name用来标示一个进程,而P_State用来标示进程的五种状态:Create_state,Ready_state,Block_state,Run_state,Exit_state。P_Runtime标示要完成一个进程所需要的时间。P_Requiry标示一个进程的执行所需要的其他条件,当其他的条件满足,则P_Requiry置1,否则置0。Struct PCB * next 用来指向同一队列中的下一个PCB块。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值