Computer Systems: A Programmer's Perspective (3rd Edition)
Computer Systems: A Programmer's Perspective (3rd Edition)
3rd Edition
ISBN: 9780134092669
Author: Bryant, Randal E. Bryant, David R. O'Hallaron, David R., Randal E.; O'Hallaron, Bryant/O'hallaron
Publisher: PEARSON
bartleby

Concept explainers

Expert Solution & Answer
Book Icon
Chapter 9, Problem 9.18HW

Explanation of Solution

Modify the allocator to perform constant-time coalescing requires both a header and a footer for each block:

In the “Section 9.9.12 (mm.c)”, remove the red color text and add the highlighted lines which is represented in the below code. The modified “mm.c” file is as follows:

#define MAX(x, y) ((x) > (y)? (x) : (y))

/* Pack a size and allocated bit into a word */

#define PACK(size, alloc)  ((size) | (alloc))

// Define a pack with size and allocated bit

#define PACK(size, alloc, prev_alloc)  ((size) | (alloc) | (prev_alloc << 1))

/* Read and write a word at address p */

#define GET(p)       (*(unsigned int *)(p))

/* Read the size and allocated fields from address p */

#define GET_SIZE(p)  (GET(p) & ~0x7)

#define GET_ALLOC(p) (GET(p) & 0x1) 

// Define allocated fields

#define GET_PREV_ALLOC(p) ((GET(p) >> 1) & 0x1)

/* Given block ptr bp, compute address of its header and footer */

#define HDRP(bp)       ((char *)(bp) - WSIZE)

if ((heap_listp = mem_sbrk(4 * WSIZE)) == (void *)-1)

return -1;

PUT(heap_listp, 0);                /* Alignment padding */

PUT(heap_listp + (1 * WSIZE), PACK(DSIZE, 1)); /* Prologue header */

PUT(heap_listp + (2 * WSIZE), PACK(DSIZE, 1)); /* Prologue footer */

PUT(heap_listp + (3 * WSIZE), PACK(0, 1)); /* Epilogue header */

// Call PUT() function for Prologue header

PUT(heap_listp + (1 * WSIZE), PACK(DSIZE, 1, 1)); /* Prologue header */

// Call PUT() function for Prologue footer

PUT(heap_listp + (2 * WSIZE), PACK(DSIZE, 1, 1));

// Call PUT() function for Epilogue header

PUT(heap_listp + (3 * WSIZE), PACK(0, 1, 1));

heap_listp += (2 * WSIZE);

/* $end mminit */

return NULL;

/* Adjust block size to include overhead and alignment reqs. */

if (size <= DSIZE)                                        

asize = 2 * DSIZE; 

else

asize = DSIZE * ((size + (DSIZE)+(DSIZE - 1)) / DSIZE);

// Check size to adjust block

if (size <= WSIZE)

// Assign size value

asize = DSIZE;

// Otherwise

else

// Compute size to add overhead and alignment requirements

asize = DSIZE * ((size + (WSIZE)+(DSIZE - 1)) / DSIZE);

/* Search the free list for a fit */

if ((bp = find_fit(asize)) != NULL) { 

}

/* $begin mmfree */

PUT(HDRP(bp), PACK(size, 0));

PUT(FTRP(bp), PACK(size, 0));

// Call PUT() function with size and allocated bit

PUT(HDRP(bp), PACK(size, 0, GET_PREV_ALLOC(HDRP(bp))));

PUT(FTRP(bp), PACK(size, 0, GET_PREV_ALLOC(HDRP(bp))));

// Check allocated bit

if (GET_ALLOC(HDRP(NEXT_BLKP(bp))))

// Call PUT() function

PUT(HDRP(NEXT_BLKP(bp)), PACK(GET_SIZE(HDRP(NEXT_BLKP(bp))), 1, 0));

// Otherwise

else {

// Call PUT() function for HDRP

PUT(HDRP(NEXT_BLKP(bp)), PACK(GET_SIZE(HDRP(NEXT_BLKP(bp))), 0, 0));

// Call PUT() function for FTRP

PUT(FTRP(NEXT_BLKP(bp)), PACK(GET_SIZE(HDRP(NEXT_BLKP(bp))), 0, 0));

}

// Call coalesce() function to fill values

coalesce(bp);

 }

/* $begin mmfree */

