Miguel,
Lo que tiene quse ser contiguo es la memoria asociada a cada segmento individual.
Pero cada segmento puede estar, a priori, en cualquier región de la memoria fisica.
Por ejemplo, mi programa tiene un segmento de código de 100KB, un segmento de heap de 50Kb y un segmento de stack de 16Kb. Al cargar el programa a memoria se va a buscar una región de memoria libre de 100Kb para el segmento de código, otra de 50Kb para el heap y otra de 16Kb para el stack, cada una de ellas puede empezar en cualquier parte de la memoria siempre y cuando haya suficiente espacio libre para asignar el segmento.
Saludos,
Gustavo