Virtual Memory
Provides a virtual address space that maps to physical memory
How It Works
- Steps
- The process is provided (by the OS) with a virtual address space broken into pages or segments (on 64 bit systems, only pages)
- A running process generates virtual addresses
- The OS translates virtual address into physical addresses, swapping pages or segments as needed
- In modern systems, the CPU uses a memory management unit (MMU) to convert virtual addresses to physical ones quickly
Implementation
Segmentation
- Main goal: To allow programs and data to be broken up into logically independent address spaces to aid sharing and protection
- Breaks up processes into individual segments which the OS swaps in and out
- Looks at memory space per segment of a process (data, text, heap)
- Could combine multiple of those into one segment
- The process defines its own segments (so the programmer needs to be aware of this)
- Allows processes to share segments easily (like how threads work)
- Only used on 32bit systems
Paging
- Main goal: To get a large linear address space without needing more physical memory
- Breaks memory space into evenly sized chunks (pages) which are loaded into and out of physical memory
- Page size is determined by the hardware (typically 4KiB)
- Form of fixed size partitioning
- Page sizes are the unit of allocation to processes
- Generates internal fragmentation, but no external fragmentation
- Paging System
- Pages can be in main memory, in cache, or on disk
- Page Table
- Used to map virtual addresses to physical addresses
- Stores
- Cache?
- Referenced?
- Modified?
- Protection (RW)?
- Present? (in physical memory)
- Page frame number (physical page)
- MMU Operations
- Memory addresses are broken down into a page (the most significant n bits) and an offset (the rest of the bits)
- The page is converted and the offset is appended to that
- Translation Lookaside Buffer
- Quick access is essential, so common entries are stored in a specialized cache
- Grows as needed, but can still get large
- Keeping it small
- Page table per process
- Multilevel page tables
- Memory accessed when on disk → Page fault
- It restarts the instruction and tries again (as it moves to main memory or cache)
- In modern systems, it looks ahead to try to move memory out of disk ahead of time
- Page Replacement
- Decides what pages to keep quicker access to
- Stores a reference string that tracks what pages were accessed
- Removes consecutive accesses
- Algorithms
- Fist in, first out
- The oldest page is evicted first
- Belady’s Anomaly: There are situations where the fault rate increases when the memory amount increases
- Least Recently Used
- Evicts the most ‘stale’ page
- Adding new memory will never increase the fault rate
- Inefficient because it requires in-place list of modifications
- Not Frequently Used
- Tracks the number of times that pages are used, evicting the least used page
- Good locally but it remembers everything so it suffers when task types change
- Aging
- Approximates LRU
- Uses the referenced and modified tags (to avoid the in-place list)
- Reference bit
- Set on load or access
- Cleared on a clock tick (only times when the current process is running)
- Modified bit
- Set on write
- Cleared when the page is copied back to disk (swapped)
- Reference bit
- The referenced and modified bits represent numbers zero to four in binary
- On page fault, evict the lowest (numerically)
- Clock (Second Chance)
- Proceeds using a round robin approach
- Upon a page fault, if the reference bit of the current target is
- 0 → that page is replaced and the target moves
- 1 → the target’s reference bit is cleared, the target moves, and the process repeats
- Very resilient when tasks change behaviors
- Working Set
- Uses a time window to define a working set of pages that are most active
- On a fault, remove the first page that is outside of the working set time range. If none, just remove the oldest.
- Prevents having to go over every page during a page fault
- Fist in, first out
- Handling page faults
- Save remaining context. Identify needed page
- If the page number is not legitimate or the process is not able to access it→ terminate the process
- Select victim page (what to replace)
- If the victim page has been modified, save the victim
- Load the new page
- Can share pages to save memory when loading dynamic libraries
- Requires explicit OS and compiler support