# CHAPTER 4: SYSTEM SOFTWARE

## 4.1 PURPOSES OF AN OPERATING SYSTEM

### 4.1.1 Resource Optimisation

**How OS Maximises Resources:**

- CPU scheduling
- Memory management
- I/O optimisation
- File system management

### 4.1.2 User Interface

**Purpose:** Hides complexities of hardware from user. Allows users to interact with application programs without knowing hardware details.

**Types:**

- Command-line interface (CLI)
- Graphical User Interface (GUI)
- Touch interface

### 4.1.3 Process Management

**Process:** A program being executed which has an associated Process Control Block (PCB) in memory.

**Process States:**

- **Ready:** New process arrived, PCB created
- **Running:** Has CPU access
- **Blocked:** Cannot progress until event occurs

**PCB Contents:**

- Process state
- Program counter
- CPU registers
- Memory management information
- I/O status information

### 4.1.4 Scheduling Routines

**First-Come-First-Served (FCFS):**

- Non-preemptive
- FIFO queue
- Simple but may cause long waits

**Round Robin:**

- Preemptive
- Allocates time slice to each process
- No prioritization
- Fair but may waste CPU on context switching

**Priority-Based:**

- Most complex
- Priorities re-evaluated on queue change
- Can be preemptive or non-preemptive

**Shortest Job First:**

- Non-preemptive
- Processes with shortest execution time first
- Optimal for minimizing average waiting time

**Shortest Remaining Time:**

- Preemptive version of Shortest Job First

### 4.1.5 Memory Management

**Paging:**

- Process split into pages
- Memory split into frames
- All pages can be loaded into memory

**Virtual Memory:**

- No need for all pages in memory
- CPU address space larger than physical
- Address resolved by Memory Management Unit (MMU)

**Benefits:**

- Large programs can run with less physical memory
- More programs can run simultaneously

**Disk Thrashing:**

- Perpetual loading/unloading of pages
- Occurs when too many processes compete for memory
- Performance severely degraded

### 4.1.6 OS Structure

**User Mode:**

- Available for users and applications
- Limited access to system resources

**Kernel/Privileged Mode:**

- Sole access to parts of memory
- Access to certain system functions
- Only OS components run in this mode

---

## 4.2 TRANSLATION SOFTWARE

### 4.2.1 Compilation Stages

**Lexical Analysis:**

- Converts sequence of characters to sequence of tokens
- Identifies keywords, identifiers, operators

**Syntax Analysis:**

- Checks code for grammar mistakes
- Identifies syntax errors

**Code Generation:**

- Generates intermediate code after syntax analysis

**Optimization:**

- Improves efficiency of code
- Removes redundant operations

### 4.2.2 Interpreters vs Compilers

