Linked List for Dynamic Partitioning

A linked list is made up of nodes, each containing a data element and a pointer to the next node in the list. In dynamic partitioning, each node represents a memory block that can be allocated to processes. The linked list initially represents the entire available memory as a single large block.

Dynamic Partitioning in Memory Management

Dynamic partitioning is a memory management technique that divides memory into variable-sized segments to accommodate multiple processes simultaneously. Unlike fixed partitioning, it allocates exactly the amount of memory each process needs, minimizing waste.

Dynamic Memory Partitioning Initial: Single Large Free Block Process A Free Space Process B Free Space After Allocation: Process C Free Free Process B Free Space

How Dynamic Partitioning Works

  • Initially, the entire available memory is considered as one large free block

  • When a process requests memory, the system searches for a free block large enough using allocation algorithms (First Fit, Best Fit, or Worst Fit)

  • The appropriate block is allocated to the requesting process

  • If the allocated block is larger than needed, the remaining portion is returned to the free memory pool

  • When a process terminates, its allocated memory is deallocated and merged with adjacent free blocks if possible

Fragmentation Issues

Dynamic partitioning suffers from fragmentation the division of memory into small, unusable free blocks.

Type Description Cause
Internal Fragmentation Wasted space within allocated blocks Allocated block larger than requested memory
External Fragmentation Free memory exists but not contiguous Multiple small non-adjacent free blocks

Implementation of Linked List for Dynamic Partitioning

The linked list implementation uses nodes to represent memory blocks. Each node contains size information, allocation status, and a pointer to the next block.

typedef struct node {
   int size;           // size of the memory block
   int free;           // flag: 1 = free, 0 = allocated
   struct node* next;  // pointer to next node
} Node;

Node* head = NULL;     // head of the linked list

// Initialize the memory with given size
void initialize(int size) {
   head = (Node*)malloc(sizeof(Node));
   head->size = size - sizeof(Node);
   head->free = 1;     // initially free
   head->next = NULL;
}

// Allocate memory block of requested size
void* allocate(int size) {
   Node* current = head;
   
   while (current != NULL) {
      if (current->free && current->size >= size) {
         int remaining_size = current->size - size;
         
         // Split block if remaining size is sufficient
         if (remaining_size >= sizeof(Node)) {
            Node* new_node = (Node*)((char*)current + sizeof(Node) + size);
            new_node->size = remaining_size - sizeof(Node);
            new_node->free = 1;
            new_node->next = current->next;
            
            current->size = size;
            current->free = 0;    // mark as allocated
            current->next = new_node;
         } else {
            current->free = 0;    // allocate entire block
         }
         return (void*)((char*)current + sizeof(Node));
      }
      current = current->next;
   }
   return NULL;  // allocation failed
}

// Deallocate memory and merge adjacent free blocks
void deallocate(void* ptr) {
   Node* current = head;
   
   while (current != NULL) {
      if ((void*)((char*)current + sizeof(Node)) == ptr) {
         current->free = 1;    // mark as free
         
         // Merge with next block if free
         if (current->next != NULL && current->next->free == 1) {
            current->size += sizeof(Node) + current->next->size;
            current->next = current->next->next;
         }
         
         // Merge with previous block if possible
         Node* prev = head;
         while (prev != NULL && prev->next != current) {
            prev = prev->next;
         }
         if (prev != NULL && prev->free == 1) {
            prev->size += sizeof(Node) + current->size;
            prev->next = current->next;
         }
         break;
      }
      current = current->next;
   }
}

Key Components

  • size Size of the memory block in bytes

  • free Flag indicating whether block is free (1) or allocated (0)

  • next Pointer to the next node in the linked list

Allocation Algorithms

Algorithm Strategy Advantage Disadvantage
First Fit Allocate first suitable block Fast allocation Increases fragmentation
Best Fit Allocate smallest suitable block Minimizes waste Slower search time
Worst Fit Allocate largest available block Leaves larger remaining blocks Wastes large blocks

Conclusion

Linked lists provide an efficient data structure for implementing dynamic partitioning in memory management. They enable flexible allocation and deallocation of variable-sized memory blocks while supporting coalescing of adjacent free blocks to reduce fragmentation. The implementation requires careful handling of node splitting and merging to maintain memory efficiency.

Updated on: 2026-03-17T09:01:38+05:30

648 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements