summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-12-03 15:02:56 -0500
committerAmlal El Mahrouss <amlal@nekernel.org>2025-12-03 15:02:56 -0500
commit1149932b8ca5527d5dc452f8a64643ab980bd93c (patch)
treefcb36c280b10abf53d05f890709d1ad615779314
parent4a8379c26816a23a4492c84b4fd7a1330043edd2 (diff)
chore: new WG02 and updated README.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
-rw-r--r--.gitignore1
-rw-r--r--README.md7
-rw-r--r--draft/wg02/core_process_scheduler.tex128
3 files changed, 135 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore
index cee5512..fc0bfdf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,4 @@
*.log
*.pdf
*.gz
+*.out \ No newline at end of file
diff --git a/README.md b/README.md
index 6277d18..6d1b4bd 100644
--- a/README.md
+++ b/README.md
@@ -3,4 +3,9 @@
## Brief
Here are the NeKernel papers, freely available under Apache 2.0, Authored by Amlal El Mahrouss.<br/>
-If you wish to cite the paper, refer to the CITATION.cff \ No newline at end of file
+If you wish to cite the paper, refer to the CITATION.cff
+
+## Working Groups
+
+- WG01: Kernel Architecture Group.
+- WG02: Multi-Tasking Group. \ No newline at end of file
diff --git a/draft/wg02/core_process_scheduler.tex b/draft/wg02/core_process_scheduler.tex
new file mode 100644
index 0000000..00adbc6
--- /dev/null
+++ b/draft/wg02/core_process_scheduler.tex
@@ -0,0 +1,128 @@
+\documentclass{article}
+\usepackage{graphicx}
+\usepackage{hyperref}
+
+\title{WG02: CoreProcessScheduler}
+\author{Amlal El Mahrouss}
+\date{\today}
+
+\begin{document}
+
+\maketitle
+
+\section{Abstract}
+
+{The CoreProcessScheduler governs how the scheduling backend and policy of the kernel works, It is the common gateway for schedulers inside NeKernel based systems.}
+
+\section{Overview}
+
+{The CoreProcessScheduler (now referred as CPS) serves as the intermediate foundal between the scheduler backend and kernel.} {It takes care of process life-cycle management, team-based process grouping, and affinity-based CPU based allocation to mention the least.}
+
+\section{The Affinity System}
+
+{Processes are given CPU time affinity hints using an affinity kind type, these hints help the scheduler run or adjust the current process.}
+
+\subsection{Sample Code \#1}
+
+{The following sample is C++ code.} {The smaller the value, the more critical the process.}
+
+\begin{verbatim}
+enum class AffinityKind : Int32 {
+ kRealTime = 100,
+ kVeryHigh = 150,
+ kHigh = 200,
+ kStandard = 1000,
+ kLowUsage = 1500,
+ kVeryLowUsage = 2000,
+};
+\end{verbatim}
+
+\section{The Team System}
+
+{The team system holds process metadata for the backend scheduler to run on. It holds methods and fields for backend specific operations.} {One implementation of such team is the UserProcessTeam object inside NeKernel.}
+
+\subsection{Sample Code \#2}
+
+{The following sample is used to hold team metadata.} {This is part of the NeKernel source tree.}
+
+\begin{verbatim}
+class UserProcessTeam final {
+ public:
+ explicit UserProcessTeam();
+ ~UserProcessTeam() = default;
+
+ NE_COPY_DEFAULT(UserProcessTeam)
+
+ Array<USER_PROCESS, kSchedProcessLimitPerTeam>& AsArray();
+ Ref<USER_PROCESS>& AsRef();
+ ProcessID& Id() noexcept;
+
+ public:
+ USER_PROCESS_ARRAY mProcessList;
+ USER_PROCESS_REF mCurrentProcess;
+ ProcessID mTeamId{0};
+ ProcessID mProcessCur{0};
+};
+
+\end{verbatim}
+
+\section{The Process Image System}
+
+{The process image container is a design pattern made to contain process data and metadata, its purpose comes from the lack of mainstream operating systems of such ability to hold metadata.}
+
+{This approach helps separate concerns and give modularity to the system, as the image and process structure are not mixed together.}
+
+\subsection{Sample Code \#3}
+
+{The following sample is a C++ container used to hold process data and metadata.} {This is part of the NeKernel source tree.}
+
+\begin{verbatim}
+struct PROCESS_IMAGE final {
+ explicit PROCESS_IMAGE() = default;
+
+ private:
+ friend USER_PROCESS;
+ friend KERNEL_TASK;
+
+ friend class UserProcessScheduler;
+
+ ImagePtr fCode;
+ ImagePtr fBlob;
+
+ public:
+ Bool HasCode() const { return this->fCode != nullptr; }
+
+ Bool HasImage() const { return this->fBlob != nullptr; }
+
+ ErrorOr<ImagePtr> LeakImage() {
+ if (this->fCode) {
+ return ErrorOr<ImagePtr>{this->fCode};
+ }
+
+ return ErrorOr<ImagePtr>{kErrorInvalidData};
+ }
+
+ ErrorOr<ImagePtr> LeakBlob() {
+ if (this->fBlob) {
+ return ErrorOr<ImagePtr>{this->fBlob};
+ }
+
+ return ErrorOr<ImagePtr>{kErrorInvalidData};
+ }
+};
+
+\end{verbatim}
+
+\section{Conclusion}
+
+{The CoreProcessScheduler is a piece of systems design with robust design and useful cases, although useful in desktop/server cases, It may not be suited for every other tasks.}
+
+{And while one scheduler backend (such as the UserProcessScheduler) takes care of user process scheduling and fairness, the CoreProcessScheduler takes care of the foundation for those systems.}
+
+\section{References}
+
+{NeKernel}: \href{https://github.com/nekernel-org/nekernel}{NeKernel}
+
+{CoreProcessScheduler}: \href{https://github.com/nekernel-org/nekernel/blob/dev/src/kernel/KernelKit/CoreProcessScheduler.h}{CoreProcessScheduler}
+
+\end{document} \ No newline at end of file