La monoprogrammation ne permet qu'à un seul processus utilisateur d'être en mémoire à un instant donné, la gestion de la mémoire est énormément simplifiée. C'est le cas de MS-DOS par exemple.
La suite du cours est dans un cadre de multiprogrammation.
La taille d'un processus n'est pas connue au début de l'exécution, il faut donc l'estimer. Les tailles des données statiques et du code sont connues au chargement, celles des données dynamiques (le tas et la pile) sont fixées arbitrairement.
Si un processus devient plus grand que la zone allouée, il faut soit agrandir l'emplacement, soit lui trouver un nouvel emplacement, soit le tuer.
La fragmentation interne existe dès lors que l'unité d'allocation de la mémoire diffère de l'unité minimale (ie l'octet).
Un processus ne doit pas endommager ses collègues. Il faut contrôler, avant exécution que toutes les adresses accédées par le processus sont à l'intérieur de la zone allouée. Cela protège les utilisateurs entre eux, mais aussi le SE.
Pour cela, il faut un minimum de matériel : un registre base et un registre limite. Ensuite chaque adresse mémoire utilisée qui n'est pas comprise entre base et limite provoque la terminaison du processus.
La liaison d'instructions et de données (adresses logiques dans le programme, adresses physiques pendant l'exécution) peut avoir lieu à n'importe quelle étape :
Un utilisateur écrit un programme qui contient des adresses symboliques. Le compilateur peut générer :