EBK COMPUTER SYSTEMS
EBK COMPUTER SYSTEMS
3rd Edition
ISBN: 8220101459107
Author: O'HALLARON
Publisher: YUZU
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
Given the following addresses, which two addresses conflict in the cache: The numb of locations in the cache is 2048, the cahche is indexed by address bits 15 to 5 and the tag bits are from 31 to 16.  (a) 0x0000 0100 (b) 0x0000 1400 (c) 0x0010 0100 (d) 0x0100 0140
5. RetailItem ClassWrite a class named RetailItem that holds data about an item in a retail store. The class should store the following data in attributes: item description, units in inventory, and price. Once you have written the class, write a program that creates three RetailItem objects and stores the following data in them: Description    Units in Inventory    PriceItem #1    Jacket    12    59.95Item #2    Designer Jeans    40    34.95Item #3    Shirt    20    24.95
Write a class named Patient that has attributes for the following data: First name, middle name, and last name Address, city, state, and ZIP code Phone number Name and phone number of emergency contact The Patient class’s _ _init_ _ method should accept an argument for each attribute. The Patient class should also have accessor and mutator methods for each attribute. Next, write a class named Procedure that represents a medical procedure that has been performed on a patient. The Procedure class should have attributes for the following data: Name of the procedure Date of the procedure Name of the practitioner who performed the procedure Charges for the procedure The Procedure class’s _ _init_ _ method should accept an argument for each attribute. The Procedure class should also have accessor and mutator methods for each attribute. Next, write a program that creates an instance of the Patient class, initialized with sample data. Then, create three instances of the Procedure class,…
Knowledge Booster
Background pattern image
Computer Engineering
Learn more about
Need a deep-dive on the concept behind this application? Look no further. Learn more about this topic, computer-engineering and related others by exploring similar questions and additional content below.
Similar questions
SEE MORE QUESTIONS
Recommended textbooks for you
Text book image
Computer Networking: A Top-Down Approach (7th Edi...
Computer Engineering
ISBN:9780133594140
Author:James Kurose, Keith Ross
Publisher:PEARSON
Text book image
Computer Organization and Design MIPS Edition, Fi...
Computer Engineering
ISBN:9780124077263
Author:David A. Patterson, John L. Hennessy
Publisher:Elsevier Science
Text book image
Network+ Guide to Networks (MindTap Course List)
Computer Engineering
ISBN:9781337569330
Author:Jill West, Tamara Dean, Jean Andrews
Publisher:Cengage Learning
Text book image
Concepts of Database Management
Computer Engineering
ISBN:9781337093422
Author:Joy L. Starks, Philip J. Pratt, Mary Z. Last
Publisher:Cengage Learning
Text book image
Prelude to Programming
Computer Engineering
ISBN:9780133750423
Author:VENIT, Stewart
Publisher:Pearson Education
Text book image
Sc Business Data Communications and Networking, T...
Computer Engineering
ISBN:9781119368830
Author:FITZGERALD
Publisher:WILEY