本文是我在上UCSD的 CSE 120: Principles of Operating Systems (Winter 2020) 整理的笔记,这一课主要介绍了操作系统里面逻辑内存的概念,包括页(page)和段(segment)的概念和实现。
Introduction
Definition
- Logical memory = a process’s memory
- As viewed (referenced) by a process
- Allocated without regard to physical memory
Problems with sharing memory
The addressing problem
- Compiler generates memory reference
- Unknown where process will be located
The protection problem
- Modifying another process’s memory
The space problem
- The more processes there are, the less memory each individually can have
Logical vs. Physical Addressing
Logical addresses
- Assumes seperate memory starting at 0
- Compiler generated
- Independent of location in physical memory
Convert logical to physical
- Via software: at load time
- Via hardware: at access time
Hardware for Logical addressing
- Base register filled with start address
- To translate logical address, add base
- Achieves relocation
- To more process: change base
Protection
- Bound register works with base register
Is address < bound
- Yes: add to base
- No: invalid address, TRAP
Achieves protection
Memory Registers are part of context
On every context switch
- Load base/bound register for selected process
- Only kernel does loading of these register
- Kernel must be proetced from all processes
Benefit
- Allows each proces to be seperated located
- Protecs each process from all others
Process mempory allocation
Process address space
Text: program instruction
- excute-only, fixed size
Data: varaible (static, heap)
- read/write, variable size
- dynamic allocation by request
Stack: activation records, local variable
- read/write, varibale size
- Automatic growth/shrinkage
Fitting process into memory
- Must find large enough hole
- May not succeed even if enought fragment space
- Even successul, it’s inefficient since space must be allocated for potential growth area
Solution: break process into pieces
- Distribute into available holes
- Two approaches: Segment and Page
Segementation
Segemented Address Space
- Address space is a set of segments
Segment: a linearly addressed memory
- Typically contains logically-related information
- Examples: program code, data, stack
Each segment has an identifier s, and a size N
- s between 0 and S-1, S = max number of segments
Logical addresses are of the form (s, i)
- offset i within segment s, i must be less than N
Example
Segment-based address translation
- Problem: how to translate a logical address (s, i) into physical address a?
Solution: use a segment (translate) table (ST)
- to segment s into base physical address b = ST(s)
- then add b and i
physical address a = ST(s) + i
Segment Table
- One table per process (typically)
Table entry elements
- V: valid bit
- Base: segment location
- Bound: segment size
- Perm: permissions
Location in memory given by
- Segment table base register(hardware)
- Segment table size register(hardware)
Address translation
- physical address a = base of s + i
do a series of checks
- s < STSR? -> is segment identifier valid or not?
- V == 1? -> the corresponding entry is valid?
- i < Bound? -> logical address is out of bound?
- Perm(op) -> that block has required operation(r/w/x)?
Then access that physical address
Sizing the segment table
Given 32 bit logical, 1 GB physical memory (max)
- 5 bit segment number, 27 bit offset
Logical address
Segement s: number of bits n specifies maxsize of table, where number of entries = $2^n$
- if 32 entries, n = 5
Offset i: number of bits n specifies maxsize of segment
- 27 bits needed to size up to 128MB
segment table
- V: 1 bit
Base: number of bits needed to address physical memory
- 30 bits needed to address 1GB
Bound: number of bits needed to specify max segment size
- 27 bits needed to size up to 128MB
Perm: assume 3 bit (r/w/x)
one entry: $1 + 30 + 27 + 3 + … = 61$+ bits $\approx$ 8 bytes
- whole table: 32 * 8 = 256 bytes
Pros and Cons
Pros: Each segment can be
- located independently
- seperately protected
- grown/shrunk independently
- Segments can be shared by processes (via segment table)
Cons: Variable-size allocation
- Difficult to find holes in physical memory
- External fragmentation
Paging
Paged Address Space
Logical (process) memory
- Linear sequence of pages
Physical memory
- Linear sequence of frames
Pages and frames
- Frame: a physical unit of information
- A page fits exactly into a frame
- Fixed size, all pages/frames same size
Page-based Logical Addressing
Form of logical address: (p, i)
- p is page number, 0 to N - 1
- i is offset within page, since page size is fixed, i is guaranteed to be less than page size, no need to check
Size of logical address space
- $N_L$ = max number of pages
- $N_L \times$ page size = size of logical address space
Frame-based Physical Addressing
Form of physical address: (f, i)
- f is frame number, 0 to N - 1
- i is offset within frame, less than frame size
Size of physical address space
- $N_p$ = max number of frames
- $N_p \times$ frame size = size of physical address space
Page-based address translation
- Problem: how to translate logical address (p, i) into physical address (f, i)
Solution: use a page (translation) table PT
- translate page p into frame f = PT(p)
- then concatenate f and i
Physical address (f, i) = PT(p) || i = (PT(p), i)
Page table
- Each page of logical memory correspondings to entry in page table
- Page table maps logical page into frame of physical memory
- One table per process (typically)
Table entry elements
- V: valid bit
- DPB: demand paging bits
- Frame: page location
Location in memory given by
- Page table base register(PTBR) (hardware)
- Page table size register(PTSR) (hardware)
Address translation
- Physical address = frame of p || offset i
Do a series of checks (similar to segmenatation)
- p < PTSR?
- V == 1?
- Perm(op)?
Sizing the page table
Given 32 bit logical, 1 GB physical memory (max)
- 20 bit page number, 12 bit offset
Logical address
- page p: 20 bits to address $2^{20} =$ 1M entries
- offset i: 12 bits, page size = frame size = $2^{12} =$ 4096 bytes.
Page table
- V: 1 bit
- DPB: 3 bits
- Frame: 18 bits to address $2^{30}/2^{12}$ frames
- Perm: 3bits
- One entry: $1+3+18+3+…= 25$+ bits $\approx$ 4 bytes
- Whole table size = 1M * 4 = 4 MB
Address translation
Segments vs. Pages
Segment is good “logical” unit of information
- Can be sized to fit any contents
- Makes sense to share (e.g., code, data)
- Can be protected according to contents
Page is good “physical” unit of information
- Simple memory management
Combining segments and pages
Logical memory
- composed of segments
Each segment
- composed of pages
Segment table
- Maps each segment to a page table
Page tables
- Maps each page to physical page frames
Address Translation
- Logical address: [segment s, page p, offset i]
Do various checks
- s < STSR, V == 1, p < bound, perm(op)
- May get a segmentation violation
Use s to index segment table to get page table
- Use p to index page table to get frame f
Physical address = concatenate (f, i)
More on addressing
Cost of translation
Each lookup costs another memory reference
- For each reference, additional references required
- Slows machine down by factor of 2 or more
Take advantage of locality of reference
- Most references are to a small number of pages
- Keep translation of these in high-speed memory
Problem: don’t know which pages till accessed
Translation Look-aside Buffer (TLB)
- Fast memory keeps most recent translations
- If key matches, get frame number
else wait for normal translation (in parallel)
Translation Cost with TLB
Cost is determined by
- Speed of memory: ~100 nsec
- Speed of TLB: ~5 nsec
- Hit ratio: fraction of refs satisfied by TLB, ~99%
Speed with no address translation: 100 nsec
Speed with address translation
- TLB miss: 200 nsec (100% slowdown)
- TLB hit: 105 nsec (5% slowdown)
- Average: 105 x 0.99 + 200 x 0.01 ~ 106 nsec
TLB Design Issues
The larger the TLB
- the higher the hit rate
- the slower the reponse
- the greater the expense
TLB has a major effect on performance!
- Must be flushed on context switched
- Alternative: tagging entries with PIDs