Internal Fragmentation occurs when a process gets a fixed-size memory block that is bigger than it needs. The extra space inside the block cannot be used by other processes, so it is wasted, and memory is not used efficiently.
- A process needs less memory than the assigned block.
- Extra space inside the block cannot be used by other processes.
- Unused space inside the allocated block remains wasted.
- Leads to poor memory utilisation and inefficiency.

Cause of Internal Fragmentation
- Fixed Block Allocation: When processes request memory, they are often assigned blocks larger than required. The unused space within the block is wasted.
- Uniform Block Sizes: If all processes get the same memory size, smaller processes leave large unused portions.
- Management Overheads: Some systems reserve extra memory for bookkeeping, which also adds to internal fragmentation.
Example:
Let's assume that the system that is being used assigns the memory in blocks of sizes being multiples of 4(like 12, 24, 32,..). In this system when a process P1 requests an amount of memory that is not a multiple of 4, it is assigned a memory block of value of the nearest higher multiple.

- A process requests 29 KB.
- It will be assigned 32 KB (nearest multiple of 4).
- The extra 3 KB remains unused.
This 3 KB loss is internal fragmentation.
Advantages
- Simple and fast memory allocation.
- Easy implementation of memory management.
- Predictable memory overhead and performance.
- Quick allocation and deallocation of memory blocks.
Disadvantages
- Wastes memory within allocated blocks.
- Reduces overall memory utilization.
- Decreases system performance when memory is limited.
- May increase page faults in virtual memory systems.
Methods to Reduce Internal Fragmentation
- Variable-Sized Blocks: Allocate memory blocks of different sizes to match process requirements, reducing unused space.
- Dynamic Memory Allocation: Allocate only the exact amount of memory required by each process, minimizing memory wastage.
- Memory Pooling: Maintain memory pools of different block sizes to better match process requirements and reduce wasted space.
- Efficient Block Sizing: Choose appropriate block sizes based on typical process needs to minimize unused memory.