Memory fragmentation occurs when free memory is split into many small, non-contiguous blocks (holes). As processes allocate and deallocate memory of varying sizes, the free space becomes fragmented. This creates a situation where there's sufficient total free memory but no single block large enough to satisfy a new allocation request. The 'large number of free holes' directly causes this problem.