Man kann nicht einfach so defragmentieren, dazu bräuchte man eine Sprache die sowas unterstützt.
In C/C++ wird fragmentierung versucht beim aufruf von malloc/free (bzw. das C++ äquivalent new/delete) zu verhindern, indem man
* malloc: das bestmöglich passende Stück speicher allozieren, um das zu beschleunigen kann man mehrere "pools" anlegen in denen sich nur speicherstücke bestimmter größe befinden
* free: wenn möglich das freizugebende stück speicher mit einem anderen/mehreren anderen zusammenfügen, falls die beiden aneinander liegen. Das könnte man auch in einen speziellen defrag() aufruf machen, der alle Zeit mal ausgeführt wird.
* man könnte auch sich pro "Ding" (Klasse) das alloziert werden soll seinen eigenen allokator schreiben, das könnte man in C++ sehr bequem und transparent durch überladen des new/delete operators realisieren.
Aber der Kernel sollte niemals in der userspace speicherverwaltung herumpfuschen, dass ist nicht seine Aufgabe. Er sollte nur, wenn eine page in einer app freigeworden ist, diese wieder ausmappen und innerhalb des kernels speicher.