summaryrefslogtreecommitdiff
path: root/opendc-simulator/opendc-simulator-compute/src/main/kotlin
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2022-09-01 14:38:34 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2022-10-21 22:13:04 +0200
commit44215bd668c5fa3efe2f57fc577824478b00af57 (patch)
treeb933228e5e5748716351dc9ce031b4840f254428 /opendc-simulator/opendc-simulator-compute/src/main/kotlin
parentc1f67a872e2d7ce63ac96f8ca80cbe8b25c62e3b (diff)
refactor(sim/compute): Re-implement using flow2
This change re-implements the OpenDC compute simulator framework using the new flow2 framework for modelling multi-edge flow networks. The re-implementation is written in Java and focusses on performance and clean API surface.
Diffstat (limited to 'opendc-simulator/opendc-simulator-compute/src/main/kotlin')
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimAbstractMachine.kt239
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimBareMetalMachine.kt130
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimMachine.kt59
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimMachineContext.kt60
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimMemory.kt36
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimNetworkInterface.kt51
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimProcessingUnit.kt41
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimStorageInterface.kt50
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/device/SimNetworkAdapter.kt36
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/device/SimPeripheral.kt33
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/device/SimPsu.kt114
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/SimHypervisor.kt442
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/SimHypervisorCounters.kt53
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/SimVirtualMachine.kt50
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/ConservativeScalingGovernor.kt66
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/OnDemandScalingGovernor.kt50
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/PerformanceScalingGovernor.kt36
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/PowerSaveScalingGovernor.kt36
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/ScalingGovernor.kt56
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/ScalingPolicy.kt51
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/interference/VmInterferenceDomain.kt131
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/interference/VmInterferenceMember.kt163
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/interference/VmInterferenceModel.kt191
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/interference/VmInterferenceProfile.kt51
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/MachineModel.kt54
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/MemoryUnit.kt38
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/NetworkAdapter.kt36
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/ProcessingNode.kt38
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/ProcessingUnit.kt36
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/StorageDevice.kt40
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/AsymptoticPowerModel.kt54
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/ConstantPowerModel.kt32
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/CubicPowerModel.kt41
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/InterpolationPowerModel.kt64
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/LinearPowerModel.kt42
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/MsePowerModel.kt49
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/PStatePowerDriver.kt60
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/PowerDriver.kt48
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/PowerModel.kt38
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/SimplePowerDriver.kt48
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/SqrtPowerModel.kt41
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/SquarePowerModel.kt41
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/ZeroIdlePowerDecorator.kt40
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimFlopsWorkload.kt54
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimRuntimeWorkload.kt54
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimTrace.kt218
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimTraceFragment.kt38
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimTraceWorkload.kt46
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimWorkload.kt47
-rw-r--r--opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimWorkloadLifecycle.kt82
50 files changed, 0 insertions, 3604 deletions
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimAbstractMachine.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimAbstractMachine.kt
deleted file mode 100644
index 71784567..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimAbstractMachine.kt
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute
-
-import mu.KotlinLogging
-import org.opendc.simulator.compute.device.SimNetworkAdapter
-import org.opendc.simulator.compute.device.SimPeripheral
-import org.opendc.simulator.compute.model.MachineModel
-import org.opendc.simulator.compute.model.MemoryUnit
-import org.opendc.simulator.compute.model.NetworkAdapter
-import org.opendc.simulator.compute.model.StorageDevice
-import org.opendc.simulator.compute.workload.SimWorkload
-import org.opendc.simulator.flow.FlowConsumer
-import org.opendc.simulator.flow.FlowConvergenceListener
-import org.opendc.simulator.flow.FlowEngine
-import org.opendc.simulator.flow.FlowForwarder
-import org.opendc.simulator.flow.FlowSink
-import org.opendc.simulator.flow.FlowSource
-import org.opendc.simulator.flow.batch
-
-/**
- * Abstract implementation of the [SimMachine] interface.
- *
- * @param engine The engine to manage the machine's resources.
- * @param model The model of the machine.
- */
-public abstract class SimAbstractMachine(
- protected val engine: FlowEngine,
- final override val model: MachineModel
-) : SimMachine, FlowConvergenceListener {
- /**
- * The resources allocated for this machine.
- */
- public abstract val cpus: List<SimProcessingUnit>
-
- /**
- * The memory interface of the machine.
- */
- public val memory: SimMemory = Memory(FlowSink(engine, model.memory.sumOf { it.size }.toDouble()), model.memory)
-
- /**
- * The network interfaces available to the machine.
- */
- public val net: List<SimNetworkInterface> = model.net.mapIndexed { i, adapter -> NetworkAdapterImpl(engine, adapter, i) }
-
- /**
- * The network interfaces available to the machine.
- */
- public val storage: List<SimStorageInterface> = model.storage.mapIndexed { i, device -> StorageDeviceImpl(engine, device, i) }
-
- /**
- * The peripherals of the machine.
- */
- public override val peripherals: List<SimPeripheral> = net.map { it as SimNetworkAdapter }
-
- /**
- * The current active [Context].
- */
- private var _ctx: Context? = null
-
- override fun startWorkload(workload: SimWorkload, meta: Map<String, Any>): SimMachineContext {
- check(_ctx == null) { "A machine cannot run concurrently" }
-
- val ctx = Context(workload, meta)
- ctx.start()
- return ctx
- }
-
- override fun cancel() {
- _ctx?.close()
- }
-
- override fun onConverge(now: Long) {}
-
- /**
- * The execution context in which the workload runs.
- *
- * @param workload The workload that is running on the machine.
- * @param meta The metadata passed to the workload.
- */
- private inner class Context(
- private val workload: SimWorkload,
- override val meta: Map<String, Any>
- ) : SimMachineContext {
- /**
- * A flag to indicate that the context has been closed.
- */
- private var isClosed = false
-
- val engine: FlowEngine = this@SimAbstractMachine.engine
-
- /**
- * Start this context.
- */
- fun start() {
- try {
- _ctx = this
- engine.batch { workload.onStart(this) }
- } catch (cause: Throwable) {
- logger.warn(cause) { "Workload failed during onStart callback" }
- close()
- }
- }
-
- override val cpus: List<SimProcessingUnit> = this@SimAbstractMachine.cpus
-
- override val memory: SimMemory = this@SimAbstractMachine.memory
-
- override val net: List<SimNetworkInterface> = this@SimAbstractMachine.net
-
- override val storage: List<SimStorageInterface> = this@SimAbstractMachine.storage
-
- override fun close() {
- if (isClosed) {
- return
- }
-
- isClosed = true
- assert(_ctx == this) { "Invariant violation: multiple contexts active for a single machine" }
- _ctx = null
-
- // Cancel all the resources associated with the machine
- doCancel()
-
- try {
- workload.onStop(this)
- } catch (cause: Throwable) {
- logger.warn(cause) { "Workload failed during onStop callback" }
- }
- }
-
- /**
- * Run the stop procedures for the resources associated with the machine.
- */
- private fun doCancel() {
- engine.batch {
- for (cpu in cpus) {
- cpu.cancel()
- }
-
- memory.cancel()
-
- for (ifx in net) {
- (ifx as NetworkAdapterImpl).disconnect()
- }
-
- for (storage in storage) {
- val impl = storage as StorageDeviceImpl
- impl.read.cancel()
- impl.write.cancel()
- }
- }
- }
-
- override fun toString(): String = "SimAbstractMachine.Context"
- }
-
- /**
- * The [SimMemory] implementation for a machine.
- */
- private class Memory(source: FlowSink, override val models: List<MemoryUnit>) : SimMemory, FlowConsumer by source {
- override fun toString(): String = "SimAbstractMachine.Memory"
- }
-
- /**
- * The [SimNetworkAdapter] implementation for a machine.
- */
- private class NetworkAdapterImpl(
- engine: FlowEngine,
- model: NetworkAdapter,
- index: Int
- ) : SimNetworkAdapter(), SimNetworkInterface {
- override val name: String = "eth$index"
-
- override val bandwidth: Double = model.bandwidth
-
- override val provider: FlowConsumer
- get() = _rx
-
- override fun createConsumer(): FlowSource = _tx
-
- override val tx: FlowConsumer
- get() = _tx
- private val _tx = FlowForwarder(engine)
-
- override val rx: FlowSource
- get() = _rx
- private val _rx = FlowForwarder(engine)
-
- override fun toString(): String = "SimAbstractMachine.NetworkAdapterImpl[name=$name,bandwidth=$bandwidth]"
- }
-
- /**
- * The [SimStorageInterface] implementation for a machine.
- */
- private class StorageDeviceImpl(
- engine: FlowEngine,
- model: StorageDevice,
- index: Int
- ) : SimStorageInterface {
- override val name: String = "disk$index"
-
- override val capacity: Double = model.capacity
-
- override val read: FlowConsumer = FlowSink(engine, model.readBandwidth)
-
- override val write: FlowConsumer = FlowSink(engine, model.writeBandwidth)
-
- override fun toString(): String = "SimAbstractMachine.StorageDeviceImpl[name=$name,capacity=$capacity]"
- }
-
- private companion object {
- /**
- * The logging instance associated with this class.
- */
- @JvmStatic
- private val logger = KotlinLogging.logger {}
- }
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimBareMetalMachine.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimBareMetalMachine.kt
deleted file mode 100644
index 4c824440..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimBareMetalMachine.kt
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (c) 2020 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute
-
-import org.opendc.simulator.compute.device.SimPsu
-import org.opendc.simulator.compute.model.MachineModel
-import org.opendc.simulator.compute.model.ProcessingUnit
-import org.opendc.simulator.compute.power.PowerDriver
-import org.opendc.simulator.flow.FlowConsumer
-import org.opendc.simulator.flow.FlowEngine
-import org.opendc.simulator.flow.FlowSink
-import kotlin.math.max
-
-/**
- * A simulated bare-metal machine that is able to run a single workload.
- *
- * A [SimBareMetalMachine] is a stateful object, and you should be careful when operating this object concurrently. For
- * example, the class expects only a single concurrent call to [run].
- *
- * @param engine The [FlowEngine] to drive the simulation.
- * @param model The machine model to simulate.
- * @param powerDriver The power driver to use.
- * @param psu The power supply of the machine.
- */
-public class SimBareMetalMachine(
- engine: FlowEngine,
- model: MachineModel,
- powerDriver: PowerDriver,
- public val psu: SimPsu = SimPsu(500.0, mapOf(1.0 to 1.0))
-) : SimAbstractMachine(engine, model) {
- /**
- * The current power usage of the machine (without PSU loss) in W.
- */
- public val powerUsage: Double
- get() = _powerUsage
- private var _powerUsage = 0.0
-
- /**
- * The total energy usage of the machine (without PSU loss) in Joules.
- */
- public val energyUsage: Double
- get() {
- computeEnergyUsage(engine.clock.millis())
- return _energyUsage
- }
- private var _energyUsage = 0.0
- private var _energyLastComputation = 0L
-
- /**
- * The processing units of the machine.
- */
- override val cpus: List<SimProcessingUnit> = model.cpus.map { cpu ->
- Cpu(FlowSink(engine, cpu.frequency, this@SimBareMetalMachine), cpu)
- }
-
- /**
- * The logic of the power driver.
- */
- private val powerDriverLogic = powerDriver.createLogic(this, cpus)
-
- private var _lastConverge = Long.MAX_VALUE
-
- override fun onConverge(now: Long) {
- // Update the PSU stage
- psu.update()
-
- val lastConverge = _lastConverge
- _lastConverge = now
- val duration = max(0, now - lastConverge)
- if (duration > 0) {
- // Compute the power and energy usage of the machine
- computeEnergyUsage(now)
- }
-
- _powerUsage = powerDriverLogic.computePower()
- }
-
- init {
- psu.connect(powerDriverLogic)
- _powerUsage = powerDriverLogic.computePower()
- }
-
- /**
- * Helper method to compute total energy usage.
- */
- private fun computeEnergyUsage(now: Long) {
- val duration = max(0, now - _energyLastComputation)
- _energyLastComputation = now
-
- // Compute the energy usage of the machine
- _energyUsage += _powerUsage * (duration / 1000.0)
- }
-
- /**
- * A [SimProcessingUnit] of a bare-metal machine.
- */
- private class Cpu(
- private val source: FlowSink,
- override val model: ProcessingUnit
- ) : SimProcessingUnit, FlowConsumer by source {
- override var capacity: Double
- get() = source.capacity
- set(value) {
- // Clamp the capacity of the CPU between [0.0, maxFreq]
- source.capacity = value.coerceIn(0.0, model.frequency)
- }
-
- override fun toString(): String = "SimBareMetalMachine.Cpu[model=$model]"
- }
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimMachine.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimMachine.kt
deleted file mode 100644
index 94581e89..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimMachine.kt
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2020 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute
-
-import org.opendc.simulator.compute.device.SimPeripheral
-import org.opendc.simulator.compute.model.MachineModel
-import org.opendc.simulator.compute.workload.SimWorkload
-
-/**
- * A generic machine that is able to run a [SimWorkload].
- */
-public interface SimMachine {
- /**
- * The model of the machine containing its specifications.
- */
- public val model: MachineModel
-
- /**
- * The peripherals attached to the machine.
- */
- public val peripherals: List<SimPeripheral>
-
- /**
- * Start the specified [SimWorkload] on this machine.
- *
- * @param workload The workload to start on the machine.
- * @param meta The metadata to pass to the workload.
- * @return A [SimMachineContext] that represents the execution context for the workload.
- * @throws IllegalStateException if a workload is already active on the machine or if the machine is closed.
- */
- public fun startWorkload(workload: SimWorkload, meta: Map<String, Any> = emptyMap()): SimMachineContext
-
- /**
- * Cancel the workload that is currently running on this machine.
- *
- * If no workload is active, this operation is a no-op.
- */
- public fun cancel()
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimMachineContext.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimMachineContext.kt
deleted file mode 100644
index 5e3a7766..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimMachineContext.kt
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2020 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute
-
-/**
- * A simulated execution context in which a bootable image runs. This interface represents the
- * firmware interface between the running image (e.g. operating system) and the physical or virtual firmware on
- * which the image runs.
- */
-public interface SimMachineContext : AutoCloseable {
- /**
- * The metadata associated with the context.
- */
- public val meta: Map<String, Any>
-
- /**
- * The CPUs available on the machine.
- */
- public val cpus: List<SimProcessingUnit>
-
- /**
- * The memory interface of the machine.
- */
- public val memory: SimMemory
-
- /**
- * The network interfaces available to the workload.
- */
- public val net: List<SimNetworkInterface>
-
- /**
- * The storage devices available to the workload.
- */
- public val storage: List<SimStorageInterface>
-
- /**
- * Stop the workload.
- */
- public override fun close()
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimMemory.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimMemory.kt
deleted file mode 100644
index b1aef495..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimMemory.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute
-
-import org.opendc.simulator.compute.model.MemoryUnit
-import org.opendc.simulator.flow.FlowConsumer
-
-/**
- * An interface to control the memory usage of simulated workloads.
- */
-public interface SimMemory : FlowConsumer {
- /**
- * The models representing the static information of the memory units supporting this interface.
- */
- public val models: List<MemoryUnit>
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimNetworkInterface.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimNetworkInterface.kt
deleted file mode 100644
index 660b2871..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimNetworkInterface.kt
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute
-
-import org.opendc.simulator.flow.FlowConsumer
-import org.opendc.simulator.flow.FlowSource
-
-/**
- * A firmware interface to a network adapter.
- */
-public interface SimNetworkInterface {
- /**
- * The name of the network interface.
- */
- public val name: String
-
- /**
- * The unidirectional bandwidth of the network interface in Mbps.
- */
- public val bandwidth: Double
-
- /**
- * The resource provider for the transmit channel of the network interface.
- */
- public val tx: FlowConsumer
-
- /**
- * The resource consumer for the receive channel of the network interface.
- */
- public val rx: FlowSource
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimProcessingUnit.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimProcessingUnit.kt
deleted file mode 100644
index c9f36ece..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimProcessingUnit.kt
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute
-
-import org.opendc.simulator.compute.model.ProcessingUnit
-import org.opendc.simulator.flow.FlowConsumer
-
-/**
- * A simulated processing unit.
- */
-public interface SimProcessingUnit : FlowConsumer {
- /**
- * The capacity of the processing unit, which can be adjusted by the workload if supported by the machine.
- */
- public override var capacity: Double
-
- /**
- * The model representing the static properties of the processing unit.
- */
- public val model: ProcessingUnit
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimStorageInterface.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimStorageInterface.kt
deleted file mode 100644
index 3d648671..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/SimStorageInterface.kt
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute
-
-import org.opendc.simulator.flow.FlowConsumer
-
-/**
- * A firmware interface to a storage device.
- */
-public interface SimStorageInterface {
- /**
- * The name of the storage device.
- */
- public val name: String
-
- /**
- * The capacity of the storage device in MBs.
- */
- public val capacity: Double
-
- /**
- * The resource provider for the read operations of the storage device.
- */
- public val read: FlowConsumer
-
- /**
- * The resource consumer for the write operation of the storage device.
- */
- public val write: FlowConsumer
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/device/SimNetworkAdapter.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/device/SimNetworkAdapter.kt
deleted file mode 100644
index dfb4ecf3..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/device/SimNetworkAdapter.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.device
-
-import org.opendc.simulator.compute.SimMachine
-import org.opendc.simulator.network.SimNetworkPort
-
-/**
- * A simulated network interface card (NIC or network adapter) that can be attached to a [SimMachine].
- */
-public abstract class SimNetworkAdapter : SimNetworkPort(), SimPeripheral {
- /**
- * The unidirectional bandwidth of the network adapter in Mbps.
- */
- public abstract val bandwidth: Double
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/device/SimPeripheral.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/device/SimPeripheral.kt
deleted file mode 100644
index 268271be..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/device/SimPeripheral.kt
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.device
-
-import org.opendc.simulator.compute.SimMachine
-
-/**
- * A component that can be attached to a [SimMachine].
- *
- * This interface represents the physical view of the peripheral and should be used to configure the physical properties
- * of the peripheral.
- */
-public interface SimPeripheral
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/device/SimPsu.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/device/SimPsu.kt
deleted file mode 100644
index 3d3703ae..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/device/SimPsu.kt
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.device
-
-import org.opendc.simulator.compute.power.PowerDriver
-import org.opendc.simulator.flow.FlowConnection
-import org.opendc.simulator.flow.FlowSource
-import org.opendc.simulator.power.SimPowerInlet
-import java.util.TreeMap
-
-/**
- * A power supply of a [SimBareMetalMachine].
- *
- * @param ratedOutputPower The rated output power of the PSU.
- * @param energyEfficiency The energy efficiency of the PSU for various power draws.
- */
-public class SimPsu(
- private val ratedOutputPower: Double,
- energyEfficiency: Map<Double, Double>
-) : SimPowerInlet() {
- /**
- * The power draw of the machine at this instant.
- */
- public val powerDraw: Double
- get() = _powerDraw
- private var _powerDraw = 0.0
-
- /**
- * The energy efficiency of the PSU at various power draws.
- */
- private val energyEfficiency = TreeMap(energyEfficiency)
-
- /**
- * The consumer context.
- */
- private var _ctx: FlowConnection? = null
-
- /**
- * The driver that is connected to the PSU.
- */
- private var _driver: PowerDriver.Logic? = null
-
- init {
- require(energyEfficiency.isNotEmpty()) { "Must specify at least one entry for energy efficiency of PSU" }
- }
-
- /**
- * Update the power draw of the PSU.
- */
- public fun update() {
- _ctx?.pull()
- }
-
- /**
- * Connect the specified [PowerDriver.Logic] to this PSU.
- */
- public fun connect(driver: PowerDriver.Logic) {
- check(_driver == null) { "PSU already connected" }
- _driver = driver
- update()
- }
-
- override fun createSource(): FlowSource = object : FlowSource {
- override fun onStart(conn: FlowConnection, now: Long) {
- _ctx = conn
- conn.shouldSourceConverge = true
- }
-
- override fun onStop(conn: FlowConnection, now: Long) {
- _ctx = null
- }
-
- override fun onPull(conn: FlowConnection, now: Long): Long {
- val powerDraw = computePowerDraw(_driver?.computePower() ?: 0.0)
- conn.push(powerDraw)
- return Long.MAX_VALUE
- }
-
- override fun onConverge(conn: FlowConnection, now: Long) {
- _powerDraw = conn.rate
- }
- }
-
- /**
- * Compute the power draw of the PSU including the power loss.
- */
- private fun computePowerDraw(load: Double): Double {
- val loadPercentage = (load / ratedOutputPower).coerceIn(0.0, 1.0)
- val efficiency = energyEfficiency.ceilingEntry(loadPercentage)?.value ?: 1.0
- return load / efficiency
- }
-
- override fun toString(): String = "SimPsu[draw=$_powerDraw]"
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/SimHypervisor.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/SimHypervisor.kt
deleted file mode 100644
index e1486d71..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/SimHypervisor.kt
+++ /dev/null
@@ -1,442 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.kernel
-
-import org.opendc.simulator.compute.SimAbstractMachine
-import org.opendc.simulator.compute.SimMachine
-import org.opendc.simulator.compute.SimMachineContext
-import org.opendc.simulator.compute.SimProcessingUnit
-import org.opendc.simulator.compute.kernel.cpufreq.ScalingGovernor
-import org.opendc.simulator.compute.kernel.cpufreq.ScalingPolicy
-import org.opendc.simulator.compute.kernel.interference.VmInterferenceDomain
-import org.opendc.simulator.compute.kernel.interference.VmInterferenceMember
-import org.opendc.simulator.compute.kernel.interference.VmInterferenceProfile
-import org.opendc.simulator.compute.model.MachineModel
-import org.opendc.simulator.compute.model.ProcessingUnit
-import org.opendc.simulator.compute.workload.SimWorkload
-import org.opendc.simulator.flow.FlowConsumer
-import org.opendc.simulator.flow.FlowConvergenceListener
-import org.opendc.simulator.flow.FlowEngine
-import org.opendc.simulator.flow.mux.FlowMultiplexer
-import org.opendc.simulator.flow.mux.FlowMultiplexerFactory
-import java.util.SplittableRandom
-import kotlin.math.roundToLong
-
-/**
- * A SimHypervisor facilitates the execution of multiple concurrent [SimWorkload]s, while acting as a single workload
- * to another [SimMachine].
- *
- * @param engine The [FlowEngine] to drive the simulation.
- * @param muxFactory The factor for the [FlowMultiplexer] to multiplex the workloads.
- * @param random A randomness generator for the interference calculations.
- * @param scalingGovernor The scaling governor to use for scaling the CPU frequency of the underlying hardware.
- * @param interferenceDomain The interference domain to which the hypervisor belongs.
- */
-public class SimHypervisor(
- private val engine: FlowEngine,
- muxFactory: FlowMultiplexerFactory,
- private val random: SplittableRandom,
- private val scalingGovernor: ScalingGovernor? = null,
- private val interferenceDomain: VmInterferenceDomain = VmInterferenceDomain()
-) : SimWorkload, FlowConvergenceListener {
- /**
- * The [FlowMultiplexer] to multiplex the virtual machines.
- */
- private val mux = muxFactory.newMultiplexer(engine, this)
-
- /**
- * The virtual machines running on this hypervisor.
- */
- private val _vms = mutableSetOf<VirtualMachine>()
- public val vms: Set<SimMachine>
- get() = _vms
-
- /**
- * The resource counters associated with the hypervisor.
- */
- public val counters: SimHypervisorCounters
- get() = _counters
- private val _counters = CountersImpl(this)
-
- /**
- * The CPU capacity of the hypervisor in MHz.
- */
- public val cpuCapacity: Double
- get() = mux.capacity
-
- /**
- * The CPU demand of the hypervisor in MHz.
- */
- public val cpuDemand: Double
- get() = mux.demand
-
- /**
- * The CPU usage of the hypervisor in MHz.
- */
- public val cpuUsage: Double
- get() = mux.rate
-
- /**
- * The machine on which the hypervisor runs.
- */
- private lateinit var context: SimMachineContext
-
- /**
- * The scaling governors attached to the physical CPUs backing this hypervisor.
- */
- private val governors = mutableListOf<ScalingGovernor.Logic>()
-
- /* SimHypervisor */
- /**
- * Create a [SimMachine] instance on which users may run a [SimWorkload].
- *
- * @param model The machine to create.
- */
- public fun newMachine(model: MachineModel): SimVirtualMachine {
- require(canFit(model)) { "Machine does not fit" }
- val vm = VirtualMachine(model)
- _vms.add(vm)
- return vm
- }
-
- /**
- * Remove the specified [machine] from the hypervisor.
- *
- * @param machine The machine to remove.
- */
- public fun removeMachine(machine: SimVirtualMachine) {
- if (_vms.remove(machine)) {
- // This cast must always succeed, since `_vms` only contains `VirtualMachine` types.
- (machine as VirtualMachine).close()
- }
- }
-
- /**
- * Determine whether the specified machine characterized by [model] can fit on this hypervisor at this moment.
- */
- public fun canFit(model: MachineModel): Boolean {
- return (mux.maxInputs - mux.inputs.size) >= model.cpus.size
- }
-
- /* SimWorkload */
- override fun onStart(ctx: SimMachineContext) {
- context = ctx
-
- _cpuCount = ctx.cpus.size
- _cpuCapacity = ctx.cpus.sumOf { it.model.frequency }
- _counters.d = _cpuCount / _cpuCapacity * 1000L
-
- // Clear the existing outputs of the multiplexer
- mux.clearOutputs()
-
- for (cpu in ctx.cpus) {
- val governor = scalingGovernor?.createLogic(ScalingPolicyImpl(cpu))
- if (governor != null) {
- governors.add(governor)
- governor.onStart()
- }
-
- cpu.startConsumer(mux.newOutput())
- }
- }
-
- override fun onStop(ctx: SimMachineContext) {}
-
- private var _cpuCount = 0
- private var _cpuCapacity = 0.0
- private var _lastConverge = engine.clock.millis()
-
- /* FlowConvergenceListener */
- override fun onConverge(now: Long) {
- val lastConverge = _lastConverge
- _lastConverge = now
- val delta = now - lastConverge
-
- if (delta > 0) {
- _counters.record()
-
- val mux = mux
- val load = mux.rate / mux.capacity.coerceAtLeast(1.0)
- val random = random
-
- for (vm in _vms) {
- vm._counters.record(random, load)
- }
- }
-
- val load = cpuDemand / cpuCapacity
- for (governor in governors) {
- governor.onLimit(load)
- }
- }
-
- /**
- * A virtual machine running on the hypervisor.
- *
- * @param model The machine model of the virtual machine.
- */
- private inner class VirtualMachine(model: MachineModel) : SimAbstractMachine(engine, model), SimVirtualMachine, AutoCloseable {
- /**
- * A flag to indicate that the machine is closed.
- */
- private var isClosed = false
-
- /**
- * The vCPUs of the machine.
- */
- override val cpus = model.cpus.map { cpu -> VCpu(mux, mux.newInput(cpu.frequency), cpu) }
-
- /**
- * The resource counters associated with the hypervisor.
- */
- override val counters: SimHypervisorCounters
- get() = _counters
-
- @JvmField val _counters = VmCountersImpl(cpus, null)
-
- /**
- * The CPU capacity of the hypervisor in MHz.
- */
- override val cpuCapacity: Double
- get() = cpus.sumOf(FlowConsumer::capacity)
-
- /**
- * The CPU demand of the hypervisor in MHz.
- */
- override val cpuDemand: Double
- get() = cpus.sumOf(FlowConsumer::demand)
-
- /**
- * The CPU usage of the hypervisor in MHz.
- */
- override val cpuUsage: Double
- get() = cpus.sumOf(FlowConsumer::rate)
-
- override fun startWorkload(workload: SimWorkload, meta: Map<String, Any>): SimMachineContext {
- check(!isClosed) { "Machine is closed" }
-
- val profile = meta["interference-profile"] as? VmInterferenceProfile
- val interferenceMember = if (profile != null) interferenceDomain.join(profile) else null
-
- val counters = _counters
- counters.member = interferenceMember
-
- return super.startWorkload(
- object : SimWorkload {
- override fun onStart(ctx: SimMachineContext) {
- try {
- interferenceMember?.activate()
- workload.onStart(ctx)
- } catch (cause: Throwable) {
- interferenceMember?.deactivate()
- throw cause
- }
- }
-
- override fun onStop(ctx: SimMachineContext) {
- interferenceMember?.deactivate()
- counters.member = null
- workload.onStop(ctx)
- }
- },
- meta
- )
- }
-
- override fun close() {
- if (isClosed) {
- return
- }
-
- isClosed = true
- cancel()
-
- for (cpu in cpus) {
- cpu.close()
- }
- }
- }
-
- /**
- * A [SimProcessingUnit] of a virtual machine.
- */
- private class VCpu(
- private val switch: FlowMultiplexer,
- private val source: FlowConsumer,
- override val model: ProcessingUnit
- ) : SimProcessingUnit, FlowConsumer by source {
- override var capacity: Double
- get() = source.capacity
- set(_) = TODO("Capacity changes on vCPU not supported")
-
- override fun toString(): String = "SimAbstractHypervisor.VCpu[model=$model]"
-
- /**
- * Close the CPU
- */
- fun close() {
- switch.removeInput(source)
- }
-
- fun flush() {
- switch.flushCounters(source)
- }
- }
-
- /**
- * A [ScalingPolicy] for a physical CPU of the hypervisor.
- */
- private class ScalingPolicyImpl(override val cpu: SimProcessingUnit) : ScalingPolicy {
- override var target: Double
- get() = cpu.capacity
- set(value) {
- cpu.capacity = value
- }
-
- override val max: Double = cpu.model.frequency
-
- override val min: Double = 0.0
- }
-
- /**
- * Implementation of [SimHypervisorCounters].
- */
- private class CountersImpl(private val hv: SimHypervisor) : SimHypervisorCounters {
- @JvmField var d = 1.0 // Number of CPUs divided by total CPU capacity
-
- override val cpuActiveTime: Long
- get() = _cpuTime[0]
- override val cpuIdleTime: Long
- get() = _cpuTime[1]
- override val cpuStealTime: Long
- get() = _cpuTime[2]
- override val cpuLostTime: Long
- get() = _cpuTime[3]
-
- val _cpuTime = LongArray(4)
- private val _previous = DoubleArray(3)
-
- /**
- * Record the CPU time of the hypervisor.
- */
- fun record() {
- val cpuTime = _cpuTime
- val previous = _previous
- val counters = hv.mux.counters
-
- val demand = counters.demand
- val actual = counters.actual
- val remaining = counters.remaining
-
- val demandDelta = demand - previous[0]
- val actualDelta = actual - previous[1]
- val remainingDelta = remaining - previous[2]
-
- previous[0] = demand
- previous[1] = actual
- previous[2] = remaining
-
- cpuTime[0] += (actualDelta * d).roundToLong()
- cpuTime[1] += (remainingDelta * d).roundToLong()
- cpuTime[2] += ((demandDelta - actualDelta) * d).roundToLong()
- }
-
- override fun flush() {
- hv.mux.flushCounters()
- record()
- }
- }
-
- /**
- * A [SimHypervisorCounters] implementation for a virtual machine.
- */
- private inner class VmCountersImpl(
- private val cpus: List<VCpu>,
- @JvmField var member: VmInterferenceMember?
- ) : SimHypervisorCounters {
- private val d = cpus.size / cpus.sumOf { it.model.frequency } * 1000
-
- override val cpuActiveTime: Long
- get() = _cpuTime[0]
- override val cpuIdleTime: Long
- get() = _cpuTime[1]
- override val cpuStealTime: Long
- get() = _cpuTime[2]
- override val cpuLostTime: Long
- get() = _cpuTime[3]
-
- private val _cpuTime = LongArray(4)
- private val _previous = DoubleArray(3)
-
- /**
- * Record the CPU time of the hypervisor.
- */
- fun record(random: SplittableRandom, load: Double) {
- val cpuTime = _cpuTime
- val previous = _previous
-
- var demand = 0.0
- var actual = 0.0
- var remaining = 0.0
-
- for (cpu in cpus) {
- val counters = cpu.counters
-
- actual += counters.actual
- demand += counters.demand
- remaining += counters.remaining
- }
-
- val demandDelta = demand - previous[0]
- val actualDelta = actual - previous[1]
- val remainingDelta = remaining - previous[2]
-
- previous[0] = demand
- previous[1] = actual
- previous[2] = remaining
-
- val d = d
- cpuTime[0] += (actualDelta * d).roundToLong()
- cpuTime[1] += (remainingDelta * d).roundToLong()
- cpuTime[2] += ((demandDelta - actualDelta) * d).roundToLong()
-
- // Compute the performance penalty due to flow interference
- val member = member
- if (member != null) {
- val penalty = 1 - member.apply(random, load)
- val interference = (actualDelta * d * penalty).roundToLong()
-
- if (interference > 0) {
- cpuTime[3] += interference
- _counters._cpuTime[3] += interference
- }
- }
- }
-
- override fun flush() {
- for (cpu in cpus) {
- cpu.flush()
- }
- }
- }
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/SimHypervisorCounters.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/SimHypervisorCounters.kt
deleted file mode 100644
index 63fee507..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/SimHypervisorCounters.kt
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.kernel
-
-/**
- * Performance counters of a [SimHypervisor].
- */
-public interface SimHypervisorCounters {
- /**
- * The amount of time (in milliseconds) the CPUs of the hypervisor were actively running.
- */
- public val cpuActiveTime: Long
-
- /**
- * The amount of time (in milliseconds) the CPUs of the hypervisor were idle.
- */
- public val cpuIdleTime: Long
-
- /**
- * The amount of CPU time (in milliseconds) that virtual machines were ready to run, but were not able to.
- */
- public val cpuStealTime: Long
-
- /**
- * The amount of CPU time (in milliseconds) that was lost due to interference between virtual machines.
- */
- public val cpuLostTime: Long
-
- /**
- * Flush the counter values.
- */
- public fun flush()
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/SimVirtualMachine.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/SimVirtualMachine.kt
deleted file mode 100644
index 36219ef2..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/SimVirtualMachine.kt
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.kernel
-
-import org.opendc.simulator.compute.SimMachine
-
-/**
- * A virtual [SimMachine] running on top of another [SimMachine].
- */
-public interface SimVirtualMachine : SimMachine {
- /**
- * The resource counters associated with the virtual machine.
- */
- public val counters: SimHypervisorCounters
-
- /**
- * The CPU usage of the VM in MHz.
- */
- public val cpuUsage: Double
-
- /**
- * The CPU usage of the VM in MHz.
- */
- public val cpuDemand: Double
-
- /**
- * The CPU capacity of the VM in MHz.
- */
- public val cpuCapacity: Double
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/ConservativeScalingGovernor.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/ConservativeScalingGovernor.kt
deleted file mode 100644
index 1a03221d..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/ConservativeScalingGovernor.kt
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.kernel.cpufreq
-
-/**
- * A CPUFreq [ScalingGovernor] that models the conservative scaling governor in the Linux kernel.
- */
-public class ConservativeScalingGovernor(public val threshold: Double = 0.8, private val stepSize: Double = -1.0) :
- ScalingGovernor {
- override fun createLogic(policy: ScalingPolicy): ScalingGovernor.Logic = object : ScalingGovernor.Logic {
- /**
- * The step size to use.
- */
- private val stepSize = if (this@ConservativeScalingGovernor.stepSize < 0) {
- // https://github.com/torvalds/linux/blob/master/drivers/cpufreq/cpufreq_conservative.c#L33
- policy.max * 0.05
- } else {
- this@ConservativeScalingGovernor.stepSize.coerceAtMost(policy.max)
- }
-
- /**
- * The previous load of the CPU.
- */
- private var previousLoad = threshold
-
- override fun onStart() {
- policy.target = policy.min
- }
-
- override fun onLimit(load: Double) {
- val currentTarget = policy.target
- if (load > threshold) {
- // Check for load increase (see: https://github.com/torvalds/linux/blob/master/drivers/cpufreq/cpufreq_conservative.c#L102)
- val step = when {
- load > previousLoad -> stepSize
- load < previousLoad -> -stepSize
- else -> 0.0
- }
- policy.target = (currentTarget + step).coerceIn(policy.min, policy.max)
- }
- previousLoad = load
- }
- }
-
- override fun toString(): String = "ConservativeScalingGovernor[threshold=$threshold,stepSize=$stepSize]"
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/OnDemandScalingGovernor.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/OnDemandScalingGovernor.kt
deleted file mode 100644
index aef15ce9..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/OnDemandScalingGovernor.kt
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.kernel.cpufreq
-
-/**
- * A CPUFreq [ScalingGovernor] that models the on-demand scaling governor in the Linux kernel.
- */
-public class OnDemandScalingGovernor(public val threshold: Double = 0.8) : ScalingGovernor {
- override fun createLogic(policy: ScalingPolicy): ScalingGovernor.Logic = object : ScalingGovernor.Logic {
- /**
- * The multiplier used for the linear frequency scaling.
- */
- private val multiplier = (policy.max - policy.min) / 100
-
- override fun onStart() {
- policy.target = policy.min
- }
-
- override fun onLimit(load: Double) {
- policy.target = if (load < threshold) {
- /* Proportional scaling (see: https://github.com/torvalds/linux/blob/master/drivers/cpufreq/cpufreq_ondemand.c#L151). */
- policy.min + load * multiplier
- } else {
- policy.max
- }
- }
- }
-
- override fun toString(): String = "OnDemandScalingGovernor[threshold=$threshold]"
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/PerformanceScalingGovernor.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/PerformanceScalingGovernor.kt
deleted file mode 100644
index 13109a9a..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/PerformanceScalingGovernor.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.kernel.cpufreq
-
-/**
- * A CPUFreq [ScalingGovernor] that causes the highest possible frequency to be requested from the resource.
- */
-public class PerformanceScalingGovernor : ScalingGovernor {
- override fun createLogic(policy: ScalingPolicy): ScalingGovernor.Logic = object : ScalingGovernor.Logic {
- override fun onStart() {
- policy.target = policy.max
- }
- }
-
- override fun toString(): String = "PerformanceScalingGovernor"
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/PowerSaveScalingGovernor.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/PowerSaveScalingGovernor.kt
deleted file mode 100644
index 32c0703a..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/PowerSaveScalingGovernor.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.kernel.cpufreq
-
-/**
- * A CPUFreq [ScalingGovernor] that causes the lowest possible frequency to be requested from the resource.
- */
-public class PowerSaveScalingGovernor : ScalingGovernor {
- override fun createLogic(policy: ScalingPolicy): ScalingGovernor.Logic = object : ScalingGovernor.Logic {
- override fun onStart() {
- policy.target = policy.min
- }
- }
-
- override fun toString(): String = "PowerSaveScalingGovernor"
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/ScalingGovernor.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/ScalingGovernor.kt
deleted file mode 100644
index d33827db..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/ScalingGovernor.kt
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.kernel.cpufreq
-
-/**
- * A [ScalingGovernor] in the CPUFreq subsystem of OpenDC is responsible for scaling the frequency of simulated CPUs
- * independent of the particular implementation of the CPU.
- *
- * Each of the scaling governors implements a single, possibly parametrized, performance scaling algorithm.
- *
- * For more information, see the documentation of the Linux CPUFreq subsystem:
- * https://www.kernel.org/doc/html/latest/admin-guide/pm/cpufreq.html
- */
-public interface ScalingGovernor {
- /**
- * Create the scaling logic for the specified [policy]
- */
- public fun createLogic(policy: ScalingPolicy): Logic
-
- /**
- * The logic of the scaling governor.
- */
- public interface Logic {
- /**
- * This method is invoked when the governor is started.
- */
- public fun onStart() {}
-
- /**
- * This method is invoked when the governor should re-decide the frequency limits.
- *
- * @param load The load of the system.
- */
- public fun onLimit(load: Double) {}
- }
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/ScalingPolicy.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/ScalingPolicy.kt
deleted file mode 100644
index f9351896..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/cpufreq/ScalingPolicy.kt
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.kernel.cpufreq
-
-import org.opendc.simulator.compute.SimProcessingUnit
-
-/**
- * An interface that holds the state managed by a [ScalingGovernor] and used by the underlying machine to control the
- * CPU frequencies.
- */
-public interface ScalingPolicy {
- /**
- * The processing unit that is associated with this policy.
- */
- public val cpu: SimProcessingUnit
-
- /**
- * The target frequency which the CPU should attempt to attain.
- */
- public var target: Double
-
- /**
- * The minimum frequency to which the CPU may scale.
- */
- public val min: Double
-
- /**
- * The maximum frequency to which the CPU may scale.
- */
- public val max: Double
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/interference/VmInterferenceDomain.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/interference/VmInterferenceDomain.kt
deleted file mode 100644
index 6861823b..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/interference/VmInterferenceDomain.kt
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (c) 2022 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.kernel.interference
-
-import java.util.ArrayDeque
-import java.util.ArrayList
-import java.util.WeakHashMap
-
-/**
- * A domain where virtual machines may incur performance variability due to operating on the same resource and
- * therefore causing interference.
- */
-public class VmInterferenceDomain {
- /**
- * A cache to maintain a mapping between the active profiles in this domain.
- */
- private val cache = WeakHashMap<VmInterferenceProfile, VmInterferenceMember>()
-
- /**
- * The set of members active in this domain.
- */
- private val activeKeys = ArrayList<VmInterferenceMember>()
-
- /**
- * Queue of participants that will be removed or added to the active groups.
- */
- private val participants = ArrayDeque<VmInterferenceMember>()
-
- /**
- * Join this interference domain with the specified [profile] and return the [VmInterferenceMember] associated with
- * the profile. If the member does not exist, it will be created.
- */
- public fun join(profile: VmInterferenceProfile): VmInterferenceMember {
- return cache.computeIfAbsent(profile) { key -> key.newMember(this) }
- }
-
- /**
- * Mark the specified [member] as active in this interference domain.
- */
- internal fun activate(member: VmInterferenceMember) {
- val activeKeys = activeKeys
- val pos = activeKeys.binarySearch(member)
- if (pos < 0) {
- activeKeys.add(-pos - 1, member)
- }
-
- computeActiveGroups(activeKeys, member)
- }
-
- /**
- * Mark the specified [member] as inactive in this interference domain.
- */
- internal fun deactivate(member: VmInterferenceMember) {
- val activeKeys = activeKeys
- activeKeys.remove(member)
- computeActiveGroups(activeKeys, member)
- }
-
- /**
- * (Re-)compute the active groups.
- */
- private fun computeActiveGroups(activeKeys: ArrayList<VmInterferenceMember>, member: VmInterferenceMember) {
- if (activeKeys.isEmpty()) {
- return
- }
-
- val groups = member.membership
- val members = member.members
- val participants = participants
-
- for (group in groups) {
- val groupMembers = members[group]
-
- var i = 0
- var j = 0
- var intersection = 0
-
- // Compute the intersection of the group members and the current active members
- while (i < groupMembers.size && j < activeKeys.size) {
- val l = groupMembers[i]
- val rightEntry = activeKeys[j]
- val r = rightEntry.id
-
- if (l < r) {
- i++
- } else if (l > r) {
- j++
- } else {
- if (++intersection > 1) {
- rightEntry.addGroup(group)
- } else {
- participants.add(rightEntry)
- }
-
- i++
- j++
- }
- }
-
- while (true) {
- val participant = participants.poll() ?: break
-
- if (intersection <= 1) {
- participant.removeGroup(group)
- } else {
- participant.addGroup(group)
- }
- }
- }
- }
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/interference/VmInterferenceMember.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/interference/VmInterferenceMember.kt
deleted file mode 100644
index 4b56a058..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/interference/VmInterferenceMember.kt
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright (c) 2022 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.kernel.interference
-
-import java.util.SplittableRandom
-
-/**
- * A participant of an interference domain.
- */
-public class VmInterferenceMember(
- private val domain: VmInterferenceDomain,
- private val model: VmInterferenceModel,
- @JvmField internal val id: Int,
- @JvmField internal val membership: IntArray,
- @JvmField internal val members: Array<IntArray>,
- private val targets: DoubleArray,
- private val scores: DoubleArray
-) : Comparable<VmInterferenceMember> {
- /**
- * The active groups to which the key belongs.
- */
- private var groups: IntArray = IntArray(2)
- private var groupsSize: Int = 0
-
- /**
- * The number of users of the interference key.
- */
- private var refCount: Int = 0
-
- /**
- * Mark this member as active in this interference domain.
- */
- public fun activate() {
- if (refCount++ <= 0) {
- domain.activate(this)
- }
- }
-
- /**
- * Mark this member as inactive in this interference domain.
- */
- public fun deactivate() {
- if (--refCount <= 0) {
- domain.deactivate(this)
- }
- }
-
- /**
- * Compute the performance score of the member in this interference domain.
- *
- * @param random The source of randomness to apply when computing the performance score.
- * @param load The overall load on the interference domain.
- * @return A score representing the performance score to be applied to the member, with 1
- * meaning no influence, <1 means that performance degrades, and >1 means that performance improves.
- */
- public fun apply(random: SplittableRandom, load: Double): Double {
- val groupsSize = groupsSize
-
- if (groupsSize == 0) {
- return 1.0
- }
-
- val groups = groups
- val targets = targets
-
- var low = 0
- var high = groupsSize - 1
- var group = -1
-
- // Perform binary search over the groups based on target load
- while (low <= high) {
- val mid = low + high ushr 1
- val midGroup = groups[mid]
- val target = targets[midGroup]
-
- if (target < load) {
- low = mid + 1
- group = midGroup
- } else if (target > load) {
- high = mid - 1
- } else {
- group = midGroup
- break
- }
- }
-
- return if (group >= 0 && random.nextInt(members[group].size) == 0) {
- scores[group]
- } else {
- 1.0
- }
- }
-
- /**
- * Add an active group to this member.
- */
- internal fun addGroup(group: Int) {
- var groups = groups
- val groupsSize = groupsSize
- val pos = groups.binarySearch(group, toIndex = groupsSize)
-
- if (pos >= 0) {
- return
- }
-
- val idx = -pos - 1
-
- if (groups.size == groupsSize) {
- val newSize = groupsSize + (groupsSize shr 1)
- groups = groups.copyOf(newSize)
- this.groups = groups
- }
-
- groups.copyInto(groups, idx + 1, idx, groupsSize)
- groups[idx] = group
- this.groupsSize += 1
- }
-
- /**
- * Remove an active group from this member.
- */
- internal fun removeGroup(group: Int) {
- val groups = groups
- val groupsSize = groupsSize
- val pos = groups.binarySearch(group, toIndex = groupsSize)
-
- if (pos < 0) {
- return
- }
-
- groups.copyInto(groups, pos, pos + 1, groupsSize)
- this.groupsSize -= 1
- }
-
- override fun compareTo(other: VmInterferenceMember): Int {
- val cmp = model.hashCode().compareTo(other.model.hashCode())
- if (cmp != 0) {
- return cmp
- }
-
- return id.compareTo(other.id)
- }
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/interference/VmInterferenceModel.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/interference/VmInterferenceModel.kt
deleted file mode 100644
index 238bffc0..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/interference/VmInterferenceModel.kt
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.kernel.interference
-
-import java.util.TreeMap
-import java.util.TreeSet
-
-/**
- * An interference model that models the resource interference between virtual machines on a host.
- *
- * @param members The target load of each group.
- * @param scores The performance score of each group.
- * @param members The members belonging to each group.
- * @param membership The identifier of each key.
- * @param size The number of groups.
- */
-public class VmInterferenceModel private constructor(
- private val idMapping: Map<String, Int>,
- private val members: Array<IntArray>,
- private val membership: Array<IntArray>,
- private val targets: DoubleArray,
- private val scores: DoubleArray,
- private val size: Int
-) {
- /**
- * Return the [VmInterferenceProfile] associated with the specified [id].
- *
- * @param id The identifier of the virtual machine.
- * @return A [VmInterferenceProfile] representing the virtual machine as part of interference model or `null` if
- * there is no profile for the virtual machine.
- */
- public fun getProfile(id: String): VmInterferenceProfile? {
- val intId = idMapping[id] ?: return null
- return VmInterferenceProfile(this, intId, membership[intId], members, targets, scores)
- }
-
- public companion object {
- /**
- * Construct a [Builder] instance.
- */
- @JvmStatic
- public fun builder(): Builder = Builder()
- }
-
- /**
- * Builder class for a [VmInterferenceModel]
- */
- public class Builder internal constructor() {
- /**
- * The target load of each group.
- */
- private var _targets = DoubleArray(INITIAL_CAPACITY) { Double.POSITIVE_INFINITY }
-
- /**
- * The performance score of each group.
- */
- private var _scores = DoubleArray(INITIAL_CAPACITY) { Double.POSITIVE_INFINITY }
-
- /**
- * The members of each group.
- */
- private var _members = ArrayList<Set<String>>(INITIAL_CAPACITY)
-
- /**
- * The mapping from member to group id.
- */
- private val ids = TreeSet<String>()
-
- /**
- * The number of groups in the model.
- */
- private var size = 0
-
- /**
- * Add the specified group to the model.
- */
- public fun addGroup(members: Set<String>, targetLoad: Double, score: Double): Builder {
- val size = size
-
- if (size == _targets.size) {
- grow()
- }
-
- _targets[size] = targetLoad
- _scores[size] = score
- _members.add(members)
- ids.addAll(members)
-
- this.size++
-
- return this
- }
-
- /**
- * Build the [VmInterferenceModel].
- */
- public fun build(): VmInterferenceModel {
- val size = size
- val targets = _targets
- val scores = _scores
- val members = _members
-
- val indices = IntArray(size) { it }
- indices.sortedWith(
- Comparator { l, r ->
- var cmp = targets[l].compareTo(targets[r]) // Order by target load
- if (cmp != 0) {
- return@Comparator cmp
- }
-
- cmp = scores[l].compareTo(scores[r]) // Higher penalty first (this means lower performance score first)
- if (cmp != 0) {
- cmp
- } else {
- l.compareTo(r)
- }
- }
- )
-
- val newTargets = DoubleArray(size)
- val newScores = DoubleArray(size)
- val newMembers = arrayOfNulls<IntArray>(size)
-
- var nextId = 0
- val idMapping = ids.associateWith { nextId++ }
- val membership = ids.associateWithTo(TreeMap()) { ArrayList<Int>() }
-
- for ((group, j) in indices.withIndex()) {
- newTargets[group] = targets[j]
- newScores[group] = scores[j]
- val groupMembers = members[j]
- val newGroupMembers = groupMembers.map { idMapping.getValue(it) }.toIntArray()
-
- newGroupMembers.sort()
- newMembers[group] = newGroupMembers
-
- for (member in groupMembers) {
- membership.getValue(member).add(group)
- }
- }
-
- @Suppress("UNCHECKED_CAST")
- return VmInterferenceModel(
- idMapping,
- newMembers as Array<IntArray>,
- membership.map { it.value.toIntArray() }.toTypedArray(),
- newTargets,
- newScores,
- size
- )
- }
-
- /**
- * Helper function to grow the capacity of the internal arrays.
- */
- private fun grow() {
- val oldSize = _targets.size
- val newSize = oldSize + (oldSize shr 1)
-
- _targets = _targets.copyOf(newSize)
- _scores = _scores.copyOf(newSize)
- }
-
- private companion object {
- /**
- * The initial capacity of the builder.
- */
- const val INITIAL_CAPACITY = 256
- }
- }
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/interference/VmInterferenceProfile.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/interference/VmInterferenceProfile.kt
deleted file mode 100644
index 004dbd07..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/kernel/interference/VmInterferenceProfile.kt
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2022 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.kernel.interference
-
-/**
- * A profile of a particular virtual machine describing its interference pattern with other virtual machines.
- *
- * @param model The model to which this profile belongs.
- * @property id The identifier of the profile inside the model.
- * @property membership The membership of the profile in the groups.
- * @param members The members in the model.
- * @param targets The targets in the model.
- * @param scores The scores in the model.
- */
-public class VmInterferenceProfile internal constructor(
- private val model: VmInterferenceModel,
- private val id: Int,
- private val membership: IntArray,
- private val members: Array<IntArray>,
- private val targets: DoubleArray,
- private val scores: DoubleArray
-) {
- /**
- * Create a new [VmInterferenceMember] based on this profile for the specified [domain].
- */
- internal fun newMember(domain: VmInterferenceDomain): VmInterferenceMember {
- return VmInterferenceMember(domain, model, id, membership, members, targets, scores)
- }
-
- override fun toString(): String = "VmInterferenceProfile[id=$id]"
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/MachineModel.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/MachineModel.kt
deleted file mode 100644
index 22dcaef4..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/MachineModel.kt
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.model
-
-/**
- * A description of the physical or virtual machine on which a bootable image runs.
- *
- * @property cpus The list of processing units available to the image.
- * @property memory The list of memory units available to the image.
- * @property net A list of network adapters available to the machine.
- * @property storage A list of storage devices available to the machine.
- */
-public data class MachineModel(
- public val cpus: List<ProcessingUnit>,
- public val memory: List<MemoryUnit>,
- public val net: List<NetworkAdapter> = emptyList(),
- public val storage: List<StorageDevice> = emptyList()
-) {
- /**
- * Optimize the [MachineModel] by merging all resources of the same type into a single resource with the combined
- * capacity. Such configurations can be simulated more efficiently by OpenDC.
- */
- public fun optimize(): MachineModel {
- val originalCpu = cpus[0]
- val freq = cpus.sumOf { it.frequency }
- val processingNode = originalCpu.node.copy(coreCount = 1)
- val processingUnits = listOf(originalCpu.copy(frequency = freq, node = processingNode))
-
- val memorySize = memory.sumOf { it.size }
- val memoryUnits = listOf(MemoryUnit("Generic", "Generic", 3200.0, memorySize))
-
- return MachineModel(processingUnits, memoryUnits)
- }
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/MemoryUnit.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/MemoryUnit.kt
deleted file mode 100644
index bcbde5b1..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/MemoryUnit.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2020 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.model
-
-/**
- * A memory unit of a compute resource, either virtual or physical.
- *
- * @property vendor The vendor string of the memory.
- * @property modelName The name of the memory model.
- * @property speed The access speed of the memory in MHz.
- * @property size The size of the memory unit in MBs.
- */
-public data class MemoryUnit(
- public val vendor: String,
- public val modelName: String,
- public val speed: Double,
- public val size: Long
-)
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/NetworkAdapter.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/NetworkAdapter.kt
deleted file mode 100644
index 46472144..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/NetworkAdapter.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.model
-
-/**
- * A description of a network adapter that is
- *
- * @property vendor The vendor of the network adapter.
- * @property modelName The model name of the network adapter.
- * @property bandwidth The bandwidth of the network adapter in Mbps.
- */
-public data class NetworkAdapter(
- public val vendor: String,
- public val modelName: String,
- public val bandwidth: Double
-)
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/ProcessingNode.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/ProcessingNode.kt
deleted file mode 100644
index 58ed816c..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/ProcessingNode.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2020 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.model
-
-/**
- * A processing node/package/socket containing possibly several CPU cores.
- *
- * @property vendor The vendor string of the processor node.
- * @property modelName The name of the processor node.
- * @property arch The micro-architecture of the processor node.
- * @property coreCount The number of logical CPUs in the processor node.
- */
-public data class ProcessingNode(
- public val vendor: String,
- public val arch: String,
- public val modelName: String,
- public val coreCount: Int
-)
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/ProcessingUnit.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/ProcessingUnit.kt
deleted file mode 100644
index 415e95e6..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/ProcessingUnit.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2020 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.model
-
-/**
- * A single logical compute unit of processor node, either virtual or physical.
- *
- * @property node The processing node containing the CPU core.
- * @property id The identifier of the CPU core within the processing node.
- * @property frequency The clock rate of the CPU in MHz.
- */
-public data class ProcessingUnit(
- public val node: ProcessingNode,
- public val id: Int,
- public val frequency: Double
-)
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/StorageDevice.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/StorageDevice.kt
deleted file mode 100644
index 2621ad6d..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/model/StorageDevice.kt
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.model
-
-/**
- * Model for a physical storage device attached to a machine.
- *
- * @property vendor The vendor of the storage device.
- * @property modelName The model name of the device.
- * @property capacity The capacity of the device.
- * @property readBandwidth The read bandwidth of the device in MBps.
- * @property writeBandwidth The write bandwidth of the device in MBps.
- */
-public data class StorageDevice(
- public val vendor: String,
- public val modelName: String,
- public val capacity: Double,
- public val readBandwidth: Double,
- public val writeBandwidth: Double
-)
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/AsymptoticPowerModel.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/AsymptoticPowerModel.kt
deleted file mode 100644
index 46c397fe..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/AsymptoticPowerModel.kt
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.power
-
-import kotlin.math.E
-import kotlin.math.pow
-
-/**
- * The asymptotic power model partially adapted from GreenCloud.
- *
- * @param maxPower The maximum power draw of the server in W.
- * @param idlePower The power draw of the server at its lowest utilization level in W.
- * @param asymUtil A utilization level at which the server attains asymptotic,
- * i.e., close to linear power consumption versus the offered load.
- * For most of the CPUs,a is in [0.2, 0.5].
- * @param isDvfsEnabled A flag indicates whether DVFS is enabled.
- */
-public class AsymptoticPowerModel(
- private val maxPower: Double,
- private val idlePower: Double,
- private val asymUtil: Double,
- private val isDvfsEnabled: Boolean
-) : PowerModel {
- private val factor: Double = (maxPower - idlePower) / 100
-
- public override fun computePower(utilization: Double): Double =
- if (isDvfsEnabled) {
- idlePower + (factor * 100) / 2 * (1 + utilization.pow(3) - E.pow(-utilization.pow(3) / asymUtil))
- } else {
- idlePower + (factor * 100) / 2 * (1 + utilization - E.pow(-utilization / asymUtil))
- }
-
- override fun toString(): String = "AsymptoticPowerModel[max=$maxPower,idle=$idlePower,asymptotic=$asymUtil]"
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/ConstantPowerModel.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/ConstantPowerModel.kt
deleted file mode 100644
index 0fe32b0d..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/ConstantPowerModel.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.power
-
-/**
- * A power model which produces a constant value [power].
- */
-public class ConstantPowerModel(private val power: Double) : PowerModel {
- public override fun computePower(utilization: Double): Double = power
-
- override fun toString(): String = "ConstantPowerModel[power=$power]"
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/CubicPowerModel.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/CubicPowerModel.kt
deleted file mode 100644
index 0d3bf6cc..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/CubicPowerModel.kt
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.power
-
-import kotlin.math.pow
-
-/**
- * The cubic power model partially adapted from CloudSim.
- *
- * @param maxPower The maximum power draw of the server in W.
- * @param idlePower The power draw of the server at its lowest utilization level in W.
- */
-public class CubicPowerModel(private val maxPower: Double, private val idlePower: Double) : PowerModel {
- private val factor: Double = (maxPower - idlePower) / 100.0.pow(3)
-
- public override fun computePower(utilization: Double): Double {
- return idlePower + factor * (utilization * 100).pow(3)
- }
-
- override fun toString(): String = "CubicPowerModel[max=$maxPower,idle=$idlePower]"
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/InterpolationPowerModel.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/InterpolationPowerModel.kt
deleted file mode 100644
index b17b87a9..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/InterpolationPowerModel.kt
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.power
-
-import kotlin.math.ceil
-import kotlin.math.floor
-import kotlin.math.max
-import kotlin.math.min
-
-/**
- * The linear interpolation power model partially adapted from CloudSim.
- * This model is developed to adopt the <a href="http://www.spec.org/power_ssj2008/">SPECpower benchmark</a>.
- *
- * @param powerValues A [List] of average active power measured by the power analyzer(s) and accumulated by the
- * PTDaemon (Power and Temperature Daemon) for this measurement interval, displayed as watts (W).
- * @see <a href="http://www.spec.org/power_ssj2008/results/res2011q1/">Machines used in the SPEC benchmark</a>
- */
-public class InterpolationPowerModel(private val powerValues: List<Double>) : PowerModel {
- public override fun computePower(utilization: Double): Double {
- val clampedUtilization = min(1.0, max(0.0, utilization))
- val utilizationFlr = floor(clampedUtilization * 10).toInt()
- val utilizationCil = ceil(clampedUtilization * 10).toInt()
- val powerFlr: Double = getAveragePowerValue(utilizationFlr)
- val powerCil: Double = getAveragePowerValue(utilizationCil)
- val delta = (powerCil - powerFlr) / 10
-
- return if (utilization % 0.1 == 0.0) {
- getAveragePowerValue((clampedUtilization * 10).toInt())
- } else {
- powerFlr + delta * (clampedUtilization - utilizationFlr.toDouble() / 10) * 100
- }
- }
-
- override fun toString(): String = "InterpolationPowerModel[entries=${powerValues.size}]"
-
- /**
- * Gets the power consumption for a given utilization percentage.
- *
- * @param index the utilization percentage in the scale from [0 to 10],
- * where 10 means 100% of utilization.
- * @return the power consumption for the given utilization percentage
- */
- private fun getAveragePowerValue(index: Int): Double = powerValues[index]
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/LinearPowerModel.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/LinearPowerModel.kt
deleted file mode 100644
index dadc56ec..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/LinearPowerModel.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.power
-
-/**
- * The linear power model partially adapted from CloudSim.
- *
- * @param maxPower The maximum power draw of the server in W.
- * @param idlePower The power draw of the server at its lowest utilization level in W.
- */
-public class LinearPowerModel(private val maxPower: Double, private val idlePower: Double) : PowerModel {
- /**
- * The linear interpolation factor of the model.
- */
- private val factor: Double = (maxPower - idlePower) / 100
-
- public override fun computePower(utilization: Double): Double {
- return idlePower + factor * utilization * 100
- }
-
- override fun toString(): String = "LinearPowerModel[max=$maxPower,idle=$idlePower]"
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/MsePowerModel.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/MsePowerModel.kt
deleted file mode 100644
index e9e72da8..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/MsePowerModel.kt
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.power
-
-import kotlin.math.pow
-
-/**
- * The power model that minimizes the mean squared error (MSE)
- * to the actual power measurement by tuning the calibration parameter.
- * @see <a href="https://dl.acm.org/doi/abs/10.1145/1273440.1250665">
- * Fan et al., Power provisioning for a warehouse-sized computer, ACM SIGARCH'07</a>
- *
- * @param maxPower The maximum power draw of the server in W.
- * @param idlePower The power draw of the server at its lowest utilization level in W.
- * @param calibrationParam The parameter set to minimize the MSE.
- */
-public class MsePowerModel(
- private val maxPower: Double,
- private val idlePower: Double,
- private val calibrationParam: Double
-) : PowerModel {
- private val factor: Double = (maxPower - idlePower) / 100
-
- public override fun computePower(utilization: Double): Double {
- return idlePower + factor * (2 * utilization - utilization.pow(calibrationParam)) * 100
- }
-
- override fun toString(): String = "MsePowerModel[max=$maxPower,idle=$idlePower,MSE_param=$calibrationParam]"
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/PStatePowerDriver.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/PStatePowerDriver.kt
deleted file mode 100644
index ce7225d2..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/PStatePowerDriver.kt
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.power
-
-import org.opendc.simulator.compute.SimMachine
-import org.opendc.simulator.compute.SimProcessingUnit
-import java.util.TreeMap
-import kotlin.math.max
-import kotlin.math.min
-
-/**
- * A [PowerDriver] that computes the power draw using multiple [PowerModel]s based on multiple frequency states.
- *
- * @param states A map describing the states of the driver.
- */
-public class PStatePowerDriver(states: Map<Double, PowerModel>) : PowerDriver {
- /**
- * The P-States defined by the user and ordered by key.
- */
- private val states: TreeMap<Double, PowerModel> = TreeMap(states)
-
- override fun createLogic(machine: SimMachine, cpus: List<SimProcessingUnit>): PowerDriver.Logic = object : PowerDriver.Logic {
- override fun computePower(): Double {
- var targetFreq = 0.0
- var totalSpeed = 0.0
-
- for (cpu in cpus) {
- targetFreq = max(cpu.capacity, targetFreq)
- totalSpeed += cpu.rate
- }
-
- val maxFreq = states.lastKey()
- val (actualFreq, model) = states.ceilingEntry(min(maxFreq, targetFreq))
- val utilization = totalSpeed / (actualFreq * cpus.size)
- return model.computePower(utilization)
- }
- }
-
- override fun toString(): String = "PStatePowerDriver[states=$states]"
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/PowerDriver.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/PowerDriver.kt
deleted file mode 100644
index 1a46dd4a..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/PowerDriver.kt
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.power
-
-import org.opendc.simulator.compute.SimMachine
-import org.opendc.simulator.compute.SimProcessingUnit
-
-/**
- * A [PowerDriver] is responsible for tracking the power usage for a component of the machine.
- */
-public interface PowerDriver {
- /**
- * Create the driver logic for the specified [machine].
- */
- public fun createLogic(machine: SimMachine, cpus: List<SimProcessingUnit>): Logic
-
- /**
- * The logic of the power driver.
- */
- public interface Logic {
- /**
- * Compute the power consumption of the component.
- *
- * @return The power consumption of the component in W.
- */
- public fun computePower(): Double
- }
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/PowerModel.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/PowerModel.kt
deleted file mode 100644
index decb2420..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/PowerModel.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.power
-
-import org.opendc.simulator.compute.SimMachine
-
-/**
- * A model for estimating the power usage of a [SimMachine].
- */
-public interface PowerModel {
- /**
- * Computes CPU power consumption for each host.
- *
- * @param utilization The CPU utilization percentage.
- * @return A [Double] value of CPU power consumption.
- */
- public fun computePower(utilization: Double): Double
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/SimplePowerDriver.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/SimplePowerDriver.kt
deleted file mode 100644
index 34e91c35..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/SimplePowerDriver.kt
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.power
-
-import org.opendc.simulator.compute.SimMachine
-import org.opendc.simulator.compute.SimProcessingUnit
-
-/**
- * A [PowerDriver] that computes the power consumption based on a single specified [power model][model].
- */
-public class SimplePowerDriver(private val model: PowerModel) : PowerDriver {
- override fun createLogic(machine: SimMachine, cpus: List<SimProcessingUnit>): PowerDriver.Logic = object : PowerDriver.Logic {
-
- override fun computePower(): Double {
- var targetFreq = 0.0
- var totalSpeed = 0.0
-
- for (cpu in cpus) {
- targetFreq += cpu.capacity
- totalSpeed += cpu.rate
- }
-
- return model.computePower(totalSpeed / targetFreq)
- }
- }
-
- override fun toString(): String = "SimplePowerDriver[model=$model]"
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/SqrtPowerModel.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/SqrtPowerModel.kt
deleted file mode 100644
index 0665dbd9..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/SqrtPowerModel.kt
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.power
-
-import kotlin.math.sqrt
-
-/**
- * The square root power model partially adapted from CloudSim.
- *
- * @param maxPower The maximum power draw of the server in W.
- * @param idlePower The power draw of the server at its lowest utilization level in W.
- */
-public class SqrtPowerModel(private val maxPower: Double, private val idlePower: Double) : PowerModel {
- private val factor: Double = (maxPower - idlePower) / sqrt(100.0)
-
- override fun computePower(utilization: Double): Double {
- return idlePower + factor * sqrt(utilization * 100)
- }
-
- override fun toString(): String = "SqrtPowerModel[max=$maxPower,idle=$idlePower]"
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/SquarePowerModel.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/SquarePowerModel.kt
deleted file mode 100644
index e4ae88a9..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/SquarePowerModel.kt
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.power
-
-import kotlin.math.pow
-
-/**
- * The square power model partially adapted from CloudSim.
- *
- * @param maxPower The maximum power draw of the server in W.
- * @param idlePower The power draw of the server at its lowest utilization level in W.
- */
-public class SquarePowerModel(private val maxPower: Double, private val idlePower: Double) : PowerModel {
- private val factor: Double = (maxPower - idlePower) / 100.0.pow(2)
-
- override fun computePower(utilization: Double): Double {
- return idlePower + factor * (utilization * 100).pow(2)
- }
-
- override fun toString(): String = "SquarePowerModel[max=$maxPower,idle=$idlePower]"
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/ZeroIdlePowerDecorator.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/ZeroIdlePowerDecorator.kt
deleted file mode 100644
index 05ab4631..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/power/ZeroIdlePowerDecorator.kt
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.power
-
-/**
- * A decorator for ignoring the idle power when computing energy consumption of components.
- *
- * @param delegate The [PowerModel] to delegate to.
- */
-public class ZeroIdlePowerDecorator(private val delegate: PowerModel) : PowerModel {
- override fun computePower(utilization: Double): Double {
- return if (utilization == 0.0) {
- 0.0
- } else {
- delegate.computePower(utilization)
- }
- }
-
- override fun toString(): String = "ZeroIdlePowerDecorator[delegate=$delegate]"
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimFlopsWorkload.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimFlopsWorkload.kt
deleted file mode 100644
index 726d1f56..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimFlopsWorkload.kt
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2020 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.workload
-
-import org.opendc.simulator.compute.SimMachineContext
-import org.opendc.simulator.flow.source.FixedFlowSource
-
-/**
- * A [SimWorkload] that models applications as a static number of floating point operations ([flops]) executed on
- * multiple cores of a compute resource.
- *
- * @property flops The number of floating point operations to perform for this task in MFLOPs.
- * @property utilization A model of the CPU utilization of the application.
- */
-public class SimFlopsWorkload(
- public val flops: Long,
- public val utilization: Double = 0.8
-) : SimWorkload {
- init {
- require(flops >= 0) { "Number of FLOPs must be positive" }
- require(utilization > 0.0 && utilization <= 1.0) { "Utilization must be in (0, 1]" }
- }
-
- override fun onStart(ctx: SimMachineContext) {
- val lifecycle = SimWorkloadLifecycle(ctx)
- for (cpu in ctx.cpus) {
- cpu.startConsumer(lifecycle.waitFor(FixedFlowSource(flops.toDouble() / ctx.cpus.size, utilization)))
- }
- }
-
- override fun onStop(ctx: SimMachineContext) {}
-
- override fun toString(): String = "SimFlopsWorkload(FLOPs=$flops,utilization=$utilization)"
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimRuntimeWorkload.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimRuntimeWorkload.kt
deleted file mode 100644
index 8a3f5f84..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimRuntimeWorkload.kt
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2020 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.workload
-
-import org.opendc.simulator.compute.SimMachineContext
-import org.opendc.simulator.flow.source.FixedFlowSource
-
-/**
- * A [SimWorkload] that models application execution as a single duration.
- *
- * @property duration The duration of the workload.
- * @property utilization The utilization of the application during runtime.
- */
-public class SimRuntimeWorkload(
- public val duration: Long,
- public val utilization: Double = 0.8
-) : SimWorkload {
- init {
- require(duration >= 0) { "Duration must be non-negative" }
- require(utilization > 0.0 && utilization <= 1.0) { "Utilization must be in (0, 1]" }
- }
-
- override fun onStart(ctx: SimMachineContext) {
- val lifecycle = SimWorkloadLifecycle(ctx)
- for (cpu in ctx.cpus) {
- val limit = cpu.capacity * utilization
- cpu.startConsumer(lifecycle.waitFor(FixedFlowSource((limit / 1000) * duration, utilization)))
- }
- }
-
- override fun onStop(ctx: SimMachineContext) {}
-
- override fun toString(): String = "SimRuntimeWorkload(duration=$duration,utilization=$utilization)"
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimTrace.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimTrace.kt
deleted file mode 100644
index db6a4629..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimTrace.kt
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.workload
-
-import org.opendc.simulator.compute.model.ProcessingUnit
-import org.opendc.simulator.flow.FlowConnection
-import org.opendc.simulator.flow.FlowSource
-import kotlin.math.min
-
-/**
- * A workload trace that describes the resource utilization over time in a collection of [SimTraceFragment]s.
- *
- * @param usageCol The column containing the CPU usage of each fragment (in MHz).
- * @param deadlineCol The column containing the ending timestamp for each fragment (in epoch millis).
- * @param coresCol The column containing the utilized cores.
- * @param size The number of fragments in the trace.
- */
-public class SimTrace(
- private val usageCol: DoubleArray,
- private val deadlineCol: LongArray,
- private val coresCol: IntArray,
- private val size: Int
-) {
- init {
- require(size >= 0) { "Invalid trace size" }
- require(usageCol.size >= size) { "Invalid number of usage entries" }
- require(deadlineCol.size >= size) { "Invalid number of deadline entries" }
- require(coresCol.size >= size) { "Invalid number of core entries" }
- }
-
- public companion object {
- /**
- * Construct a [SimTrace] with the specified fragments.
- */
- @JvmStatic
- public fun ofFragments(fragments: List<SimTraceFragment>): SimTrace {
- val size = fragments.size
- val usageCol = DoubleArray(size)
- val deadlineCol = LongArray(size)
- val coresCol = IntArray(size)
-
- for (i in fragments.indices) {
- val fragment = fragments[i]
- usageCol[i] = fragment.usage
- deadlineCol[i] = fragment.timestamp + fragment.duration
- coresCol[i] = fragment.cores
- }
-
- return SimTrace(usageCol, deadlineCol, coresCol, size)
- }
-
- /**
- * Construct a [SimTrace] with the specified fragments.
- */
- @JvmStatic
- public fun ofFragments(vararg fragments: SimTraceFragment): SimTrace {
- val size = fragments.size
- val usageCol = DoubleArray(size)
- val deadlineCol = LongArray(size)
- val coresCol = IntArray(size)
-
- for (i in fragments.indices) {
- val fragment = fragments[i]
- usageCol[i] = fragment.usage
- deadlineCol[i] = fragment.timestamp + fragment.duration
- coresCol[i] = fragment.cores
- }
-
- return SimTrace(usageCol, deadlineCol, coresCol, size)
- }
-
- /**
- * Create a [SimTrace.Builder] instance.
- */
- @JvmStatic
- public fun builder(): Builder = Builder()
- }
-
- /**
- * Construct a new [FlowSource] for the specified [cpu].
- *
- * @param cpu The [ProcessingUnit] for which to create the source.
- * @param offset The time offset to use for the trace.
- */
- public fun newSource(cpu: ProcessingUnit, offset: Long): FlowSource {
- return CpuConsumer(cpu, offset, usageCol, deadlineCol, coresCol, size)
- }
-
- /**
- * A builder class for a [SimTrace].
- */
- public class Builder internal constructor() {
- /**
- * The columns of the trace.
- */
- private var usageCol: DoubleArray = DoubleArray(16)
- private var deadlineCol: LongArray = LongArray(16)
- private var coresCol: IntArray = IntArray(16)
-
- /**
- * The number of entries in the trace.
- */
- private var size = 0
-
- /**
- * Add the specified [SimTraceFragment] to the trace.
- */
- public fun add(fragment: SimTraceFragment) {
- add(fragment.timestamp + fragment.duration, fragment.usage, fragment.cores)
- }
-
- /**
- * Add a fragment to the trace.
- *
- * @param deadline Timestamp at which the fragment ends (in epoch millis).
- * @param usage CPU usage of this fragment.
- * @param cores Number of cores used.
- */
- public fun add(deadline: Long, usage: Double, cores: Int) {
- val size = size
-
- if (size == usageCol.size) {
- grow()
- }
-
- deadlineCol[size] = deadline
- usageCol[size] = usage
- coresCol[size] = cores
-
- this.size++
- }
-
- /**
- * Helper function to grow the capacity of the column arrays.
- */
- private fun grow() {
- val arraySize = usageCol.size
- val newSize = arraySize + (arraySize shr 1)
-
- usageCol = usageCol.copyOf(newSize)
- deadlineCol = deadlineCol.copyOf(newSize)
- coresCol = coresCol.copyOf(newSize)
- }
-
- /**
- * Construct the immutable [SimTrace].
- */
- public fun build(): SimTrace {
- return SimTrace(usageCol, deadlineCol, coresCol, size)
- }
- }
-
- /**
- * A CPU consumer for the trace workload.
- */
- private class CpuConsumer(
- cpu: ProcessingUnit,
- private val offset: Long,
- private val usageCol: DoubleArray,
- private val deadlineCol: LongArray,
- private val coresCol: IntArray,
- private val size: Int
- ) : FlowSource {
- private val id = cpu.id
- private val coreCount = cpu.node.coreCount
-
- /**
- * The index in the trace.
- */
- private var _idx = 0
-
- override fun onPull(conn: FlowConnection, now: Long): Long {
- val size = size
- val nowOffset = now - offset
-
- var idx = _idx
- val deadlines = deadlineCol
- var deadline = deadlines[idx]
-
- while (deadline <= nowOffset && ++idx < size) {
- deadline = deadlines[idx]
- }
-
- if (idx >= size) {
- conn.close()
- return Long.MAX_VALUE
- }
-
- _idx = idx
-
- val cores = min(coreCount, coresCol[idx])
- val usage = usageCol[idx]
-
- conn.push(if (id < cores) usage / cores else 0.0)
- return deadline - nowOffset
- }
- }
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimTraceFragment.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimTraceFragment.kt
deleted file mode 100644
index 5285847f..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimTraceFragment.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.workload
-
-/**
- * A fragment of the workload trace.
- *
- * @param timestamp The timestamp at which the fragment starts (in epoch millis).
- * @param duration The duration of the fragment (in milliseconds).
- * @param usage The CPU usage during the fragment (in MHz).
- * @param cores The amount of cores utilized during the fragment.
- */
-public data class SimTraceFragment(
- @JvmField val timestamp: Long,
- @JvmField val duration: Long,
- @JvmField val usage: Double,
- @JvmField val cores: Int
-)
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimTraceWorkload.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimTraceWorkload.kt
deleted file mode 100644
index ce04a790..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimTraceWorkload.kt
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (c) 2020 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.workload
-
-import org.opendc.simulator.compute.SimMachineContext
-
-/**
- * A [SimWorkload] that replays a workload trace consisting of multiple fragments, each indicating the resource
- * consumption for some period of time.
- *
- * @param trace The trace of fragments to use.
- * @param offset The offset for the timestamps.
- */
-public class SimTraceWorkload(private val trace: SimTrace, private val offset: Long = 0L) : SimWorkload {
- override fun onStart(ctx: SimMachineContext) {
- val lifecycle = SimWorkloadLifecycle(ctx)
-
- for (cpu in ctx.cpus) {
- cpu.startConsumer(lifecycle.waitFor(trace.newSource(cpu.model, offset)))
- }
- }
-
- override fun onStop(ctx: SimMachineContext) {}
-
- override fun toString(): String = "SimTraceWorkload"
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimWorkload.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimWorkload.kt
deleted file mode 100644
index 61c6e2ad..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimWorkload.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2020 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.workload
-
-import org.opendc.simulator.compute.SimMachineContext
-
-/**
- * A model that characterizes the runtime behavior of some particular workload.
- *
- * Workloads are stateful objects that may be paused and resumed at a later moment. As such, be careful when using the
- * same [SimWorkload] from multiple contexts.
- */
-public interface SimWorkload {
- /**
- * This method is invoked when the workload is started.
- *
- * @param ctx The execution context in which the machine runs.
- */
- public fun onStart(ctx: SimMachineContext)
-
- /**
- * This method is invoked when the workload is stopped.
- *
- * @param ctx The execution context in which the machine runs.
- */
- public fun onStop(ctx: SimMachineContext)
-}
diff --git a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimWorkloadLifecycle.kt b/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimWorkloadLifecycle.kt
deleted file mode 100644
index 46113bb0..00000000
--- a/opendc-simulator/opendc-simulator-compute/src/main/kotlin/org/opendc/simulator/compute/workload/SimWorkloadLifecycle.kt
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2021 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.simulator.compute.workload
-
-import org.opendc.simulator.compute.SimMachineContext
-import org.opendc.simulator.flow.FlowConnection
-import org.opendc.simulator.flow.FlowSource
-
-/**
- * A helper class to manage the lifecycle of a [SimWorkload]
- */
-public class SimWorkloadLifecycle(private val ctx: SimMachineContext) {
- /**
- * The resource consumers which represent the lifecycle of the workload.
- */
- private val waiting = HashSet<Wrapper>()
-
- /**
- * Wait for the specified [source] to complete before ending the lifecycle of the workload.
- */
- public fun waitFor(source: FlowSource): FlowSource {
- val wrapper = Wrapper(source)
- waiting.add(wrapper)
- return wrapper
- }
-
- /**
- * Complete the specified [Wrapper].
- */
- private fun complete(wrapper: Wrapper) {
- if (waiting.remove(wrapper) && waiting.isEmpty()) {
- ctx.close()
- }
- }
-
- /**
- * A [FlowSource] that wraps [delegate] and informs [SimWorkloadLifecycle] that is has completed.
- */
- private inner class Wrapper(private val delegate: FlowSource) : FlowSource {
- override fun onStart(conn: FlowConnection, now: Long) {
- delegate.onStart(conn, now)
- }
-
- override fun onPull(conn: FlowConnection, now: Long): Long {
- return delegate.onPull(conn, now)
- }
-
- override fun onConverge(conn: FlowConnection, now: Long) {
- delegate.onConverge(conn, now)
- }
-
- override fun onStop(conn: FlowConnection, now: Long) {
- try {
- delegate.onStop(conn, now)
- } finally {
- complete(this)
- }
- }
-
- override fun toString(): String = "SimWorkloadLifecycle.Wrapper[delegate=$delegate]"
- }
-}