<div class="sc-fYRIQK gLjTUz table-wrapper" id="bkmrk-feature-compiler-int" style="box-sizing: border-box; font-weight: 400; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent; position: relative; color: rgb(0, 0, 0); font-family: "', Ubuntu, -apple-system, 'system-ui', 'Segoe UI', system-ui, Roboto, Oxygen, Cantarell, 'Open Sans', 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji"; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><table style="box-sizing: border-box; font-weight: normal; border-image: none 100% / 1 / 0 stretch; margin: 2em 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); text-indent: 0px; border-collapse: separate; -webkit-tap-highlight-color: transparent; --table-border-radius: 8px; font-size: 0.9em; width: 647px; border-radius: 8px; overflow: hidden; border-spacing: 0px; border: 0.5px solid rgba(0, 0, 0, 0.098);"><thead style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;"><tr style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;"><th style="box-sizing: border-box; font-weight: 600; border-width: 0px 0.5px 0.5px 0px; border-style: solid; border-color: oklch(0.92 0.004 286.32) rgba(0, 0, 0, 0.098) rgba(0, 0, 0, 0.098) oklch(0.92 0.004 286.32); border-image: initial; margin: 0px; padding: 0.5em; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent; background-color: rgb(238, 238, 238); text-align: left;">Feature</th><th style="box-sizing: border-box; font-weight: 600; border-width: 0px 0.5px 0.5px 0px; border-style: solid; border-color: oklch(0.92 0.004 286.32) rgba(0, 0, 0, 0.098) rgba(0, 0, 0, 0.098) oklch(0.92 0.004 286.32); border-image: initial; margin: 0px; padding: 0.5em; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent; background-color: rgb(238, 238, 238); text-align: left;">Compiler</th><th style="box-sizing: border-box; font-weight: 600; border-top: 0px solid oklch(0.92 0.004 286.32); border-right: none; border-bottom: 0.5px solid rgba(0, 0, 0, 0.098); border-left: 0px solid oklch(0.92 0.004 286.32); border-image: initial; margin: 0px; padding: 0.5em; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent; background-color: rgb(238, 238, 238); text-align: left;">Interpreter</th></tr></thead><tbody style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;"><tr style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;"><td style="box-sizing: border-box; font-weight: normal; border-width: 0px 0.5px 0.5px 0px; border-style: solid; border-color: oklch(0.92 0.004 286.32) rgba(0, 0, 0, 0.098) rgba(0, 0, 0, 0.098) oklch(0.92 0.004 286.32); border-image: initial; margin: 0px; padding: 0.5em; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;">Translation</td><td style="box-sizing: border-box; font-weight: normal; border-width: 0px 0.5px 0.5px 0px; border-style: solid; border-color: oklch(0.92 0.004 286.32) rgba(0, 0, 0, 0.098) rgba(0, 0, 0, 0.098) oklch(0.92 0.004 286.32); border-image: initial; margin: 0px; padding: 0.5em; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;">Entire program before execution</td><td style="box-sizing: border-box; font-weight: normal; border-top: 0px solid oklch(0.92 0.004 286.32); border-right: none; border-bottom: 0.5px solid rgba(0, 0, 0, 0.098); border-left: 0px solid oklch(0.92 0.004 286.32); border-image: initial; margin: 0px; padding: 0.5em; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;">Line-by-line</td></tr><tr style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;"><td style="box-sizing: border-box; font-weight: normal; border-width: 0px 0.5px 0.5px 0px; border-style: solid; border-color: oklch(0.92 0.004 286.32) rgba(0, 0, 0, 0.098) rgba(0, 0, 0, 0.098) oklch(0.92 0.004 286.32); border-image: initial; margin: 0px; padding: 0.5em; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;">Output</td><td style="box-sizing: border-box; font-weight: normal; border-width: 0px 0.5px 0.5px 0px; border-style: solid; border-color: oklch(0.92 0.004 286.32) rgba(0, 0, 0, 0.098) rgba(0, 0, 0, 0.098) oklch(0.92 0.004 286.32); border-image: initial; margin: 0px; padding: 0.5em; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;">.exe file</td><td style="box-sizing: border-box; font-weight: normal; border-top: 0px solid oklch(0.92 0.004 286.32); border-right: none; border-bottom: 0.5px solid rgba(0, 0, 0, 0.098); border-left: 0px solid oklch(0.92 0.004 286.32); border-image: initial; margin: 0px; padding: 0.5em; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;">No executable</td></tr><tr style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;"><td style="box-sizing: border-box; font-weight: normal; border-width: 0px 0.5px 0.5px 0px; border-style: solid; border-color: oklch(0.92 0.004 286.32) rgba(0, 0, 0, 0.098) rgba(0, 0, 0, 0.098) oklch(0.92 0.004 286.32); border-image: initial; margin: 0px; padding: 0.5em; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;">Execution speed</td><td style="box-sizing: border-box; font-weight: normal; border-width: 0px 0.5px 0.5px 0px; border-style: solid; border-color: oklch(0.92 0.004 286.32) rgba(0, 0, 0, 0.098) rgba(0, 0, 0, 0.098) oklch(0.92 0.004 286.32); border-image: initial; margin: 0px; padding: 0.5em; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;">Faster</td><td style="box-sizing: border-box; font-weight: normal; border-top: 0px solid oklch(0.92 0.004 286.32); border-right: none; border-bottom: 0.5px solid rgba(0, 0, 0, 0.098); border-left: 0px solid oklch(0.92 0.004 286.32); border-image: initial; margin: 0px; padding: 0.5em; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;">Slower</td></tr><tr style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;"><td style="box-sizing: border-box; font-weight: normal; border-width: 0px 0.5px 0.5px 0px; border-style: solid; border-color: oklch(0.92 0.004 286.32) rgba(0, 0, 0, 0.098) rgba(0, 0, 0, 0.098) oklch(0.92 0.004 286.32); border-image: initial; margin: 0px; padding: 0.5em; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;">Error reporting</td><td style="box-sizing: border-box; font-weight: normal; border-width: 0px 0.5px 0.5px 0px; border-style: solid; border-color: oklch(0.92 0.004 286.32) rgba(0, 0, 0, 0.098) rgba(0, 0, 0, 0.098) oklch(0.92 0.004 286.32); border-image: initial; margin: 0px; padding: 0.5em; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;">All errors at end</td><td style="box-sizing: border-box; font-weight: normal; border-top: 0px solid oklch(0.92 0.004 286.32); border-right: none; border-bottom: 0.5px solid rgba(0, 0, 0, 0.098); border-left: 0px solid oklch(0.92 0.004 286.32); border-image: initial; margin: 0px; padding: 0.5em; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;">Stops at first error</td></tr><tr style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;"><td style="box-sizing: border-box; font-weight: normal; border-top: 0px solid oklch(0.92 0.004 286.32); border-right: 0.5px solid rgba(0, 0, 0, 0.098); border-bottom: none; border-left: 0px solid oklch(0.92 0.004 286.32); border-image: initial; margin: 0px; padding: 0.5em; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;">Debugging</td><td style="box-sizing: border-box; font-weight: normal; border-top: 0px solid oklch(0.92 0.004 286.32); border-right: 0.5px solid rgba(0, 0, 0, 0.098); border-bottom: none; border-left: 0px solid oklch(0.92 0.004 286.32); border-image: initial; margin: 0px; padding: 0.5em; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;">Difficult</td><td style="box-sizing: border-box; font-weight: normal; border-top: 0px solid oklch(0.92 0.004 286.32); border-right: none; border-bottom: none; border-left: 0px solid oklch(0.92 0.004 286.32); border-image: initial; margin: 0px; padding: 0.5em; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;">Easier</td></tr></tbody></table>

