Où est stocké et exécuté un programme dans les ordinateurs ?


Laissez-moi vous expliquer avec l'exemple d'une application de bureau Java.

L'application est généralement compilée à partir de la source Java en fichiers de classe (bytecode) et empaquetée dans des fichiers Zip avec une extension de fichier spéciale ".jar" et conservée dans le disque dur (par exemple, un disque dur Seagate de 500 Go).


Le JAR est exécuté à l'aide de la machine virtuelle Java (qui doit être déjà installée) dans le PC/Mac.

Une instance de la JVM est lancée pour chaque application Java. (La JVM elle-même est une application native sur le PC/Mac - donc, c'est elle-même un programme qui est chargé et exécuté - je ne couvrirai pas cela ici).

La JVM charge les classes d'application une par une au fur et à mesure qu'elles sont nécessaires - et les conserve dans la RAM. À ce stade, il s'agit encore de bytecode.

La JVM lit de courts extraits des quelques centaines d'instructions de bytecode suivantes et les traduit juste à temps (JIT) en commandes de langage d'assemblage (commandes spécifiques au CPU - exemple du jeu d'instructions Intel Core i3/AMD Ryzen/Qualcomm Snapdragon) et les charge dans les caches du CPU - cache L1/L2 sur le CPU lui-même (généralement environ 128 Ko à 2 Mo). À partir de là, le CPU exécute les instructions une par une. Une fois qu'une séquence est terminée, le JIT placera le jeu d'instructions suivant pour le CPU.

Le JIT prendra également en compte le système d'exploitation lors de la conversion en instructions CPU.

Par exemple, si le programme Java essaie d'ouvrir un fichier - le bytecode reste le même, mais le JIT produira un jeu d'instructions différent pour Windows et Linux pour le même processeur Core i3.

Le système JIT met également en cache certains extraits convertis du bytecode en assemblage du code fréquemment exécuté, de sorte que ces sections s'exécutent à grande vitesse.

Les classes ne sont presque jamais déchargées de la RAM.

Les données du programme (ressources, entrées utilisateur, résultats de calcul, etc.) peuvent être chargées en RAM et déchargées au fur et à mesure de l'exécution du programme. Les calculs sont en fait effectués en déplaçant les données de la RAM vers les registres de l'unité centrale, en effectuant les calculs et en ramenant les résultats des registres de l'unité centrale vers la RAM.

L'ensemble devient un peu plus compliqué s'il s'agit d'un programme Java pour un système embarqué ou d'une application mobile Java.

La plupart des programmes sont exécutés à partir de la RAM.