From 911bf2d68a4904d8ff838d31e00ef65d4e03063c Mon Sep 17 00:00:00 2001 From: Amlal Date: Wed, 30 Apr 2025 10:12:55 +0200 Subject: kernel, sched: worked on a pending ticket (process rebalancing) Signed-off-by: Amlal --- dev/ddk/DDKKit/ifs.h | 16 +++++++++++++++ dev/kernel/KernelKit/UserProcessScheduler.h | 3 ++- dev/kernel/src/UserProcessScheduler.cc | 32 ++++++++++++++++++++++++++--- 3 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 dev/ddk/DDKKit/ifs.h (limited to 'dev') diff --git a/dev/ddk/DDKKit/ifs.h b/dev/ddk/DDKKit/ifs.h new file mode 100644 index 00000000..0665de9a --- /dev/null +++ b/dev/ddk/DDKKit/ifs.h @@ -0,0 +1,16 @@ +/* ------------------------------------------- + + Copyright Amlal El Mahrouss. + + FILE: ifs.h + PURPOSE: IFS model base header. + +------------------------------------------- */ + +#pragma once + +#include + +struct DDK_IFS_MANIFEST; + +/// @brief IFS hooks to plug into the FileMgr. diff --git a/dev/kernel/KernelKit/UserProcessScheduler.h b/dev/kernel/KernelKit/UserProcessScheduler.h index d6cd7ad4..1e8719ca 100644 --- a/dev/kernel/KernelKit/UserProcessScheduler.h +++ b/dev/kernel/KernelKit/UserProcessScheduler.h @@ -106,7 +106,8 @@ class USER_PROCESS final { kExecutableKindCount, }; - ProcessTime PTime{0}; //! @brief USER_PROCESS allocated tine. + ProcessTime PTime{0}; //! @brief Process allocated tine. + ProcessTime RTime{0}; //! @brief Process Run time PID ProcessId{kSchedInvalidPID}; Int32 Kind{kExecutableKind}; diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 96938d10..4b206317 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -20,6 +20,8 @@ #include #include #include +#include "KernelKit/CoreProcessScheduler.h" +#include "NewKit/Defines.h" ///! BUGS: 0 @@ -424,6 +426,7 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im process.ProcessId = pid; process.Status = ProcessStatusKind::kStarting; process.PTime = (UIntPtr) AffinityKind::kStandard; + process.RTime = 0; (Void)(kout << "PID: " << number(process.ProcessId) << kendl); (Void)(kout << "Name: " << process.Name << kendl); @@ -510,13 +513,36 @@ SizeT UserProcessScheduler::Run() noexcept { process.StackFrame, process.ProcessId); if (!ret) { - if (process.Affinity == AffinityKind::kRealTime) continue; - kout << "The process: " << process.Name << ", is not valid! Crashing it...\r"; - process.Crash(); } } else { + if (process.ProcessId == this->CurrentProcess().Leak().ProcessId) { + if (process.PTime < process.RTime) { + if (process.RTime < (Int32) AffinityKind::kRealTime) + process.PTime = (Int32) AffinityKind::kVeryLowUsage; + else if (process.RTime < (Int32) AffinityKind::kVeryHigh) + process.PTime = (Int32) AffinityKind::kLowUsage; + else if (process.RTime < (Int32) AffinityKind::kHigh) + process.PTime = (Int32) AffinityKind::kStandard; + else if (process.RTime < (Int32) AffinityKind::kStandard) + process.PTime = (Int32) AffinityKind::kHigh; + + process.RTime = static_cast(process.Affinity); + + BOOL ret = UserProcessHelper::Switch(process.Image.Leak().Leak().Leak(), + &process.StackReserve[process.StackSize - 1], + process.StackFrame, process.ProcessId); + + if (!ret) { + kout << "The process: " << process.Name << ", is not valid! Crashing it...\r"; + process.Crash(); + } + } else { + ++process.RTime; + } + } + --process.PTime; } } -- cgit v1.2.3