changeset 11:6279a5104cac

try to add chart
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 13 Jan 2017 23:00:45 +0900
parents b2db777ac8dc
children ec108940a0da
files src/main/java/jp/ac/uryukyu/ie/schedularSimulator/Cpu.java src/main/java/jp/ac/uryukyu/ie/schedularSimulator/PeriodicalRun.java src/main/java/jp/ac/uryukyu/ie/schedularSimulator/RateMonotonicEvent.java src/main/java/jp/ac/uryukyu/ie/schedularSimulator/Run.java src/main/java/jp/ac/uryukyu/ie/schedularSimulator/SchedChart.java src/main/java/jp/ac/uryukyu/ie/schedularSimulator/SchedulerInterface.java
diffstat 6 files changed, 207 insertions(+), 74 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/jp/ac/uryukyu/ie/schedularSimulator/Cpu.java	Fri Jan 13 00:48:33 2017 +0900
+++ b/src/main/java/jp/ac/uryukyu/ie/schedularSimulator/Cpu.java	Fri Jan 13 23:00:45 2017 +0900
@@ -36,6 +36,7 @@
         }
         if (t.prev_end != 0) t.waiting += task_clock - t.prev_end;
 
+        t.cpu = cpu;
         // 実行時間を、シミュレータのクロックに足す
         task_clock += exec_time;
 
--- a/src/main/java/jp/ac/uryukyu/ie/schedularSimulator/PeriodicalRun.java	Fri Jan 13 00:48:33 2017 +0900
+++ b/src/main/java/jp/ac/uryukyu/ie/schedularSimulator/PeriodicalRun.java	Fri Jan 13 23:00:45 2017 +0900
@@ -8,7 +8,7 @@
 import java.util.Scanner;
 
 
-public class PeriodicalRun {
+public class PeriodicalRun implements SchedulerInterface {
 
     private PriorityQueue<Task> task_list;
     private PriorityQueue<EventInterface> event_list;
@@ -27,6 +27,70 @@
         cpu = new Cpu[1];
     }
 
+    @Override
+    public void runScheduler(String[] args) {
+        try {
+            periodicSecheduler(args);
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void periodicSecheduler(String[] args) throws FileNotFoundException {
+        String dataFile = "";
+        Runnable doRun = new Runnable() {
+            public void run() {
+                run();
+            }
+        };
+        for (int i = 0; i < args.length; i++) {
+            switch (args[i]) {
+                case "--cpu":
+                case "-c":
+                    if (i >= args.length) {
+                        System.err.println("no cpu num.");
+                        return;
+                    }
+                    int cpu = Integer.parseInt(args[++i]);
+                    if (cpu <= 0) {
+                        System.err.println("bad cpu num.");
+                        return;
+                    }
+                    setNum_cpu(cpu);
+                    break;
+                case "--quantum":
+                case "-q":
+                    if (i >= args.length) {
+                        System.err.println("no quantum time.");
+                        return;
+                    }
+                    int quantum = Integer.parseInt(args[++i]);
+                    if (quantum <= 0) {
+                        System.err.println("bad quantum num.");
+                        return;
+                    }
+                    setQuantum(quantum);
+                    break;
+                case "--data":
+                case "-d":
+                    if (i >= args.length) {
+                        System.err.println("no data file name.");
+                        return;
+                    }
+                    dataFile = args[++i];
+                    break;
+                case "-h":
+                case "--help":
+                default:
+                    System.err.println("Usage: [--cpu numCpu] [--data dataFileName]");
+                    return;
+            }
+        }
+        task_init(dataFile);
+        doRun.run();
+        return;
+    }
+
     public void setNum_cpu(int num) {
         num_cpu = num;
         cpu = new Cpu[num_cpu];
@@ -54,58 +118,8 @@
 	    p periodic
 	 */
 	public static void main(String []args) throws FileNotFoundException {
-        String dataFile = "";
         PeriodicalRun scheduler = new PeriodicalRun();
-        Runnable doRun = new Runnable() {
-            public void run() {
-                scheduler.run();
-            }
-        };
-        for (int i = 0; i < args.length; i++) {
-            switch (args[i]) {
-                case "--cpu":
-                case "-c":
-                    if (i >= args.length) {
-                        System.err.println("no cpu num.");
-                        return;
-                    }
-                    int cpu = Integer.parseInt(args[++i]);
-                    if (cpu <= 0) {
-                        System.err.println("bad cpu num.");
-                        return;
-                    }
-                    scheduler.setNum_cpu(cpu);
-                    break;
-                case "--quantum":
-                case "-q":
-                    if (i >= args.length) {
-                        System.err.println("no quantum time.");
-                        return;
-                    }
-                    int quantum = Integer.parseInt(args[++i]);
-                    if (quantum <= 0) {
-                        System.err.println("bad quantum num.");
-                        return;
-                    }
-                    scheduler.setQuantum(quantum);
-                    break;
-                case "--data":
-                case "-d":
-                    if (i >= args.length) {
-                        System.err.println("no data file name.");
-                        return;
-                    }
-                    dataFile = args[++i];
-                    break;
-                case "-h":
-                case "--help":
-                default:
-                    System.err.println("Usage: [--cpu numCpu] [--data dataFileName]");
-                    return;
-            }
-        }
-        scheduler.task_init(dataFile);
-        doRun.run();
+        scheduler.periodicSecheduler(args);
         scheduler.report();
     }
 
@@ -114,12 +128,12 @@
             cpu[i].report();
 	}
 
-    public LinkedList<Task> getFinishedTask() {
-        return finishedTask;
+    @Override
+    public LinkedList<Task> getFinishedTaskList() {
+        return null;
     }
 
 
-
     /*
        task の sort 用の関数
      */
--- a/src/main/java/jp/ac/uryukyu/ie/schedularSimulator/RateMonotonicEvent.java	Fri Jan 13 00:48:33 2017 +0900
+++ b/src/main/java/jp/ac/uryukyu/ie/schedularSimulator/RateMonotonicEvent.java	Fri Jan 13 23:00:45 2017 +0900
@@ -59,7 +59,7 @@
                     }
                 }
                 run.cpu[q.cpu].quantum -= run.cpu[q.cpu].exec_task(q,run.cpu[q.cpu].quantum);
-                run.getFinishedTask().add(q.copy());
+                run.getFinishedTaskList().add(q.copy());
 			}
 		}
 
