15-213 recitation 8 greg reshko
DESCRIPTION
15-213 Recitation 8 Greg Reshko. Office Hours: Wed 2:00-3:00PM April 7 th , 2003. Outline. Malloc Lab Extensive overview. What does mm-helper.c do ?. Implicit Free List Header with each block – (size / allocated bit) - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/1.jpg)
15-213 Recitation 8Greg Reshko
Office Hours: Wed 2:00-3:00PM
April 7th, 2003
![Page 2: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/2.jpg)
Outline
Malloc Lab Extensive overview
![Page 3: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/3.jpg)
What does mm-helper.c do ?
Implicit Free List Header with each block – (size / allocated bit) No separate Free List – free blocks linked implicitly by
size fields in header
First Fit Searches free list from beginning and picks first block
that is large enough
Immediate Boundary Tag Coalescing Footer (boundary tag), replica of header
![Page 4: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/4.jpg)
Block FormatHeader
Footer
Payload
Pointer returnedby malloc (Block Pointer (bp))
32 bits
32 bits
>= what user askedfor in malloc
![Page 5: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/5.jpg)
Header/Footer Format
Double word alignment Three lower-order bits of size always 0
Pack size and allocated bits into a single integer a=1 if allocated, a=0 otherwise Size = 24 (0x18). Block is allocated Header = 0 x18 | 0x1 = 0x19
0 0 asize
3 2 1 0 31
![Page 6: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/6.jpg)
Heap Format
8|1 8|1 0|1
Double Word Alignment(8 bytes)
4 bytes Pad Prologue Epilogue
Allocated and Free Blocks
Header Footer Header Footer
![Page 7: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/7.jpg)
Useful Macros
#define WSIZE 4 #define DSIZE 8 #define CHUNKSIZE (1<<12) #define OVERHEAD 8
![Page 8: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/8.jpg)
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)
![Page 9: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/9.jpg)
Useful Macros
#define HDRP(bp) (Header)((char *)(bp) - WSIZE)
#define FTRP(bp) (Footer)((char *)(bp) + GET_SIZE(HDRP(bp)) - DSIZE)
#define NEXT_BLKP(bp) (Next block)((char *)(bp) + GET_SIZE(((char *)(bp) - WSIZE)))
#define PREV_BLKP(bp) (Previous block)((char *)(bp) - GET_SIZE(((char *)(bp) - DSIZE)))
![Page 10: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/10.jpg)
Initializing the Heapint 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; }
![Page 11: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/11.jpg)
Extending the Heapstatic 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);}
![Page 12: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/12.jpg)
Mallocvoid *mm_malloc(size_t size) {
size_t asize, extendsize; char *bp;
if (size <= 0) return NULL; if (size <= DSIZE)
asize = DSIZE+OVERHEAD; else
asize = 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;
}
![Page 13: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/13.jpg)
Finding First Fitstatic 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;}
![Page 14: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/14.jpg)
Mallocvoid *mm_malloc(size_t size) {
size_t asize, extendsize; char *bp;
if (size <= 0) return NULL; if (size <= DSIZE)
asize = DSIZE+OVERHEAD; else
asize = 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;
}
![Page 15: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/15.jpg)
Placing a Block in a Free Blockstatic 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));
} }
![Page 16: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/16.jpg)
Mallocvoid *mm_malloc(size_t size) {
size_t asize, extendsize; char *bp;
if (size <= 0) return NULL; if (size <= DSIZE)
asize = DSIZE+OVERHEAD; else
asize = 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;
}
![Page 17: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/17.jpg)
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);
}
![Page 18: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/18.jpg)
Coalesce Called by mm_free() and 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;
}
![Page 19: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/19.jpg)
Adding Debugging Information mm_heapcheck Display “request_id” and “payload” of every active block
request_id malloc request counter (0.. mm_init sets the counter to 0 mm_malloc increments the counter
payload size The memory requested by malloc Can be different from the allocated size!!!
We need to store the info somewhere ?
![Page 20: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/20.jpg)
Allocated Block FormatHeader
Footer
PayloadPointer returnedto user
32 bits
32 bits
>= what user askedfor in malloc
32 bits
32 bits
request_id
payload size
![Page 21: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/21.jpg)
One Way to Implement This
Inside malloc Allocate additional memory in malloc
PUT(bp, request_counter);
PUT(bp + 4, size);
return bp + DSIZE;
Inside Free bp = bp – DSIZE;
![Page 22: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/22.jpg)
Heapcheck
Put all sorts of sanity checks Scan the implicit list
Like the first fit function Print request_id and size
![Page 23: 15-213 Recitation 8 Greg Reshko](https://reader035.vdocuments.us/reader035/viewer/2022062321/56813e60550346895da865cf/html5/thumbnails/23.jpg)
Explicit Lists
Separate Free List Can find a free block quickly
Change Free Block Format Add prev pointer Add next pointer
Where to store free list pointer Only one WORD Can store in unused PAD word
Some functions to add static void insertfree_block(void * freeblkptr); static void removefree_block(void * freeblkptr);