<div class="sc-MHKXp dNlhAz table-toolbar" style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent; position: absolute; top: 8px; right: 8px; z-index: 10; display: flex; gap: 4px; border-radius: 4px; opacity: 0; transition: opacity 0.2s; transform: translateZ(0px); will-change: opacity;">  
</div></div>### 4.2.3 BNF (Backus-Naur Form)

**Purpose:** Formal mathematical way of defining syntax unambiguously.

**Components:**

- Set of terminal symbols
- Set of non-terminal symbols
- Set of production rules

**Example:**

<div class="sc-zOxLx iJoNFs code-block" id="bkmrk-%3Ctext%3E-%3Cdigit%3E-%3A%3A%3D-0" style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent; position: relative; width: 647px; min-width: 35ch;"><div class="sc-cgHfjM iurpwe" style="box-sizing: border-box; font-weight: bold; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px 10px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent; display: flex; align-items: center; color: rgb(0, 0, 0); font-size: 14px; line-height: 1; border-top-left-radius: 8px; border-top-right-radius: 8px; height: 34px; background-color: rgb(238, 238, 238);">&lt;TEXT&gt;</div><div class="sc-iQqcaB jMJkfu" style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent; position: sticky; top: 28px; z-index: 10;"><div class="sc-kcLKEh sc-dntSTA sc-dFVmKS sc-fcSHUR kIsGeY jNoXSY cklChQ kmrhIw code-toolbar" style="box-sizing: border-box; font-weight: normal; border: none; margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent; width: auto; height: 24px; flex: 0 0 auto; inset: auto 0.5rem 0.3rem auto; opacity: 0; border-radius: 4px; gap: 4px; display: flex; justify-content: flex-start; align-items: center; flex-direction: row; position: absolute; background-color: rgb(238, 238, 238); transition: opacity 0.2s; transform: translateZ(0px); will-change: opacity;">  
</div></div><div class="sc-fpikKz lhQggy split-view-wrapper" style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent; display: flex; border-radius: 0px 0px 8px 8px;"><div class="shiki one-light code-viewer source-view shiki-light" style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent; font-family: "', 'Cascadia Code', 'Fira Code", Consolas, Menlo, Courier, monospace; line-height: initial; --color-scrollbar-thumb: rgba(0, 0, 0, 0.15); --color-scrollbar-thumb-hover: rgba(0, 0, 0, 0.2); flex: 1 1 auto; width: 647px; border-radius: inherit; background-color: rgb(250, 250, 250); color: rgb(56, 58, 66);"><div class="sc-jCWzJg ednTDb shiki-scroller" style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0.5em 0px 0.5em 1em; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent; display: block; overflow: auto hidden; position: relative; border-radius: inherit; --gutter-width: 0ch; font-size: 13px;"><div class="shiki-list" style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent; height: 42px; width: 634px; position: relative;"><div style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent; position: absolute; top: 0px; left: 0px; width: 634px; transform: translateY(0px);"><div data-index="0" style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;"><div class="line" style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent; display: flex; align-items: flex-start; width: 634px; line-height: 21px; contain: none; will-change: auto;"><span class="line-content" style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px 1em 0px 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent; white-space: pre; flex: 1 1 0%;"><span style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent; white-space: pre; overflow-wrap: normal;">&lt;digit&gt; ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9</span></span></div></div><div data-index="1" style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent;"><div class="line" style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent; display: flex; align-items: flex-start; width: 634px; line-height: 21px; contain: none; will-change: auto;"><span class="line-content" style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px 1em 0px 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent; white-space: pre; flex: 1 1 0%;"><span style="box-sizing: border-box; font-weight: normal; border: 0px solid oklch(0.92 0.004 286.32); margin: 0px; padding: 0px; outline-color: oklab(0.705 0.00415142 -0.0144141 / 0.5); -webkit-tap-highlight-color: transparent; white-space: pre; overflow-wrap: normal;">&lt;integer&gt; ::= &lt;digit&gt; | &lt;integer&gt; &lt;digit&gt;</span></span></div></div></div></div></div></div></div></div>### 4.2.4 Reverse Polish Notation (RPN)

**Definition:** A method of representing expressions without brackets or special punctuation. Uses postfix notation where operator is placed after variables.

**Example:**

- Infix: A + B
- RPN: A B +

**Advantages:**

- No need for brackets
- No need for operator precedence
- Simpler for machine to evaluate
- No backtracking needed

**Evaluation:**

- Use stack
- When operator encountered, pop two operands, apply operator, push result