|
@@ -0,0 +1,456 @@
|
|
|
|
|
+package com.example.osservice.Service.Process;
|
|
|
|
|
+
|
|
|
|
|
+import com.example.osservice.DTO.CodeParam;
|
|
|
|
|
+import com.example.osservice.DTO.PatternParam;
|
|
|
|
|
+import com.example.osservice.DTO.RenderParam;
|
|
|
|
|
+import com.example.osservice.PO.*;
|
|
|
|
|
+import com.example.osservice.Util.SourceType;
|
|
|
|
|
+import com.example.osservice.VO.Response;
|
|
|
|
|
+import org.json.JSONArray;
|
|
|
|
|
+import org.json.JSONObject;
|
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
|
+import java.util.Comparator;
|
|
|
|
|
+import java.util.List;
|
|
|
|
|
+
|
|
|
|
|
+@Service
|
|
|
|
|
+public class ProcessServiceImp implements ProcessService {
|
|
|
|
|
+
|
|
|
|
|
+ public Response<String> info(){
|
|
|
|
|
+ String info = "<strong style=\"font-size: 16px\">处理机调度</strong><br/>\n" +
|
|
|
|
|
+ "  在多道程序设计系统中,内存中有多道程序运行,他们相互争夺处理机这一重要的资源。处理机调度就是从就绪队列中,按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程并发地执行。<br/>\n" +
|
|
|
|
|
+ "<br/>\n" +
|
|
|
|
|
+ "<strong style=\"font-size: 16px\">选择处理机调度算法的原则</strong><br/>\n" +
|
|
|
|
|
+ "  <strong>1. 资源利用率:</strong>使得CPU或其他资源的使用率尽可能高且能够并行工作。<br/>\n" +
|
|
|
|
|
+ "  <strong>2. 响应时间:</strong>使交互式用户的响应时间尽可能小,或尽快处理实时任务。<br/>\n" +
|
|
|
|
|
+ "  <strong>3. 周转时间:</strong>提交给系统开始到执行完成获得结果为止的这段时间间隔称周转时间,应该使周转时间或平均周转时间尽可能短。<br/>\n" +
|
|
|
|
|
+ "  <strong>4. 吞吐量:</strong>单位时间处理的进程数尽可能多。<br/>\n" +
|
|
|
|
|
+ "  <strong>5. 公平性:</strong>确保每个用户每个进程获得合理的CPU份额或其他资源份额。<br/>\n" +
|
|
|
|
|
+ "<br/>\n" +
|
|
|
|
|
+ "<strong style=\"font-size: 16px\">处理机调度算法</strong><br/>\n" +
|
|
|
|
|
+ "  <strong>1. 先来先服务(FCFS):</strong>是一种非抢占式的调度算法,每当有进程就绪时,都加入就绪队列,当前正在运行的进程结束执行时,选择在就绪队列中存在时间最长的进程运行。<br/>\n" +
|
|
|
|
|
+ "  <strong>2. 时间片轮转(RR):</strong>基于时钟的抢占式调度算法,以一个周期性间隔产生时钟中断,当中断发生时,当前正在运行的进程被置于就绪队列中,然后基于FCFS算法选择下一个就绪进程进行。<br/>\n" +
|
|
|
|
|
+ "  <strong>3. 最短进程优先(SPN): </strong>是一种非抢占式调度算法,选择所需处理时间最短的进程,短进程将会越过长进程,优先获得调度。<br/>\n" +
|
|
|
|
|
+ "  <strong>4. 最短剩余时间优先(SRT):</strong>是一种抢占式调度算法,调度器总是选择预期剩余时间更短的进程,当一个新进程加入就绪队列,可能比当前运行的进程具有更短的剩余时间,调度器就可能抢占当前正在运行的进程。<br/>\n" +
|
|
|
|
|
+ "  <strong>5. 最高响应比优先(HRRN):</strong>是一种非抢占式的调度算法,按照如下公式选择响应比最高的进程。<br/>\n" +
|
|
|
|
|
+ "   响应比 = (等待时间 + 期待服务时间) / 期待服务时间";
|
|
|
|
|
+ return new Response<>(200, "", info);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public Response<List<ProcessState>> patternTable(PatternParam patternParam){
|
|
|
|
|
+ List<OSProcess> list = new ArrayList<>();
|
|
|
|
|
+ try{
|
|
|
|
|
+ JSONArray jsonArray = new JSONArray(patternParam.getData());
|
|
|
|
|
+ for(int i = 0; i < jsonArray.length();i++){
|
|
|
|
|
+ JSONObject jsonObject2 = jsonArray.getJSONObject(i);
|
|
|
|
|
+ OSProcess osProcess = new OSProcess(i+1, jsonObject2.getString("name"), jsonObject2.getInt("arrive"), jsonObject2.getInt("total"), jsonObject2.getInt("total"));
|
|
|
|
|
+ list.add(osProcess);
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (Exception e){
|
|
|
|
|
+ System.out.println(e);
|
|
|
|
|
+ return new Response<>(500, "进程解析失败", null);
|
|
|
|
|
+ }
|
|
|
|
|
+ list.sort(Comparator.comparingInt(OSProcess::getArrive));
|
|
|
|
|
+
|
|
|
|
|
+ List<ProcessState> result;
|
|
|
|
|
+ if(patternParam.getType() == SourceType.FCFS){
|
|
|
|
|
+ result = FCFSFunc(list);
|
|
|
|
|
+ }else if(patternParam.getType() == SourceType.RR){
|
|
|
|
|
+ result = RRFunc(list);
|
|
|
|
|
+ }else if(patternParam.getType() == SourceType.SPN){
|
|
|
|
|
+ result = SPNFunc(list);
|
|
|
|
|
+ }else if(patternParam.getType() == SourceType.SRT){
|
|
|
|
|
+ result = SRTFunc(list);
|
|
|
|
|
+ }else if(patternParam.getType() == SourceType.HRRN){
|
|
|
|
|
+ result = HRRNFunc(list);
|
|
|
|
|
+ }else if(patternParam.getType() == SourceType.Feedback){
|
|
|
|
|
+ result = FeedbackFunc(list);
|
|
|
|
|
+ }else {
|
|
|
|
|
+ result = null;
|
|
|
|
|
+ }
|
|
|
|
|
+ return new Response<>(200, "成功", result);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public Response<String> render(RenderParam renderParam){
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public List<ProcessState> FCFSFunc(List<OSProcess> processes){
|
|
|
|
|
+ List<OSProcess> wait = new ArrayList<>();
|
|
|
|
|
+ List<OSProcess> done = new ArrayList<>();
|
|
|
|
|
+ OSProcessRunning running = null;
|
|
|
|
|
+
|
|
|
|
|
+ int time = 0;
|
|
|
|
|
+ List<ProcessState> states = new ArrayList<>();
|
|
|
|
|
+ while (true){
|
|
|
|
|
+ //准备阶段
|
|
|
|
|
+ if(processes.size() == 0){
|
|
|
|
|
+ states.add(new ProcessState(time, running, wait, done));
|
|
|
|
|
+ break;
|
|
|
|
|
+ }else{
|
|
|
|
|
+ for(OSProcess osProcess : processes){
|
|
|
|
|
+ if(osProcess.getArrive() == time){
|
|
|
|
|
+ wait.add((OSProcess) osProcess.clone());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ states.add(new ProcessState(time, running, wait, done));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //运行阶段
|
|
|
|
|
+ if(running==null){
|
|
|
|
|
+ if(wait.size()>0){
|
|
|
|
|
+ OSProcess next = wait.get(0);
|
|
|
|
|
+ running = new OSProcessRunning(next, next.getTotal(), 1);
|
|
|
|
|
+ wait.remove(0);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ else if(running.getCurrent()!=running.getLength()){
|
|
|
|
|
+ running.setCurrent(running.getCurrent()+1);
|
|
|
|
|
+ }
|
|
|
|
|
+ else if(running.getCurrent()==running.getLength()){
|
|
|
|
|
+ OSProcess now = running.deteriorate();
|
|
|
|
|
+ done.add(now);
|
|
|
|
|
+ for(int i = processes.size()-1; i >= 0 ; i--){
|
|
|
|
|
+ if(processes.get(i).getName().equals(now.getName())){
|
|
|
|
|
+ processes.remove(i);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if(wait.size()>0){
|
|
|
|
|
+ OSProcess next = wait.get(0);
|
|
|
|
|
+ running = new OSProcessRunning(next, next.getTotal(), 1);
|
|
|
|
|
+ wait.remove(0);
|
|
|
|
|
+ }else{
|
|
|
|
|
+ running = null;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ time += 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ return states;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public List<ProcessState> RRFunc(List<OSProcess> processes){
|
|
|
|
|
+ List<OSProcess> wait = new ArrayList<>();
|
|
|
|
|
+ List<OSProcess> done = new ArrayList<>();
|
|
|
|
|
+ OSProcessRunning running = null;
|
|
|
|
|
+ int RRLength = 4;
|
|
|
|
|
+
|
|
|
|
|
+ int time = 0;
|
|
|
|
|
+ List<ProcessState> states = new ArrayList<>();
|
|
|
|
|
+ while (true){
|
|
|
|
|
+ //准备阶段
|
|
|
|
|
+ if(processes.size() == 0){
|
|
|
|
|
+ states.add(new ProcessState(time, running, wait, done));
|
|
|
|
|
+ break;
|
|
|
|
|
+ }else{
|
|
|
|
|
+ for(OSProcess osProcess : processes){
|
|
|
|
|
+ if(osProcess.getArrive() == time){
|
|
|
|
|
+ wait.add((OSProcess) osProcess.clone());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ states.add(new ProcessState(time, running, wait, done));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //运行阶段
|
|
|
|
|
+ if(running == null){
|
|
|
|
|
+ if(wait.size()>0){
|
|
|
|
|
+ OSProcess next = wait.get(0);
|
|
|
|
|
+ running = new OSProcessRunning(next, Math.min(next.getRemain(), RRLength), 1);
|
|
|
|
|
+ wait.remove(0);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ else if(running.getCurrent() != running.getLength()){
|
|
|
|
|
+ running.setCurrent(running.getCurrent()+1);
|
|
|
|
|
+ }else if(running.getCurrent() == running.getLength()){
|
|
|
|
|
+ OSProcess now = running.deteriorate();
|
|
|
|
|
+ if(now.getRemain() == 0){
|
|
|
|
|
+ done.add(now);
|
|
|
|
|
+ for(int i = processes.size()-1; i >= 0 ; i--){
|
|
|
|
|
+ if(processes.get(i).getName().equals(now.getName())){
|
|
|
|
|
+ processes.remove(i);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }else {
|
|
|
|
|
+ wait.add(now);
|
|
|
|
|
+ }
|
|
|
|
|
+ if(wait.size()>0){
|
|
|
|
|
+ OSProcess next = wait.get(0);
|
|
|
|
|
+ running = new OSProcessRunning(next, Math.min(next.getRemain(), RRLength), 1);
|
|
|
|
|
+ wait.remove(0);
|
|
|
|
|
+ }else{
|
|
|
|
|
+ running = null;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ time += 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ return states;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public List<ProcessState> SPNFunc(List<OSProcess> processes){
|
|
|
|
|
+ List<OSProcess> wait = new ArrayList<>();
|
|
|
|
|
+ List<OSProcess> done = new ArrayList<>();
|
|
|
|
|
+ OSProcessRunning running = null;
|
|
|
|
|
+
|
|
|
|
|
+ int time = 0;
|
|
|
|
|
+ List<ProcessState> states = new ArrayList<>();
|
|
|
|
|
+ while (true){
|
|
|
|
|
+ //准备阶段
|
|
|
|
|
+ if(processes.size() == 0){
|
|
|
|
|
+ states.add(new ProcessState(time, running, wait, done));
|
|
|
|
|
+ break;
|
|
|
|
|
+ }else{
|
|
|
|
|
+ for(OSProcess osProcess : processes){
|
|
|
|
|
+ if(osProcess.getArrive() == time){
|
|
|
|
|
+ wait.add((OSProcess) osProcess.clone());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ states.add(new ProcessState(time, running, wait, done));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //运行阶段
|
|
|
|
|
+ if(running==null){
|
|
|
|
|
+ if(wait.size()>0){
|
|
|
|
|
+ int index = getShortestProcess(wait);
|
|
|
|
|
+ running = new OSProcessRunning(wait.get(index), wait.get(index).getTotal(), 1);
|
|
|
|
|
+ wait.remove(index);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ else if(running.getCurrent()!=running.getLength()){
|
|
|
|
|
+ running.setCurrent(running.getCurrent()+1);
|
|
|
|
|
+ }else if(running.getCurrent()==running.getLength()){
|
|
|
|
|
+ OSProcess now = running.deteriorate();
|
|
|
|
|
+ done.add(now);
|
|
|
|
|
+ for(int i = processes.size()-1; i >= 0 ; i--){
|
|
|
|
|
+ if(processes.get(i).getName().equals(now.getName())){
|
|
|
|
|
+ processes.remove(i);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if(wait.size()>0){
|
|
|
|
|
+ int index = getShortestProcess(wait);
|
|
|
|
|
+ running = new OSProcessRunning(wait.get(index), wait.get(index).getTotal(), 1);
|
|
|
|
|
+ wait.remove(index);
|
|
|
|
|
+ }else{
|
|
|
|
|
+ running = null;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ time += 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ return states;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private int getShortestProcess(List<OSProcess> processes){
|
|
|
|
|
+ int minIndex = 0;
|
|
|
|
|
+ int minRemain = processes.get(0).getRemain();
|
|
|
|
|
+ for(int i = 1;i < processes.size();i++){
|
|
|
|
|
+ int currentRemain = processes.get(i).getRemain();
|
|
|
|
|
+ if(currentRemain < minRemain){
|
|
|
|
|
+ minIndex = i;
|
|
|
|
|
+ minRemain = currentRemain;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return minIndex;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public List<ProcessState> SRTFunc(List<OSProcess> processes){
|
|
|
|
|
+ List<OSProcess> wait = new ArrayList<>();
|
|
|
|
|
+ List<OSProcess> done = new ArrayList<>();
|
|
|
|
|
+ OSProcessRunning running = null;
|
|
|
|
|
+
|
|
|
|
|
+ int time = 0;
|
|
|
|
|
+ List<ProcessState> states = new ArrayList<>();
|
|
|
|
|
+ while (true){
|
|
|
|
|
+ //准备阶段
|
|
|
|
|
+ boolean hasNew = false;
|
|
|
|
|
+ if(processes.size() == 0){
|
|
|
|
|
+ states.add(new ProcessState(time, running, wait, done));
|
|
|
|
|
+ break;
|
|
|
|
|
+ }else{
|
|
|
|
|
+ for(OSProcess osProcess : processes){
|
|
|
|
|
+ if(osProcess.getArrive() == time){
|
|
|
|
|
+ wait.add((OSProcess) osProcess.clone());
|
|
|
|
|
+ hasNew = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ states.add(new ProcessState(time, running, wait, done));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //运行阶段
|
|
|
|
|
+ if(running==null){
|
|
|
|
|
+ if(wait.size()>0){
|
|
|
|
|
+ int index = getShortestRemainProcess(wait, null);
|
|
|
|
|
+ running = new OSProcessRunning(wait.get(index), wait.get(index).getRemain(), 1);
|
|
|
|
|
+ wait.remove(index);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ else if(hasNew&&running.getCurrent()!=running.getLength()){
|
|
|
|
|
+ int index = getShortestRemainProcess(wait, running);
|
|
|
|
|
+ if(index == -1){
|
|
|
|
|
+ running.setCurrent(running.getCurrent()+1);
|
|
|
|
|
+ }else {
|
|
|
|
|
+ OSProcess now = running.deteriorate();
|
|
|
|
|
+ running = new OSProcessRunning(wait.get(index), wait.get(index).getRemain(), 1);
|
|
|
|
|
+ wait.remove(index);
|
|
|
|
|
+ wait.add(now);
|
|
|
|
|
+ }
|
|
|
|
|
+ } else if(running.getCurrent()!=running.getLength()){
|
|
|
|
|
+ running.setCurrent(running.getCurrent()+1);
|
|
|
|
|
+ }else if(running.getCurrent()==running.getLength()){
|
|
|
|
|
+ OSProcess now = running.deteriorate();
|
|
|
|
|
+ done.add(now);
|
|
|
|
|
+ for(int i = processes.size()-1; i >= 0 ; i--){
|
|
|
|
|
+ if(processes.get(i).getName().equals(now.getName())){
|
|
|
|
|
+ processes.remove(i);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if(wait.size()>0){
|
|
|
|
|
+ int index = getShortestRemainProcess(wait, null);
|
|
|
|
|
+ running = new OSProcessRunning(wait.get(index), wait.get(index).getRemain(), 1);
|
|
|
|
|
+ wait.remove(index);
|
|
|
|
|
+ }else{
|
|
|
|
|
+ running = null;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ time += 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ return states;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private int getShortestRemainProcess(List<OSProcess> processes, OSProcessRunning running){
|
|
|
|
|
+ int minIndex = 0;
|
|
|
|
|
+ int minRemain = processes.get(0).getRemain();
|
|
|
|
|
+ for(int i = 1;i < processes.size();i++){
|
|
|
|
|
+ if(processes.get(i).getRemain()<minRemain){
|
|
|
|
|
+ minIndex = i;
|
|
|
|
|
+ minRemain = processes.get(i).getRemain();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if(running==null||minRemain<running.getRemain()-running.getCurrent()){
|
|
|
|
|
+ return minIndex;
|
|
|
|
|
+ }else {
|
|
|
|
|
+ return -1;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public List<ProcessState> HRRNFunc(List<OSProcess> processes){
|
|
|
|
|
+ List<OSProcess> wait = new ArrayList<>();
|
|
|
|
|
+ List<OSProcess> done = new ArrayList<>();
|
|
|
|
|
+ OSProcessRunning running = null;
|
|
|
|
|
+
|
|
|
|
|
+ int time = 0;
|
|
|
|
|
+ List<ProcessState> states = new ArrayList<>();
|
|
|
|
|
+ while (true){
|
|
|
|
|
+ //准备阶段
|
|
|
|
|
+ if(processes.size() == 0){
|
|
|
|
|
+ states.add(new ProcessState(time, running, wait, done));
|
|
|
|
|
+ break;
|
|
|
|
|
+ }else{
|
|
|
|
|
+ for(OSProcess osProcess : processes){
|
|
|
|
|
+ if(osProcess.getArrive() == time){
|
|
|
|
|
+ wait.add((OSProcess) osProcess.clone());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ states.add(new ProcessState(time, running, wait, done));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //运行阶段
|
|
|
|
|
+ if(running==null){
|
|
|
|
|
+ if(wait.size()>0){
|
|
|
|
|
+ int index = getHighestHRRNProcess(wait, time);
|
|
|
|
|
+ running = new OSProcessRunning(wait.get(index), wait.get(index).getTotal(), 1);
|
|
|
|
|
+ wait.remove(index);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ else if(running.getCurrent()!=running.getLength()){
|
|
|
|
|
+ running.setCurrent(running.getCurrent()+1);
|
|
|
|
|
+ }else if(running.getCurrent()==running.getLength()){
|
|
|
|
|
+ OSProcess now = running.deteriorate();
|
|
|
|
|
+ done.add(now);
|
|
|
|
|
+ for(int i = processes.size()-1; i >= 0 ; i--){
|
|
|
|
|
+ if(processes.get(i).getName().equals(now.getName())){
|
|
|
|
|
+ processes.remove(i);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if(wait.size()>0){
|
|
|
|
|
+ int index = getHighestHRRNProcess(wait, time);
|
|
|
|
|
+ running = new OSProcessRunning(wait.get(index), wait.get(index).getTotal(), 1);
|
|
|
|
|
+ wait.remove(index);
|
|
|
|
|
+ }else{
|
|
|
|
|
+ running = null;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ time += 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ return states;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private int getHighestHRRNProcess(List<OSProcess> processes, int time){
|
|
|
|
|
+ int highestIndex = 0;
|
|
|
|
|
+ double highestHRRN = (double) (time - processes.get(0).getArrive() + processes.get(0).getTotal())/processes.get(0).getTotal();
|
|
|
|
|
+ for(int i = 0;i < processes.size();i++){
|
|
|
|
|
+ double currentHRRN = (double) (time - processes.get(i).getArrive() + processes.get(i).getTotal())/processes.get(i).getTotal();
|
|
|
|
|
+ if(currentHRRN > highestHRRN){
|
|
|
|
|
+ highestIndex = i;
|
|
|
|
|
+ highestHRRN = currentHRRN;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return highestIndex;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public Response<List<ProcessState>> patternCode(CodeParam codeParam){
|
|
|
|
|
+ int grade = 0;
|
|
|
|
|
+ String info = "";
|
|
|
|
|
+ List<String> blanks = codeParam.getData();
|
|
|
|
|
+ String blank1 = blanks.get(0).replace(" ", "");
|
|
|
|
|
+ if(codeParam.getType() == SourceType.FCFS || codeParam.getType() == SourceType.RR){
|
|
|
|
|
+ if(!"wait.remove(0);".equals(blank1) && !"wait.pop();".equals(blank1)){
|
|
|
|
|
+ grade += 1;
|
|
|
|
|
+ info += " 1.请参考list删除元素的方法";
|
|
|
|
|
+ }
|
|
|
|
|
+ } else{
|
|
|
|
|
+ if(!"wait.remove(index);".equals(blank1)){
|
|
|
|
|
+ grade += 1;
|
|
|
|
|
+ info += " 1.请参考list删除元素的方法";
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ String blank2 = blanks.get(1).replace(" ", "");
|
|
|
|
|
+ if(!"running.setCurrent(running.getCurrent()+1);".equals(blank2)){
|
|
|
|
|
+ grade +=2;
|
|
|
|
|
+ if(blank2.contains(".current")){
|
|
|
|
|
+ info += info.equals("")?" ":"\n2."+"成员变量current为私有成员变量,不可直接访问";
|
|
|
|
|
+ }else{
|
|
|
|
|
+ info += info.equals("")?" ":"\n2."+"参考Process.java中对current成员变量的操作";
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ List<ProcessState> result;
|
|
|
|
|
+ if(grade > 0){
|
|
|
|
|
+ return new Response<>(500, "" + grade + info, null);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ List<OSProcess> list = new ArrayList<>();
|
|
|
|
|
+ list.add(new OSProcess(1, "A", 0 ,4, 4));
|
|
|
|
|
+ list.add(new OSProcess(2, "B", 1 ,5, 5));
|
|
|
|
|
+ list.add(new OSProcess(3, "C", 1 ,2, 2));
|
|
|
|
|
+ if(codeParam.getType() == SourceType.FCFS){
|
|
|
|
|
+ result = FCFSFunc(list);
|
|
|
|
|
+ }else if(codeParam.getType() == SourceType.RR){
|
|
|
|
|
+ result = RRFunc(list);
|
|
|
|
|
+ }else if(codeParam.getType() == SourceType.SPN){
|
|
|
|
|
+ result = SPNFunc(list);
|
|
|
|
|
+ }else if(codeParam.getType() == SourceType.SRT){
|
|
|
|
|
+ result = SRTFunc(list);
|
|
|
|
|
+ }else if(codeParam.getType() == SourceType.HRRN){
|
|
|
|
|
+ result = HRRNFunc(list);
|
|
|
|
|
+ }else if(codeParam.getType() == SourceType.Feedback){
|
|
|
|
|
+ result = FeedbackFunc(list);
|
|
|
|
|
+ }else {
|
|
|
|
|
+ result = null;
|
|
|
|
|
+ }
|
|
|
|
|
+ return new Response<>(200, "成功", result);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public List<ProcessState> FeedbackFunc(List<OSProcess> processes){
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|