Skip to content

Commit 5a02a85

Browse files
committed
Changed Preemptive Logic
1 parent ee78240 commit 5a02a85

File tree

5 files changed

+57
-21
lines changed

5 files changed

+57
-21
lines changed

src/jvmMain/kotlin/policy/Common.kt

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import utils.ProgramData
55
import utils.Task
66
import java.util.*
77

8-
internal fun calculateTasks(tasks: List<Task>, compare: (Task, Task) -> Int, isNonPreemptive: Boolean): ProgramData {
8+
internal fun calculateTasks(tasks: List<Task>, compare: (Task, Task) -> Int, isPreemptive: Boolean): ProgramData {
99
val info: MutableList<ChartInfo> = mutableListOf(ChartInfo(-1, tasks[0].arrivalTime, ranTime = 0))
1010

1111
var currentRunTime = tasks[0].arrivalTime
@@ -16,12 +16,18 @@ internal fun calculateTasks(tasks: List<Task>, compare: (Task, Task) -> Int, isN
1616
while (idx < tasks.size) {
1717
while (idx < tasks.size && currentRunTime == tasks[idx].arrivalTime) { // 동일한 시간에 들어오는 경우 처리를 위해 if 가 아닌 while
1818

19-
if (currentRunTask === null) { currentRunTask = tasks[idx] }
20-
else if (compare(currentRunTask, tasks[idx]) <= 0 || isNonPreemptive) { // 기존 Task 의 우선순위가 더 크면, 변화 X, current 계속 실행
19+
if (currentRunTask === null) {
20+
currentRunTask = tasks[idx]
21+
} else if (compare(currentRunTask, tasks[idx]) <= 0 || !isPreemptive) {
22+
// If It's not preemptive, simply add it to the ready pool without comparing it to other tasks.
23+
// Or if It's preemptive, then compare the priority of 2 tasks.
24+
// 기존 Task 의 우선순위가 더 크면, 변화 X, current 계속 실행
2125
readyPool.add(tasks[idx])
2226
} else { // If the priority of the new task is more urgent. 새로 비교할 Task 의 우선순위가 더 크면
2327
val ranTime = currentRunTime - info.last().timestamp
24-
if (ranTime != 0) info += ChartInfo(currentRunTask.pid, currentRunTime, ranTime) // To ignore if ranTime is zero
28+
if (ranTime != 0) {
29+
info += ChartInfo(currentRunTask.pid, currentRunTime, ranTime)
30+
} // To ignore if ranTime is zero
2531

2632
tasks[idx].responseTime = currentRunTime // 새로 들어온 Task 의 첫 응답 시간 설정
2733
readyPool.add(currentRunTask)
@@ -56,7 +62,9 @@ internal fun calculateTasks(tasks: List<Task>, compare: (Task, Task) -> Int, isN
5662
val newRun = readyPool.remove()
5763

5864
info += ChartInfo(newRun.pid, currentRunTime + newRun.remainedTime, newRun.remainedTime)
59-
if (newRun.responseTime == -1) { newRun.responseTime = currentRunTime }
65+
if (newRun.responseTime == -1) {
66+
newRun.responseTime = currentRunTime
67+
}
6068
currentRunTime += newRun.remainedTime
6169
newRun.remainedTime = 0
6270
newRun.waitedTime = currentRunTime - newRun.arrivalTime - newRun.executionTime
Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,42 @@
1-
//package policy
1+
package policy
2+
23
//
3-
//import utils.ProgramData
4-
//import utils.Task
4+
////private fun score(task: Task) = task.remainedTime +
5+
//private fun runTaskRoundRobin(tasks : List<Task>, quantum: Int): ProgramData {
6+
// val info: MutableList<ChartInfo> = mutableListOf(ChartInfo(-1, tasks[0].arrivalTime, 0)) // 처음에 0 표시
57
//
8+
// var currentRunTime = tasks[0].arrivalTime
9+
// val readyPool = CircularQueue<Task>(tasks.size + 1)
10+
// readyPool.add(tasks[0])
11+
// tasks[0].responseTime = 0
12+
// var nextIdx = 1
613
//
7-
//private fun score(task: Task) = task.remainedTime +
8-
//internal fun comparePRR(a: Task, b: Task): Int = compareValuesBy(a, b,
9-
// { it.remainedTime
10-
// }, { it.arrivalTime })
14+
// while (readyPool.isNotEmpty()) {
15+
// val performed: Task = readyPool.poll()
16+
// val performedTime = if (performed.remainedTime >= quantum) quantum else performed.remainedTime % quantum
17+
// if (performed.responseTime == -1) performed.responseTime = currentRunTime
1118
//
12-
//fun executeIO(tasks: List<Task>): ProgramData {
13-
// return runTaskPreemptive(tasks, ::comparePRR)//.let(::printResult)
19+
// currentRunTime += performedTime
20+
// performed.remainedTime -= performedTime
21+
//
22+
// info += ChartInfo(performed.pid, currentRunTime, performedTime) // ran at $currentRunTime
23+
//
24+
// while (nextIdx < tasks.size && currentRunTime >= tasks[nextIdx].arrivalTime) {
25+
// readyPool.add(tasks[nextIdx])
26+
// ++nextIdx
27+
// }
28+
//
29+
// if (performed.remainedTime == 0) { // Job finished
30+
// performed.waitedTime = currentRunTime - performed.arrivalTime - performed.executionTime
31+
// //println("${performed.pid}: finished,, at $currentRunTime")
32+
// } else {
33+
// readyPool.add(performed)
34+
// }
35+
// }
36+
//// println("Total Executed time : $currentRunTime")
37+
//// println("Context Switched : ${info.size - 2}")
38+
// return ProgramData(tasks, info)
39+
//}
40+
//fun executePRR(tasks: List<Task>): ProgramData {
41+
// return calculateTasks(tasks, ::comparePRR, isPreemptive = false)//.let(::printResult)
1442
//}

src/jvmMain/kotlin/policy/Priority.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import utils.Task
77
private fun comparePriority(a: Task, b: Task): Int = compareValuesBy(a, b, { it.priority }, { it.arrivalTime })
88

99
fun executePriorityNonPreemptive(tasks: List<Task>): ProgramData {
10-
return calculateTasks(tasks, ::comparePriority, isNonPreemptive = true)//.let(::printResult)
10+
return calculateTasks(tasks, ::comparePriority, isPreemptive = false)//.let(::printResult)
1111
}
1212

1313
fun executePriority(tasks: List<Task>): ProgramData {
14-
return calculateTasks(tasks, ::comparePriority, isNonPreemptive = false)//.let(::printResult)
14+
return calculateTasks(tasks, ::comparePriority, isPreemptive = true)//.let(::printResult)
1515
}

src/jvmMain/kotlin/policy/RoundRobin.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package policy
22

3-
import utils.CircularQueue
43
import utils.ChartInfo
4+
import utils.CircularQueue
55
import utils.ProgramData
66
import utils.Task
77

8-
private fun runTaskRoundRobin(tasks : List<Task>, quantum: Int): ProgramData {
8+
private fun calculateRoundRobin(tasks : List<Task>, quantum: Int): ProgramData {
99
val info: MutableList<ChartInfo> = mutableListOf(ChartInfo(-1, tasks[0].arrivalTime, 0)) // 처음에 0 표시
1010

1111
var currentRunTime = tasks[0].arrivalTime
@@ -42,5 +42,5 @@ private fun runTaskRoundRobin(tasks : List<Task>, quantum: Int): ProgramData {
4242
}
4343

4444
fun executeRoundRobin(tasks: List<Task>, quantum: Int): ProgramData {
45-
return runTaskRoundRobin(tasks, quantum)//.let(::printResult)
45+
return calculateRoundRobin(tasks, quantum)//.let(::printResult)
4646
}

src/jvmMain/kotlin/policy/SJF.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import utils.Task
66
private fun compareSJF(a: Task, b: Task): Int = compareValuesBy(a, b, { it.remainedTime }, { it.arrivalTime })
77

88
fun executeSJF(tasks: List<Task>): ProgramData {
9-
return calculateTasks(tasks, ::compareSJF, isNonPreemptive = true)
9+
return calculateTasks(tasks, ::compareSJF, isPreemptive = false)
1010
}
1111

1212
fun executeSRTF(tasks: List<Task>): ProgramData {
13-
return calculateTasks(tasks, ::compareSJF, isNonPreemptive = false)//.let(::printResult)
13+
return calculateTasks(tasks, ::compareSJF, isPreemptive = true)//.let(::printResult)
1414
}

0 commit comments

Comments
 (0)