import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class mainSystem {
static ArrayList<PCB> ready=new ArrayList();//就绪队列
static ArrayList<PCB> block=new ArrayList();//阻塞队列
static Scanner sc=new Scanner(System.in);
public static void main(String[] args) {
while (true) {
System.out.println("********************");
System.out.println("* 系统主菜单 *");
System.out.println("********************");
System.out.println("* 1…创建 *");
System.out.println("* 2…阻塞 *");
System.out.println("* 3…唤醒 *");
System.out.println("* 4…终止 *");
System.out.println("* 5…显示 *");
System.out.println("* 6…调度 *");
System.out.println("* 0…退出 *");
System.out.println("********************");
System.out.println("请输入您需要的功能:(0-5):");
int x = sc.nextInt();
if (x == 0) {
break;
}
if (x == 1) {
add();
}
if (x == 2) {
block();
}
if (x == 3) {
huanxing();
}
if (x == 4) {
delete();
}
if (x == 5) {
xianshi();
}
if (x == 6){
scheduler();
}
if(x<0||x>6){
System.out.println("输入失败!请输入1-6之间的数字!");
}
}
}
//x==1 创建进程
public static void add(){
PCB jc = new PCB();
System.out.println("进程名:");
jc.setName(sc.next());
System.out.println("到达时间:");
jc.setArriveTime(sc.nextInt());
System.out.println("优先级");
jc.setPriority(sc.nextInt());
System.out.println("运行时间");
jc.setWorkTime(sc.nextInt());
int p=0;
if (ready.size()!=0){
for (int i = 0; i < ready.size(); i++) {
if (ready.get(i).getName().equals(jc.getName())) {
System.out.println("就绪队列中存在同名进程,无法添加!");
p++;
break;
}
}
}
if(p==0) {
if (block.size() != 0) {
for (int i = 0; i < block.size(); i++) {
if (block.get(i).getName().equals(jc.getName())) {
System.out.println("阻塞队列中存在同名进程,无法添加!");
p++;
break;
}
}
}
}
if(p==0){
ready.add(jc);
System.out.println("添加进程成功!");
ready.get(ready.size()-1).setState("就绪");
}
}
//x==2 阻塞进程
public static void block(){
int p=0;
System.out.println("请输入要阻塞的进程名:");
String cha=sc.next();
if(ready.size()<=0){
System.out.println("就绪队列为空,请先添加进程!");
}
else {
for (int j = 0; j < block.size(); j++) {
if (block.get(j).getName().equals(cha)) {
System.out.println("该进程已处在阻塞状态");//因为该进程在阻塞队列中
p++;
break;
}
}
if(p==0) {
for (int i = 0; i < ready.size(); i++) {
if (ready.get(i).getName().equals(cha)) {
block.add(ready.get(i));
ready.get(i).setState("阻塞");
ready.remove(i);
System.out.println("进程已阻塞");
p++;
break;
}
}
}
if (p==0) {
System.out.println("队列中没有该进程!无法阻塞!");//阻塞队列和就绪队列中都没有该进程
}
}
}
//x==3 唤醒进程
public static void huanxing(){
System.out.println("请输入要唤醒的进程:");
String huan=sc.next();
if(block.size()==0){
System.out.println("阻塞队列为空!无法唤醒!");
}
else {
for (int i = 0; i < block.size(); i++) {
if (block.get(i).getName().equals(huan)) {
block.get(i).setState("就绪");
ready.add(block.get(i));
block.remove(i);
System.out.println("进程已唤醒");
break;
}
if(i==block.size()-1 ){
System.out.println("阻塞队列中没有该进程!无法唤醒!");
}
}
}
}
//x==4 终止进程
public static void delete(){
System.out.println("请输入要终止的进程:");
String zhong=sc.next();
if(block.size()==0&&ready.size()==0){
System.out.println("就绪队列和阻塞队列为空,请先添加进程!");
}
int p=0;
for (int i = 0; i < block.size(); i++) {//遍历阻塞队列,如果有,就删除该进程
if (block.get(i).getName().equals(zhong) ) {
block.remove(i);
p++;
break;
}
}
if(p==0) {
for (int i = 0; i < ready.size(); i++) {//遍历就绪队列,如果有,就删除该进程
if (ready.get(i).getName().equals(zhong)) {
ready.remove(i);
p++;
break;
}
}
}
if(p==1){System.out.println("进程已终止");}
else {System.out.println("该进程不存在,无法终止!");}//阻塞队列和就绪队列都没有该进程
}
//x==5 显示进程
public static void xianshi(){
System.out.println("就绪队列:");
for(int i = 0; i < ready.size(); i++){//遍历就绪队列
if(i!=ready.size()-1) {//当该进程不是队列最后一个 他的指针就指向下一个进程
ready.get(i).setPointer(ready.get(i + 1).getName());
System.out.println(ready.get(i));
}
if(i==ready.size()-1&&ready.size()-1>=0){//当该进程是队列最后一个 他的指针就指向NULL
ready.get(i).setPointer("NULL");
System.out.println(ready.get(i));
}
}
System.out.println("阻塞队列:");
for(int j = 0; j < block.size(); j++){//遍历阻塞队列
if(j!=block.size()-1){//当该进程不是队列最后一个 他的指针就指向下一个进程
block.get(j).setPointer(block.get(j+1).getName());
System.out.println(block.get(j));
}
if(j==block.size()-1&&block.size()-1>=0){//当该进程是队列最后一个 他的指针就指向NULL
block.get(j).setPointer("NULL");
System.out.println(block.get(j));
}
}
}
//x==6 调度算法
public static void scheduler() {
System.out.println("*********************");
System.out.println("* 进程调度子菜单 *");
System.out.println("*********************");
System.out.println("* 0…返回子菜单 *");
System.out.println("* 1…先来先服务调度 *");
System.out.pr
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
这个是我操作系统大作业用过的,代码没有任何问题,都是符合实验要求的 ,如果你运行后还有问题,可以给我发私信 实验目的:通过本实验,进一步掌握进程调度的功能和实现原理。 实验环境:同实验一。 四、实验内容: 1、 设计进程调度功能,至少模拟两种以上调度算法。如:优先级调度算法、时间片调度算法等。 2、 进程调度功能作为一个函数 scheduler,加入到实验题目一中。 3、 进程调度程序从就绪队列中挑选进程,若队列为空,应显示“无就绪进程无法调度”的提示信息。 4、 若选上一个进程,以显示:进程名、状态、时间片、优先级等信息表示一个进程被执行。若运行完, 应删除相应 PCB。 五、实验要求: 1、 在实验题目一中的主菜单中加入一个菜单项:6 调度,选择该菜单项后,系统进入进程调度。 各功能简要说明: 1、 返回主菜单:当用户选择该项功能时,系统退出进程调度功能,返回到实验题目一中的主菜单。 2、 优先级调度:选择该功能选项时,系统将从就绪队列中选择优先级最高的进程,使该进程处于执行 状态(将进程 PCB 的内容显示在屏幕上,显示完成后,该进程结束,即撤销该进程的 PCB)。 3、 时间片
资源推荐
资源详情
资源评论
收起资源包目录
源代码.rar (10个子文件)
源代码
src
PCB.java 3KB
mainSystem.java 14KB
out
production
源代码
mainSystem.class 9KB
PCB.class 3KB
.idea
runConfigurations.xml 346B
vcs.xml 188B
workspace.xml 3KB
misc.xml 278B
modules.xml 265B
源代码.iml 433B
共 10 条
- 1
资源评论
快到锅里来呀
- 粉丝: 5541
- 资源: 18
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功