Shellmiao il y a 4 ans
commit
78edc9f49f
9 fichiers modifiés avec 226 ajouts et 0 suppressions
  1. 8 0
      .idea/.gitignore
  2. 1 0
      .idea/.name
  3. 9 0
      .idea/ProcessSimulator.iml
  4. 8 0
      .idea/modules.xml
  5. 2 0
      README.md
  6. BIN
      main.exe
  7. 117 0
      main.go
  8. 24 0
      process.go
  9. 57 0
      processQueue.go

+ 8 - 0
.idea/.gitignore

@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/

+ 1 - 0
.idea/.name

@@ -0,0 +1 @@
+ProcessSimulator

+ 9 - 0
.idea/ProcessSimulator.iml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="WEB_MODULE" version="4">
+  <component name="Go" enabled="true" />
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/ProcessSimulator.iml" filepath="$PROJECT_DIR$/.idea/ProcessSimulator.iml" />
+    </modules>
+  </component>
+</project>

+ 2 - 0
README.md

@@ -0,0 +1,2 @@
+# ProcessSimulator
+操作系统内核课程设计:进程调度算法

BIN
main.exe


+ 117 - 0
main.go

@@ -0,0 +1,117 @@
+// @Title ProcessSimulator
+// @Description  模拟进程调用算法
+// @Author  Shellmiao
+// @Update  2021.10.21
+
+package main
+
+import (
+	"fmt"
+	"sort"
+	"strconv"
+)
+
+// PrintProcessQueue 用于最终输出结果
+func PrintProcessQueue(processQueue ProcessQueue) {
+	processQueue.typeOfAl = 5
+	sort.Sort(processQueue)
+	fmt.Println("[-]进程ID\t进程名称\t到达时间\t服务时间\t开始时间\t结束时间\t周转时间\t带权周转时间")
+	for i := 0; i < len(processQueue.ProcessQueue); i++ {
+		fmt.Println("[-]" + strconv.Itoa(i) + "\t\t" + processQueue.ProcessQueue[i].name + "\t\t" + strconv.Itoa(processQueue.ProcessQueue[i].arriveTime) + "\t\t" + strconv.Itoa(processQueue.ProcessQueue[i].serveTime) + "\t\t" + strconv.Itoa(processQueue.ProcessQueue[i].beginTime) + "\t\t" + strconv.Itoa(processQueue.ProcessQueue[i].finishTime) + "\t\t" + strconv.Itoa(processQueue.ProcessQueue[i].roundTime) + "\t\t" + strconv.FormatFloat(processQueue.ProcessQueue[i].aveRoundTime, 'f', 2, 64))
+	}
+}
+
+// CompleteProcess 完成一个进程
+func CompleteProcess(process *Process, time *int) {
+	process.beginTime = *time
+	*time += process.serveTime
+	process.isFinished = true
+	process.finishTime = *time
+	process.roundTime = process.finishTime - process.arriveTime
+	process.aveRoundTime = float64(process.roundTime) / float64(process.serveTime)
+}
+
+// WaitTillProcessArrive 在当前时间没有进程工作时,等待直到有新的进程工作加入
+func WaitTillProcessArrive(processQueue ProcessQueue, time int) int {
+	for i := 0; i < len(processQueue.ProcessQueue); i++ {
+		if !processQueue.ProcessQueue[i].isFinished {
+			if processQueue.ProcessQueue[i].arriveTime > time {
+				return processQueue.ProcessQueue[i].arriveTime
+			} else {
+				return time
+			}
+		}
+	}
+	return time
+}
+
+// FCFS FCFS算法
+func FCFS(processQueue ProcessQueue) {
+	time := 0
+	for i := 0; i < len(processQueue.ProcessQueue); i++ {
+		time = WaitTillProcessArrive(processQueue, time)
+		if !processQueue.ProcessQueue[i].isFinished {
+			CompleteProcess(processQueue.ProcessQueue[i], &time)
+		}
+	}
+	PrintProcessQueue(processQueue)
+}
+
+// SJF_and_HRRF_and_HPF 同时实现SJF,HRRF,HPF算法,通过flag区分
+func SJF_and_HRRF_and_HPF(processQueue ProcessQueue, flag int) {
+	time := 0
+	length := len(processQueue.ProcessQueue)
+	for {
+		var tempQueue ProcessQueue
+		tempQueue.typeOfAl = flag
+		tempQueue.time = time
+		for i := 0; i < length; i++ {
+			if processQueue.ProcessQueue[i].arriveTime > time {
+				break
+			}
+			if !processQueue.ProcessQueue[i].isFinished {
+				tempQueue.ProcessQueue = append(tempQueue.ProcessQueue, processQueue.ProcessQueue[i])
+			}
+		}
+		if len(tempQueue.ProcessQueue) == 0 {
+			temp := WaitTillProcessArrive(processQueue, time)
+			if temp == time {
+				break
+			} else {
+				time = temp
+				tempQueue.time = time
+				continue
+			}
+		}
+		sort.Sort(tempQueue)
+		CompleteProcess(tempQueue.ProcessQueue[0], &time)
+		tempQueue.time = time
+	}
+	PrintProcessQueue(processQueue)
+}
+
+func main() {
+	fmt.Println("[-]开始模拟调度算法...")
+	var processQueue = initProcessQueue()
+	processQueue.typeOfAl = 1
+	sort.Sort(processQueue)
+	fmt.Print("[-]请输入需要的调度算法(1[FCFS]、2[SJF]、3[HRRF]、4[HPF]): ")
+	var choose int
+	fmt.Scan(&choose)
+	switch choose {
+	case 1:
+		FCFS(processQueue)
+	case 2:
+		SJF_and_HRRF_and_HPF(processQueue, 2)
+	case 3:
+		SJF_and_HRRF_and_HPF(processQueue, 3)
+	case 4:
+		for i := 0; i < len(processQueue.ProcessQueue); i++ {
+			var temp int
+			fmt.Print("[+]请输入第" + strconv.Itoa(i) + "个进程的信息(优先值): ")
+			fmt.Scan(&temp)
+			processQueue.ProcessQueue[i].priority = temp
+		}
+		SJF_and_HRRF_and_HPF(processQueue, 4)
+	}
+}

