Recitation 9 (Nov. 8) Outline  Virtual memory  Lab 6 hints Reminders  Lab 6:  Get correctness points  Exam 2:  Nov.

Download Report

Transcript Recitation 9 (Nov. 8) Outline  Virtual memory  Lab 6 hints Reminders  Lab 6:  Get correctness points  Exam 2:  Nov.

Recitation 9 (Nov. 8)
Outline
 Virtual memory
 Lab 6 hints
Reminders
 Lab 6:
 Get correctness points
 Exam 2:
 Nov. 16 (Next Tue)
Minglong Shao
[email protected]
Office hours:
Thursdays 5-6PM
Wean Hall 1315
Virtual memory (VM)
 One of the most important concepts in CS
 Why use virtual memory (VM)



Use RAM as a cache for disk
Easier memory management
Access protection
Virtual memory
Memory
0:
1:
Page Table
Virtual
Addresses
0:
1:
Physical
Addresses
CPU
P-1:
N-1:
Disk
Page, page table, page hits, page faults
Demand paging
Conceptual address translation
 Higher bits of address (page number) mapped from
virtual addr. to physical addr.
 Lower bits (page offset) stay the same.
p p–1
n–1
virtual page number (VPN)
page offset
0
virtual address
address translation
m–1
p p–1
physical page number (PPN)
0
page offset
physical address
Address translation through page table
 Translation
 Separate (set of) page table(s) per process
 VPN forms index into page table (points to a page table entry)
page table base register
VPN acts
as
table index
if valid=0
then page
not in memory
virtual address
n–1
p p–1
virtual page number (VPN)
page offset
0
valid access physical page number (PPN)
m–1
p p–1
physical page number (PPN)
page offset
physical address
0
Integrating VM and cache
 Most caches are physically addressed
 Perform address translation before cache lookup
 Another cache: Translation Lookaside Buffer
hit
PA
VA
CPU
miss
TLB
Lookup
miss
Cache
hit
Translation
data
Main
Memory
Address translation with TLB
n–1
p p–1
0
virtual page number
page offset
valid
.
virtual address
tag physical page number
.
TLB
.
=
TLB hit
physical address
tag
index
valid tag
byte offset
data
Cache
=
cache hit
data
Example
 Understand end-to-end addr. translation




20-bit virtual addresses
18-bit physical addresses
Page size is 1024 bytes
TLB is 2-way associative with 16 total entries
Example: TLB and page table
Part 1
 A. Virtual address
TLBT
19
18
17
16
TLBI
15
14
13
12
11
10
9
8
7
6
VPN
5
4
3
2
1
0
3
2
1
0
VPO
 B. Physical address
17
16
15
14
13
PPN
12
11
10
9
8
7
6
5
4
PPO
Part 2
Virtual address 0x78E6
 A. 078E6 = 0000 0111 1000 1110 0110
 B. Address translation
parameter
VPN
Value
0x01E
Parameter
TLB hit?
Value
N
TLB Index
TLB Tag
0x6
0x03
Page fault?
PPN
N
0x57
 C. Physical address
01 0101 1100 1110 0110
Part 2
Virtual address 0x04AA4
 A. 04AA4 = 0000 0100 1010 1010 0100
 B. Address translation
parameter
VPN
Value
0x012
Parameter
TLB hit?
Value
Y
TLB Index
TLB Tag
0x2
0x02
Page fault?
PPN
N
0x68
 C. Physical address
01 1010 0010 1010 0100
End-to-end address translation
 Section 10.6.4: a concrete example
 Read carefully and solve practice problem 10.4
 Multi-level page table
Malloc Lab (Lab 6)
 Submit twice

Checkpoint submission:


Final submission:




Only check correctness: 15 pts
Correctness: 10 pts
Performance: 60 pts
Interposition test: 5 pts
Style: 5 pts
 Start early!!
 Get correctness points this week
Design options
 Organize free blocks



Implicit free list
Explicit free list
Segregate lists/search trees
 Find free blocks



First fit/next fit
Blocks sorted by address with first fit
Best fit
 Large design space

Step by step
Example implementation
 Section 10.9.12
 Understand every line of the code
 Implicit free list + immediate boundary tag
coalescing + first fit
 Code is available at
http://csapp.cs.cmu.edu/public/ics/code/vm/malloc.c
 Use it as a starting point
Block format
Header
32 bits
Pointer returned
by malloc
(Block Pointer (bp))
Payload
Footer
>= what user asked
for in malloc
32 bits
Header/footer format
3
31
size
2
1
0
0
0
a
 Double word alignment

Three lower-order bits of size always 0
 Pack size and allocated bits into a single integer

Size = 24 (0x18). Block is allocated
Header = 0 x18 | 0x1 = 0x19
Heap format
Allocated and Free Blocks
4 bytes
Prologue
Pad
8|1 8|1
Epilogue
HDR
Double Word Alignment
(8 bytes)
FTR HDR
FTR
0|1
Very useful macros
 #define WSIZE 4
 #define DSIZE 8
 #define CHUNKSIZE (1<<12)
 #define OVERHEAD 8
