From a4a54862524b9c95886907b6431a970a4a5c70df Mon Sep 17 00:00:00 2001 From: Boyan Date: Mon, 21 Apr 2025 22:49:53 +0200 Subject: [PATCH] vault backup: 2025-04-21 22:49:53 --- .obsidian/workspace.json | 43 ++---- .../Circuitree/Shitter Zero/Agenda.md | 5 - Operating Systems/Processes and Threads.md | 48 ++++++- Operating Systems/Scheduling.md | 123 ++++++++++++++++++ Pasted image 20250421222538.png | Bin 0 -> 23755 bytes 5 files changed, 181 insertions(+), 38 deletions(-) delete mode 100644 Extracurricular/Circuitree/Shitter Zero/Agenda.md create mode 100644 Operating Systems/Scheduling.md create mode 100644 Pasted image 20250421222538.png diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 1ce6d45..871c963 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -4,39 +4,21 @@ "type": "split", "children": [ { - "id": "d34eff5233313e79", + "id": "792b2a8f7f3f7ac1", "type": "tabs", - "dimension": 50, "children": [ { - "id": "f1e9c17a4ce43dc1", + "id": "c1086d70d8f012dd", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "Extracurricular/Circuitree/Shitter Zero/Agenda.md", + "file": "Operating Systems/Scheduling.md", "mode": "source", "source": false }, "icon": "lucide-file", - "title": "Agenda" - } - } - ] - }, - { - "id": "ad495c8e1240a180", - "type": "tabs", - "dimension": 50, - "children": [ - { - "id": "cbb50d8009087a16", - "type": "leaf", - "state": { - "type": "reveal-preview-view", - "state": {}, - "icon": "lucide-file", - "title": "Slide Preview" + "title": "Scheduling" } } ] @@ -199,8 +181,7 @@ } ], "direction": "horizontal", - "width": 200, - "collapsed": true + "width": 200 }, "left-ribbon": { "hiddenItems": { @@ -217,12 +198,15 @@ "omnisearch:Omnisearch": false } }, - "active": "cbb50d8009087a16", + "active": "c1086d70d8f012dd", "lastOpenFiles": [ - "Extracurricular/Circuitree/Shitter Zero/Timeline.md", - "Extracurricular/Circuitree/Shitter Zero/Agenda.md", - "Extracurricular/Circuitree/Antenna Building/Idea and proposed timeline.md", "Operating Systems/Processes and Threads.md", + "Operating Systems/Overview.md", + "Operating Systems/Scheduling.md", + "Pasted image 20250421222538.png", + "Extracurricular/Circuitree/Shitter Zero/Agenda.md", + "Extracurricular/Circuitree/Shitter Zero/Timeline.md", + "Extracurricular/Circuitree/Antenna Building/Idea and proposed timeline.md", "Extracurricular/Circuitree/Shitter Zero", "Extracurricular/Circuitree/Committee Market/discussion/CA.md", "Extracurricular/Circuitree/Committee Market/discussion/Committee market ideas.md", @@ -246,8 +230,6 @@ "Extracurricular/FCG/Radio reception.md", "Extracurricular/Circuitree/Committee Market/Macro pad.md", "Operating Systems/assets/Pasted image 20250419143713.png", - "Operating Systems/Overview.md", - "Languages & Machines/Introduction.md", "Operating Systems/assets/Pasted image 20250419141856.png", "Languages & Machines/assets/Pasted image 20250414190229.png", "Languages & Machines/assets/Pasted image 20250414190144.png", @@ -259,7 +241,6 @@ "Extracurricular/Circuitree/Antenna Building", "Fundamentals of Electronics", "Pasted image 20250113151159.png", - "Introduction to Machine Learning/image.png", "Extracurricular/Misc/Proposed Routine Plan.canvas", "Introduction to Machine Learning", "Operating Systems/assets", diff --git a/Extracurricular/Circuitree/Shitter Zero/Agenda.md b/Extracurricular/Circuitree/Shitter Zero/Agenda.md deleted file mode 100644 index 7dfb27f..0000000 --- a/Extracurricular/Circuitree/Shitter Zero/Agenda.md +++ /dev/null @@ -1,5 +0,0 @@ -==MOVE THIS TO THE CIRCUITREE REPO!== - -1. 15m intro presentation (present the problem) -2. 30m discussion -3. 10m distribution \ No newline at end of file diff --git a/Operating Systems/Processes and Threads.md b/Operating Systems/Processes and Threads.md index 5cd077c..935f28e 100644 --- a/Operating Systems/Processes and Threads.md +++ b/Operating Systems/Processes and Threads.md @@ -190,8 +190,34 @@ A light-weight process. - **Kernel Threads** - Managed by OS -### Relationship modles -* +### Relationship models +#### Many-to-one + +* User-level threads to one kernel treads +* Management done by thread library in user space +* The entire process blocks whenever a thread makes a blocking sycalls +* Only **one** thread can access the kernel at a time (you can't run multiple threads in parallel on multiprocessors) + +#### One-to-one +Each user thread is mapped to a kernel thread +- Provides more concurrency +Unfortunately: +- Creating a user thread requires creating the corresponding kernel thread +- Overhead of creating kernel threads retricts the number of threads + + +#### Many-to-many +Multiplexes many user threads to a $\leq$ number of kernel threads. + +- Allows creation of however many threads the user wants +- The kernel can schedule another thread for execution whenever a thread performs a blocking system call + + +#### Fork-join +Parent creates forks (children threads) and then waits for the children to terminate, joining with them, at which point it can retrieve and combine results. + +This is also called **synchronous threading**. Parent **cannot** continue until the work has been completed. + [^1]: A batch job is a scheduled task or a set of commands that are executed without manual intervention - **cron** @@ -199,3 +225,21 @@ A light-weight process. [^3]: sequence of programmed instructions that can be managed independently by a scheduler within a computer program + +##### Parallelism + +![](Pasted%20image%2020250421222538.png) + + +## Thread pool +Issue wih threads: +- Overhead when creating +- Exhausting system resources +Solution: thread pools - creating a number of threads at startup and place them into a pool where they sit and wait for work. + + +This optimizes everything because: +Sharing threads: +- If a thread is blocked (e.g., waiting for I/O), it doesn't remain idle; it can be reassigned to another task +- Each thread has its own task queue +- Whenever a thread finishes its tasks it looks through the other threads' queues and "steals" tasks. diff --git a/Operating Systems/Scheduling.md b/Operating Systems/Scheduling.md new file mode 100644 index 0000000..65af60a --- /dev/null +++ b/Operating Systems/Scheduling.md @@ -0,0 +1,123 @@ +--- +type: theoretical +backlinks: + - "[[Overview#Multitasking/Timesharing]]" + - "[[Processes and Threads#Timesharing In-depth]]" +--- +Processes take turns to use the CPU. + +## Long Term Scheduling +Processes that are waiting are put in a *ready* queue. + +## Short Term Scheduling +Which process in the ready queue should be assigned the CPU next + + +## Criteria +We want to: +- Maximize CPU utilization +- Minimize Average Turnaround time +- Maximize throughput +- Minimize waiting and response time + + +### CPU utilization +Each process spends $p$ fraction of its time wating for I/O, having $n$ processes in memory. The probability that all processes are waiting for I/O is $p^n$ +Hence, CPU utilization is: + +$$ +1- p^n +$$ + +### Average Turnaround Time +The time since the process enters the ready queue until it terminates. + +Average is literally the mean of the aforementioned but for many processes. + +### Throughput +Number of processes executed completely in a unit of time. + +## Non-Preemptive scheduling + +If the process executes to complete, the algorithm is non-preemptive. + +- Long average turnaround time +- Whenever a long process starts, short ones have to wait +### FCFS +Read title + +## SJF +Shortest job first. Choose the next process to execute from the processes currently in the ready queue, based on their execution time + + +> [!IMPORTANT] +> Starvation happens when a process waits for a resource for a long time + + + +This could happen with SJF. + + +### Attacking starvation by introducing compound priority[^1] + +So, SJF uses `1/Execution time` priority. We just add `0.1*waiting time` to it. + +[^1]: I made that shit the fuck up just now + +## Preemptive scheduling +Scheduler stops a process and reclaims the CPU after assigning it + + +### SRTF +Shortest remaining time first (as opposed to shortest job first which just takes the initial times, this one is dynamic) + +We keep track of when the processes start and how much time they've taken, calculating how much time they have left. We pick the minimum based on that. + +### RR +Round robing. Just give everyone a small time window for them to do their jobs. + +We need to find a "time quantum"[^2] by balancing minimizing overhead of context switching and maximizing response time + +**no priority** + + +## Process categorization + +| Category | Description | Example | +| ----------- | ------------------------------------------------------------ | ----------------------- | +| Batch | No interaction with users, input/output read/written to file | Cron job | +| Interactive | Requires input from user. Needs short response times. | Chat | +| Real-time | Expects response from user | Industrial applications | + +## Multi-queue scheduling +Multiple priority levels and uses RR for each. +Choses processes from highest level and recurses downwards whenever a level is exhausted. + +### + feedback +Processes can be moved from one queue to another based on the type of operations executed (i.e. I/O is high priority). + + +## Lottery +Random number. Set boundaries. e.g.: + +$$ + +\begin{align*} +p_a \leftarrow 20\% \\ +p_b \leftarrow 50\% \\ +p_c \leftarrow 30\% +\end{align*} +$$ + +So: + +$$ +rand() \rightarrow 0.4 \implies S(\{p_i\}) = p_b +$$ + + +## Real-time scheduling +Dividing the program into a number of short-lived processes. + + +[^2]: Terrible fucking name, why why why, this should be called a window or some shit. diff --git a/Pasted image 20250421222538.png b/Pasted image 20250421222538.png new file mode 100644 index 0000000000000000000000000000000000000000..14968d2a37090fbe12c33a171b587e21f5f085dc GIT binary patch literal 23755 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 literal 0 HcmV?d00001