+ 24 - 0
process.go

@@ -0,0 +1,24 @@
+package main
+
+type Process struct {
+	name         string
+	arriveTime   int
+	serveTime    int
+	beginTime    int
+	finishTime   int
+	roundTime    int
+	aveRoundTime float64
+	clock        float64
+	isFinished   bool
+	priority     int
+}
+
+func newProcess(name string, arriveTime int, serveTime int) *Process {
+	return &Process{
+		name:       name,
+		arriveTime: arriveTime,
+		serveTime:  serveTime,
+		clock:      0,
+		isFinished: false,
+	}
+}

+ 57 - 0
processQueue.go

@@ -0,0 +1,57 @@
+package main
+
+import (
+	"fmt"
+	"strconv"
+)
+
+type ProcessQueue struct {
+	ProcessQueue []*Process
+	typeOfAl     int
+	time         int
+}
+
+func (s ProcessQueue) Len() int {
+	return len(s.ProcessQueue)
+}
+
+func (s ProcessQueue) Swap(i, j int) {
+	s.ProcessQueue[i], s.ProcessQueue[j] = s.ProcessQueue[j], s.ProcessQueue[i]
+}
+
+// Less 实现接口,用于sort排序
+func (s ProcessQueue) Less(i, j int) bool {
+	switch s.typeOfAl {
+	case 1:
+		return s.ProcessQueue[i].arriveTime < s.ProcessQueue[j].arriveTime
+	case 2:
+		return s.ProcessQueue[i].serveTime < s.ProcessQueue[j].serveTime
+	case 3:
+		return (s.time-s.ProcessQueue[i].arriveTime+s.ProcessQueue[i].serveTime)*s.ProcessQueue[j].serveTime > (s.time-s.ProcessQueue[j].arriveTime+s.ProcessQueue[j].serveTime)*s.ProcessQueue[i].serveTime
+	case 4:
+		return s.ProcessQueue[i].priority > s.ProcessQueue[j].priority
+	case 5:
+		return s.ProcessQueue[i].beginTime < s.ProcessQueue[j].beginTime
+	}
+	return s.ProcessQueue[i].arriveTime < s.ProcessQueue[j].arriveTime
+}
+
+func initProcessQueue() ProcessQueue {
+	var processQueue ProcessQueue
+	var numOfProcess int
+	var name string
+	var arriveTime int
+	var serveTime int
+	fmt.Print("[+]请输入进程数量:")
+	fmt.Scan(&numOfProcess)
+	for i := 0; i < numOfProcess; i++ {
+		fmt.Print("[+]请输入第" + strconv.Itoa(i) + "个进程的信息(到达时间 服务时间 进程名称): ")
+		fmt.Scan(&arriveTime, &serveTime, &name)
+		processQueue.ProcessQueue = append(processQueue.ProcessQueue, newProcess(name, arriveTime, serveTime))
+	}
+	fmt.Println("[-]进程ID\t进程名称\t到达时间\t服务时间")
+	for i := 0; i < numOfProcess; i++ {
+		fmt.Println("[-]" + strconv.Itoa(i) + "\t\t" + processQueue.ProcessQueue[i].name + "\t\t" + strconv.Itoa(processQueue.ProcessQueue[i].arriveTime) + "\t\t" + strconv.Itoa(processQueue.ProcessQueue[i].serveTime))
+	}
+	return processQueue
+}