Very useful macros
 #define PACK(size, alloc) ((size) | (alloc))
 #define GET(p) (*(size_t *)(p))
 #define PUT(p, val) (*(size_t *)(p) = (val))
 #define GET_SIZE(p) (GET(p) & ~0x7)
 #define GET_ALLOC(p) (GET(p) & 0x1)
Very useful macros
 #define HDRP(bp)
((char *)(bp) - WSIZE)
 #define FTRP(bp)
((char *)(bp) + GET_SIZE(HDRP(bp)) - DSIZE)
 #define NEXT_BLKP(bp)
((char *)(bp) + GET_SIZE(((char *)(bp) - WSIZE)))
 #define PREV_BLKP(bp)
((char *)(bp) - GET_SIZE(((char *)(bp) - DSIZE)))
Initializing the heap
int mm_init(void) {
if ((heap_listp = mem_sbrk(4*WSIZE)) == NULL)
return -1;
PUT(heap_listp, 0);
PUT(heap_listp+WSIZE, PACK(OVERHEAD, 1));
PUT(heap_listp+DSIZE, PACK(OVERHEAD, 1));
PUT(heap_listp+WSIZE+DSIZE, PACK(0, 1));
heap_listp += DSIZE;
if (extend_heap(CHUNKSIZE/WSIZE) == NULL)
return -1;
return 0;
}
Extending the heap
static void *extend_heap(size_t words) {
char *bp;
size_t size;
size = (words % 2) ? (words+1)*WSIZE : words*WSIZE;
if ((int)(bp = mem_sbrk(size)) < 0)
return NULL;
PUT(HDRP(bp), PACK(size, 0));
PUT(FTRP(bp), PACK(size, 0));
PUT(HDRP(NEXT_BLKP(bp)), PACK(0, 1));
return coalesce(bp);
}
Malloc
void *mm_malloc(size_t size) {
size_t asize, extendsize;
char *bp;
if (size <=
if (size <=
asize =
else
asize =
0) return NULL;
DSIZE)
DSIZE+OVERHEAD;
DSIZE*((size+(OVERHEAD)+(DSIZE-1))/DSIZE);
if ((bp = find_fit(asize)) != NULL) {
place(bp, asize);
return bp;
}
extendsize = MAX(asize,CHUNKSIZE);
if ((bp = extend_heap(extendsize/WSIZE)) == NULL)
return NULL;
place(bp, asize);
return bp;
}
Finding first fit
static void *find_fit(size_t asize) {
void *bp;
for (bp = heap_listp;
GET_SIZE(HDRP(bp)) > 0;
bp = NEXT_BLKP(bp))
if (!GET_ALLOC(HDRP(bp))
&& (asize <= GET_SIZE(HDRP(bp))))
return bp;
return NULL;
}
Malloc
void *mm_malloc(size_t size) {
size_t asize, extendsize;
char *bp;
if (size <=
if (size <=
asize =
else
asize =
0) return NULL;
DSIZE)
DSIZE+OVERHEAD;
DSIZE*((size+(OVERHEAD)+(DSIZE-1))/DSIZE);
if ((bp = find_fit(asize)) != NULL) {
place(bp, asize);
return bp;
}
extendsize = MAX(asize,CHUNKSIZE);
if ((bp = extend_heap(extendsize/WSIZE)) == NULL)
return NULL;
place(bp, asize);
return bp;
}
Placing a block in a free block
static void place(void *bp, size_t asize) {
size_t csize = GET_SIZE(HDRP(bp));
if ((csize - asize) >= (DSIZE + OVERHEAD)) {
PUT(HDRP(bp), PACK(asize, 1));
PUT(FTRP(bp), PACK(asize, 1));
bp = NEXT_BLKP(bp);
PUT(HDRP(bp), PACK(csize-asize, 0));
PUT(FTRP(bp), PACK(csize-asize, 0));
}
else {
PUT(HDRP(bp), PACK(csize, 1));
PUT(FTRP(bp), PACK(csize, 1));
}
}
Free
void mm_free(void *bp) {
size_t size = GET_SIZE(HDRP(bp));
PUT(HDRP(bp), PACK(size, 0));
PUT(FTRP(bp), PACK(size, 0));
coalesce(bp);
}
Coalesce: called by mm_free() & extend_heap()
static void *coalesce(void *bp) {
size_t prev_alloc = GET_ALLOC(FTRP(PREV_BLKP(bp)));
size_t next_alloc = GET_ALLOC(HDRP(NEXT_BLKP(bp)));
size_t size = GET_SIZE(HDRP(bp));
if (prev_alloc && next_alloc) { return bp; }
else if (prev_alloc && !next_alloc) { …… }
else if (!prev_alloc && next_alloc) {
size += GET_SIZE(HDRP(PREV_BLKP(bp)));
PUT(FTRP(bp), PACK(size, 0));
PUT(HDRP(PREV_BLKP(bp)), PACK(size, 0));
bp = PREV_BLKP(bp);
}
else { …… }
return bp;
}