static void *coalesce(void *bp)

 {

size_t prev_alloc = GET_ALLOC(FTRP(PREV_BLKP(bp)));

// Call GET_PREV_ALLOC() function and the return value is assign to prev_alloc

size_t prev_alloc = GET_PREV_ALLOC(HDRP(bp));

size_t next_alloc = GET_ALLOC(HDRP(NEXT_BLKP(bp)));

size_t size = GET_SIZE(HDRP(bp));

else if (prev_alloc && !next_alloc) {      /* Case 2 */

size += GET_SIZE(HDRP(NEXT_BLKP(bp)));

PUT(HDRP(bp), PACK(size, 0));

PUT(FTRP(bp), PACK(size, 0));

// Call PUT() function for HDRP with PACK size

PUT(HDRP(bp), PACK(size, 0, 1));

// Call PUT() function for FTRP with PACK size

PUT(FTRP(bp), PACK(size, 0, 1));

}

else if (!prev_alloc && next_alloc)

   {

/* Case 3 */

   size += GET_SIZE(HDRP(PREV_BLKP(bp)));

   PUT(FTRP(bp), PACK(size, 0));

   PUT(HDRP(PREV_BLKP(bp)), PACK(size, 0));

   // Call PUT() function for HDRP with PACK size

   PUT(FTRP(bp), PACK(size, 0, 1));

   // Call PUT() function for FTRP with PACK size

   PUT(HDRP(PREV_BLKP(bp)), PACK(size, 0, 1));

   bp = PREV_BLKP(bp);

   }

else {

/* Case 4 */

   size += GET_SIZE(HDRP(PREV_BLKP(bp))) +

   GET_SIZE(FTRP(NEXT_BLKP(bp)));

   PUT(HDRP(PREV_BLKP(bp)), PACK(size, 0));

   PUT(FTRP(NEXT_BLKP(bp)), PACK(size, 0));

   // Call PUT() function for HDRP with PACK size

   PUT(HDRP(PREV_BLKP(bp)), PACK(size, 0, 1));

   // Call PUT() function for FTRP with PACK size

   PUT(FTRP(NEXT_BLKP(bp)), PACK(size, 0...

Blurred answer
Students have asked these similar questions
For this assignment, you need to implement link-based List and derivative ADTs in Java.  To complete this, you will need the following:   A LinkNode structure or class which will have two attributes - a data attribute and a pointer attribute to the next node.  The data attribute of the LinkNode should be the Money class of Lab 1. A Singly Linked List class which will be composed of three attributes - a count attribute, a LinkedNode pointer/reference attribute pointing to the start of the list and a LinkedNode pointer/reference attribute pointing to the end of the list. Since this is a class, make sure all these attributes are private. The attribute names for the Node and Linked List are the words in bold in #1 and #2.  For the Linked List, implement the most common linked-list behaviors as explained in class - getters/setters/constructors/destructors for the attributes of the class, (a) create new list, (b) add data, (c) delete data, (d) find data, (e) count of data items in the…
This is supposed to test your understanding of Java streams and lambda expressions. Specifically how to create a nonparallel and parallel stream. Intermediate operations, such as map, flatMap, and filter. The terminal operation collect.  How to work with java lambda functions with these operations. And efficient programming. This assignment is not meant to be exhausting, in the ideal situation, you will only have to write 25 lines of code to complete this entire assignment. You are to fill in the code in the StreamsHomeWork.java file. You may find a description of what is to be performed for each function below or in that java file provided. Please keep in mind that all the functions have a timelimit in the milliseconds, the exact time for each function is documented below.   Please fill in the functional code in the StreamsHomeWork.java file and submit the StreamsHomeWork.java file to Grader Than.  Note: The last two functions of the assignment can be used to help you select winning…
Please answer the questions in the picture correctly, and it is done by a team of bartleby experts. Please don't copy paste the answer from the website, because it was my previous question. Not purely answered by a bartlely team expert, but rather taking Chegg's answer. So, please don,t copy paste solution from website. Because many answers from websites are inaccurate, as well as from Chegg
Knowledge Booster
Background pattern image
Computer Science
Learn more about
Need a deep-dive on the concept behind this application? Look no further. Learn more about this topic, computer-science and related others by exploring similar questions and additional content below.
Similar questions
SEE MORE QUESTIONS
Recommended textbooks for you
Text book image
C++ Programming: From Problem Analysis to Program...
Computer Science
ISBN:9781337102087
Author:D. S. Malik
Publisher:Cengage Learning