--- a/src/main/java/jp/ac/uryukyu/ie/schedularSimulator/Run.java	Fri Jan 13 00:48:33 2017 +0900
+++ b/src/main/java/jp/ac/uryukyu/ie/schedularSimulator/Run.java	Fri Jan 13 23:00:45 2017 +0900
@@ -4,7 +4,7 @@
 import java.io.FileNotFoundException;
 import java.util.*;
 
-public class Run {
+public class Run implements SchedulerInterface {
 	int quantum = 0;
 	int num_cpu = 1;
 	Cpu [] cpu;
@@ -40,43 +40,66 @@
         p periodic
      */
 	public static void main(String args[]) throws FileNotFoundException {
+        Run scheduler = new Run();
+        scheduler.aperiodicScheduler(args);
+        scheduler.report();
+	}
+
+	@Override
+	public void runScheduler(String[] args) {
+        try {
+            aperiodicScheduler(args);
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void aperiodicScheduler(String[] args) throws FileNotFoundException {
         String dataFile = "";
-        Run scheduler = new Run();
-        Runnable doRun = new Runnable() { public void run() { scheduler.sjf(); }} ;
+        Runnable doRun = new Runnable() { public void run() { sjf(); }} ;
         for(int i = 0; i < args.length; i++ ) {
             switch (args[i]) {
                 case "--cpu" :case "-c" :
-                    if (i >= args.length) { System.err.println("no cpu num."); return; }
+                    if (i >= args.length) { System.err.println("no cpu num.");
+                        return;
+                    }
                     int cpu = Integer.parseInt(args[++i]);
-                    if (cpu <= 0) { System.err.println("bad cpu num."); return; }
-                    scheduler.setNum_cpu(cpu);
+                    if (cpu <= 0) { System.err.println("bad cpu num.");
+                        return;
+                    }
+                    setNum_cpu(cpu);
                     break;
                 case "--quantum" :case "-q" :
-                    if (i >= args.length) { System.err.println("no quantum time."); return; }
+                    if (i >= args.length) { System.err.println("no quantum time.");
+                        return;
+                    }
                     int quantum = Integer.parseInt(args[++i]);
-                    if (quantum <= 0) { System.err.println("bad quantum num."); return; }
-                    scheduler.setQuantum(quantum);
+                    if (quantum <= 0) { System.err.println("bad quantum num.");
+                        return;
+                    }
+                    setQuantum(quantum);
                     break;
                 case "--data" :case "-d" :
-                    if (i >= args.length) { System.err.println("no data file name."); return; }
+                    if (i >= args.length) { System.err.println("no data file name.");
+                        return;
+                    }
                     dataFile = args[++i];
                     break;
-                case "--fifo" : doRun = new Runnable() { public void run() { scheduler.fifo(); }} ; break;
-                case "--sjf" : doRun = new Runnable() { public void run() { scheduler.sjf(); }} ; break;
-                case "--roundRobbin" : doRun = new Runnable() { public void run() { scheduler.roundRobbin(); }} ; break;
+                case "--fifo" : doRun = new Runnable() { public void run() { fifo(); }} ; break;
+                case "--sjf" : doRun = new Runnable() { public void run() { sjf(); }} ; break;
+                case "--roundRobbin" : doRun = new Runnable() { public void run() { roundRobbin(); }} ; break;
                 case "-h":case "--help" :
                 default:
                     System.err.println("Usage: [--cpu numCpu] [--data dataFileName] [--fifo] [--sjf] ");
                     return;
             }
         }
-        scheduler.task_init(dataFile);
+        task_init(dataFile);
         doRun.run();
-        scheduler.report();
+        return;
+    }
 
-	}
-
-	public void report() {
+    public void report() {
         for(int i = 0; i< num_cpu; i++)
             cpu[i].report();
     }
@@ -164,4 +187,8 @@
     }
 
 
+    @Override
+    public LinkedList<Task> getFinishedTaskList() {
+        return finishedTask;
+    }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/uryukyu/ie/schedularSimulator/SchedChart.java	Fri Jan 13 23:00:45 2017 +0900
@@ -0,0 +1,80 @@
+package jp.ac.uryukyu.ie.schedularSimulator;
+
+import javafx.application.Application;
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+import javafx.scene.Group;
+import javafx.scene.Node;
+import javafx.scene.Scene;
+import javafx.scene.chart.BarChart;
+import javafx.scene.chart.CategoryAxis;
+import javafx.scene.chart.NumberAxis;
+import javafx.scene.chart.StackedBarChart;
+import javafx.scene.layout.VBox;
+import javafx.stage.Stage;
+
+import java.util.LinkedList;
+
+/**
+ * Created by kono on 2017/01/13.
+ */
+public class SchedChart extends Application {
+    private static LinkedList<Task> taskList;
+
+    static Node createBarChart(boolean horizontal, boolean simple, boolean stacked) {
+        ObservableList<String> cpuList = FXCollections.observableArrayList();
+        LinkedList<LinkedList<Task>> cpuTaskList = new LinkedList<LinkedList<Task>>();
+        for(Task t : taskList) {
+            while (t.cpu >= cpuList.size()) {
+                cpuList.add("cpu"+ Integer.toString(t.cpu));
+                cpuTaskList.add(new LinkedList<Task>());
+            }
+            cpuTaskList.get(t.cpu).add(t);
+        }
+        CategoryAxis xAxis = new CategoryAxis(cpuList);
+        NumberAxis yAxis = new NumberAxis();
+        yAxis.setLabel("Clock");
+        ObservableList<BarChart.Series> barChartData = FXCollections.observableArrayList();
+        int i = 0;
+        for(String cpuName : cpuList) {
+            int lastClock = 0;
+            ObservableList<BarChart.Data> chart = FXCollections.observableArrayList();
+            for(Task t : cpuTaskList.get(i)) {
+                if (lastClock < t.start ) {
+                    // insert empty task
+                    // chart.add(new BarChart.Data(t.start - lastClock, "empty"));
+                }
+                chart.add(new BarChart.Data(t.end - t.start, t.name));
+                lastClock = t.end;
+            }
+            barChartData.add(new BarChart.Series(cpuName,chart));
+            i++;
+        }
+        return new StackedBarChart(yAxis, xAxis, barChartData);
+    }
+
+    public static void main(String args[]) {
+        SchedulerInterface sched = new Run();
+        sched.runScheduler(args);
+        taskList = sched.getFinishedTaskList();
+        launch(args);
+    }
+
+    @Override
+    public void start(final Stage stage) {
+        stage.setTitle("");
+        stage.setWidth(500);
+        stage.setHeight(500);
+        Scene scene = new Scene(new Group());
+
+        VBox root = new VBox();
+
+        Node barChart = createBarChart(true, true, true);
+
+        root.getChildren().addAll(barChart);
+        scene.setRoot(root);
+
+        stage.setScene(scene);
+        stage.show();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/uryukyu/ie/schedularSimulator/SchedulerInterface.java	Fri Jan 13 23:00:45 2017 +0900
@@ -0,0 +1,11 @@
+package jp.ac.uryukyu.ie.schedularSimulator;
+
+import java.util.LinkedList;
+
+/**
+ * Created by kono on 2017/01/13.
+ */
+public interface SchedulerInterface {
+    void runScheduler(String[] args);
+    LinkedList<Task> getFinishedTaskList();
+}