presentation source

Download Report

Transcript presentation source

Chapter 11 - Virtual Memory
– Fragmentation of contiguous allocation can be
eliminated through compaction (Figure 11.1).
– Another technique is to avoid contiguous
memory allocation.
– One way is to separate the program into
different segments.
– A natural division is separating code from data.
One could use two relocation registers (Figure
11.2).
• Rethinking Memory Allocation
– Result is two separate physical address (Figure 11.3)
– Why stop there? Why not 4 relocation (a.k.a.
segment) registers? Figure 11.4 -- divide a portion of
the 16-bit memory address into a 2-bit segment
address and a 14-bit offset. Think of this as an array
of base/bound relocation registers on a per-process
basis.
– Can now get more creative physical address
assignments where the process appears to have
contiguous memory (Figure 11.5).
– Note that now there can be holes in the logical
address space (Figure 11.6 & 11.7).
• Noncontiguous Logical Address Spaces
– Varying the size of the segments can lead to misuse
of the segment sizes, assuming that the number of
segments is limited.
– Why not just fix the size of the segments? Then, we
can eliminate the “bound” column in the segment
table and agree that all segments are of an equal,
fixed size. We’ll call these new fixed-size segments
pages.
– Page Table Entry - Pointer to physical memory frame.
– Page table - collection of page table entries.
– Again we divide the logical address into separate
portions (4-bit page and 12-bit offset) - Figure 11.8.
• Page Tables
– If the number of pages gets to be too large to store in
registers then we can map the page table into memory
(Figure 11.9).
– Note the addition of a Page Table Base Register in
place of the base register. Now a context switch
involves saving/restoring one register for all the page
mappings rather than a set of registers.
– Can also add a Page Table Length Register so we
know on a per-process basis how large the page table
is.
– Big problem though is now every memory address
requires two memory accesses! Program will run at
1/2 the speed!
• Translation Lookaside Buffer
– Common theme: throw more hardware at the
problem! Use a hardware caching mechanism to
keep most-recently used page table entries in “fast”
parallel search registers.
– Translation Lookaside Buffer (TLB) - set of
associative registers containing page table entries, the
contents of which can be searched in parallel.
– TLB flow chart: Figure 11.11.
– TLB operation with logical address mapping & page
table: Figure 11.13.
– Cache hit - page entry found in TLB
– Cache miss - page entry not in TLB; resort to
memory page table.
• Translation Lookaside Buffer
– Want the cache hit ratio to be high, else paging slows
down to 1/2 memory speed (recall each logical
address reference takes two physical memory
accesses).
– Sample calculation: if cache hit rate = 90 %, then
effective memory access time:
.9 * 1 + (1-.9) * 2 = .9 +.2 = 1.1, representing a 10%
slowdown over a 100% hit ratio.
– Note that TLB will require being “flushed” (all
entries cleared) on a context switch, since a different
page table will be in effect. This cache invalidation
is typically done by OS code.
• TLB & Paging Behavior
– One good reason programs get high cache hit rates is
due to a program’s address locality in space and time.
– Programs tend to stay in one small address range
within a short period of time.
– Useful to analyze a program’s behavior and see how
it affects paging performance:
•
•
•
•
Assume we are traversing an array that spans many pages.
Each page is 4 KB in size (1024 4-byte words of the array).
1st word of each page will cause a page cache miss.
Next 1023 words per page will use the already-cached page
entries.
• Therefore, 2+1023 (=1025) memory accesses to fetch 1024
words = 1.001 memory cycles per word. Pretty efficient!
• TLB & Paging Behavior
– What if the program traverses the array with a pagesized stride? This is the worst case scenario
(assuming that there is only one page table entry that
must be recycled). Each array reference will cause a
TLB miss and require a page table lookup.
– Figure 11.14: Note assumption that conditions have
to be just right to cause this behavior (size of
elements in the array have to be exactly traversed in
page-sized units).
– So, the TLB model assumes that a program
“behaves” itself (or that the compiler performs
memory layout to minimize page-sized strides).
• More Paging terminology
– A program’s logical address space is divided up into
same-sized pages.
– The physical address space is divided up into samesized page frames (use of the word frame should key
in physical memory).
– Use of paging eliminates external fragmentation as
seen with dynamic memory allocation (no holes
outside of the segments).
– Paging does, however, suffer from internal
fragmentation (portion of any page or page frame that
is not actually used by the program but unavailable
for use by any other program).
• More Paging terminology
– Illustrative to look at Figure 11.16. It shows a typical
page table entry with all the fields. Assumption is a
4KB page size (12 bits; 212 = 4096).
•
•
•
•
1-bit “present” bit (used later)
3-bit protection (bit 0 = read, bit 1 = write, bit 2 = execute)
Unused field (used later)
Base address (no need to store the offset bits)
• Skip section 11.3
• Space-sharing memory
– Memory is the type of resource that can be spaceshared.
– A useful way to share memory is to use disk space as
a holding space.
• “Ancient” Memory Sharing Techniques
– Swapping: move the entire address space of a
program to disk, load up another program, repeat.
– Figure 11.18.
– Program speeds approximate disk speeds as swapping
increases.
– Suitable for interactive response, assuming disk
drives and O/S response is quick enough.
– Not terribly efficient, however!
– Famous book quote: User needs are the primary
concern in designing what operating system services
to offer. Efficiency is the primary concern in
designing how to implement operating system
services.
• “Ancient” Memory Sharing Techniques
– Overlays: older technique that placed the burden of
loading/unloading pieces of a program based on
evaluating the subroutine/function usage patterns.
– Allowed programs that were larger than physical
memory to run!
– Lot of effort to create the “overlay tree”, though.
– Figure 11.19 is an example.
– DOS overlays are a special case of how maintaining
an old design (the 640K PC) really muddied the
memory management waters of newer PCs for years
(Figure 11.20’s plethora of memory styles is mindnumbing).
• Virtual Memory
– Combines the advantage of swapping (multiple
programs space-sharing memory) and overlays (only
keep the parts of a program in memory that are
currently needed).
– Take the paging hardware we’ve already learned and
add these rules:
• a program doesn’t have to have all it’s page table entries
mapped before it runs.
• A reference to a missing page frame will cause an interrupt
(a page fault), which will transfer control to the O/S.
• The page fault handler will fill in the page table entry and
restart the process.
– The result is an illusion to the program of virtual
memory (Figure 11.21).
• Virtual Memory
– To support VM, we need the following PTE field:
• present bit - if = 1, the page is present in memory & the
base address field represents a valid page frame number. If
= 0, the page reference is to a legal non-mapped page.
– A memory access will now cause the following
possible events (algorithm on p. 459):
• Split logical address into page and offset values.
• Check PTE entry for the page and see if the protection bits
allow the appropriate access. If not, raise a protection
violation interrupt.
• Check PTE present bit. If 1, the frame # in the PTE is
valid. Generate the physical address by combining the
physical frame number and the offset. If 0, generate a page
fault interrupt.
• Operating System Support for VM
– OS manages a swap area - section of disk set aside
for keeping pages (try swap -l/swap -a on xi or free
on Linux).
– Four cases where the OS has to manage page tables:
•
•
•
•
Process creation
Process dispatch (context switch)
Page fault
Process exit
– Figure 11.22 diagrams the VM events.
– Let’s step through each of the cases!
– Process creation
• Calculate the number of pages needed for static code &
data.
• Allocate paging space on the swap partition.
• Allocate memory-resident page table.
• Initialize swap area with static binary modules.
• Initialize page table fields (all non-present with appropriate
protections).
• Update the process descriptor (location of page table & the
per-process swap area information).
– Process dispatch (context switch)
• Invalidate the TLB (it’s full of the previous process’s page
table entries).
• Load page table base register with the address of the new
process’s page table.
– Page fault (page fault handler code)
• Find an empty page frame. If all frames are in use this will
involve stealing some other frame (and possibly swapping
it out if it contains modified data).
• Read in the logical page from the process’s swap area into
the new frame.
• Fix the PTE: set the present bit to 1 and set the frame
number to the new frame value.
• Restart the instruction that caused the page fault.
– Process exit
• Free memory used by page table.
• Free disk space on swap partition used by process.
• Free the page frames the process was using.
• Cost Evaluation of VM
– Just as the TLB acted like a cache, where high cache
hit rates are required for reasonable operation, the
page fault rate (# of page faults/unit of time) needs to
be low. If not, the program starts to run at disk
speed!
– Page faults are dramatically more expensive than a
TLB miss -- look at all the software operations
involved in a page fault.
• Cost Evaluation of VM
– Assume memory access time = 200 x 10-9 secs if the
frame is in memory.
– Assume that the page fault interrupt handler takes 40
x 10-6 secs to execute it’s code.
– Assume reading the page from the swap partition on
the disk takes 20 x 10-3 seconds.
– The disk read time is 6 orders of magnitude larger
than the memory access time and will dominate, so
we can ignore the time spent executing the page fault
handler (it’s 1/500th of the disk read time :).
– The result is that a page fault memory address runs
100,000 times slower than a non-page fault memory
address!
• Cost Evaluation of VM
– To run with a 10% slowdown would require that the
program achieve one page fault per one million
memory accesses!
– Luckily, as mentioned with TLB cache hits, program
exhibit spatial and temporal locality.
– The next instruction or data reference is usually close
to the current instruction in memory and close in
future execution.
– The result is that a program doesn’t usually demand
that all of it’s logical pages be assigned to physical
pages. Book: for typical programs, 25% to 50% of
mapped pages result in acceptable low page fault
rates.
• Cost Evaluation of VM
– Ideally the operating system should only map those
pages that fit in the current program’s locality region
(some call this a memory footprint or set of resident
pages).
– Since not all of each program has to be in memory at
the same time we can run more programs in memory,
as long as we have enough physical memory to hold
all the footprints.
• VM Management
– Figure 11.23 diagrams typical VM data structures
required by the OS.
• VM Management
– OS data structures:
• Page frames - physical memory available for user
programs.
• Page tables - per-process memory-resident page tables.
• Free page frame list - list of page frames that are not
assigned in any page tables (free to allocate).
• Modified free page frame list - list of free page frames that
are “dirty” (need to be written back to the paging area on
disk prior to re-use).
• Replacement algorithm tables - page replacement
algorithm state information (more in Chapter 12).
• Swap area - Area on disk containing process pages that are
not allocated to physical frames.
• VM Management
– Figure 11.24 shows VM events and procedures.
• Bold text = events that cause changes in the tables (page
fault, timer context switch & process creation).
• Rounded corner shaded rectangles = memory management
procedures.
• Rectangles = OS managed data structures.
– Paging daemon - a special process that is invoked
occasionally by the operating system (the timer
interrupt is a good place :). The paging daemon
manages the free page frame list and can call the page
replacement algorithm to start freeing up pages.
– Daemon = attendant spirit (not an evil presence); so
named because they supplement OS services.
• Memory-mapped File I/O
– Explicit file I/O (use of open(), read(), write() and
close()) is similar to paging to a swap area.
– Paging involves implicit I/O that the programmer
isn’t aware of; file I/O involves explicit instructions
that the programmer needs to be aware of to perform
the I/O.
– Both, however, involve reading and writing disk
blocks. The information in the swap area is transient
in that the next page of a process that is swapped out
will overwrite any earlier page. File I/O is not
transient; the file write()s stick.
– Why not use the paging mechanism for use with
persistent file data?
• Memory-mapped File I/O
– File mapping: extension of the VM system that
allows the mapping of file I/O into the virtual address
space.
– Once the mapping is established then file I/O is done
through standard memory operations (notice the
similarity to memory-mapped I/O). No explicit file
I/O system calls are needed!
– Mapping a file to a memory address involves a new
system call to create the mapping (MapFile()) and
one to disconnect the mapping (UnMapFile()).
– Most UNIXes provide a file mapping mechanism via
the mmap() and munmap().
• Memory-mapped File I/O
– Figure 11.25: Differentiates between persistent VM
data (the mapped file) and transient VM data (the file
on disk).
– Figure 11.27: Sample file mapping code.
– Figure 11.26: Effects of the MapFile() call.
– Advantages to file mapping:
• Fewer system calls/unit of I/O (well, sort of -- the page
fault handler is still calling the OS on a page miss).
• Fewer copies of file blocks in buffers (Figure 11.28).
• “Instant” view of the changed data (unlike explicit I/O,
which is usually atomic).
• Skip section 11.11.4 (IBM 801 discussion).