Les exécutables sont toujours chargés entièrement en RAM. Si on faisait autrement, il faudrait sans cesse aller chercher les données manquantes sur le disque dur et ça serait vraiment très (trop) lent. Ça serait presque aussi pire que de faire tourner le system entier sur le swap. C'est aussi ça qui explique que l'on peut supprimer la commande rm en utilisant rm: elle est entièrement chargée en mémoire avant de s'exécuter. Je crois qu'il existe un moyen de spécifier des zones de données qui ne sont pas à être chargées en mémoire, permettant de lancer de très gros exécutables sans devoir tout mettre en RAM. Ça c'est quelque chose que Windows fait pour le moins, pas mal certain que ça se fait sur Linux aussi mais faudrait que je me documente sur le linker et le format ELF.
Après, sur GNU/Linux, les exécutables sont plutôt petits:
~ % ls -ASlh /usr/bin/ | head -n 20
total 359M
-rwxr-xr-x 1 root root 60M 9 jui 21:21 pcsx2*
-rwxr-xr-x 1 root root 14M 11 mai 11:57 clementine*
-rwxr-xr-x 1 root root 11M 2 aoû 2012 cgc*
-rwxr-xr-x 1 root root 9,8M 27 avr 20:24 gs*
-rwxr-xr-x 1 root root 8,8M 14 jun 08:22 godoc*
-rwxr-xr-x 1 root root 7,5M 14 jun 08:22 go*
-rwxr-xr-x 1 root root 5,5M 10 jui 11:39 pyrogenesis*
-rwxr-xr-x 1 root root 5,4M 28 avr 09:49 xlinpack_xeon64*
-rwxr-xr-x 1 root root 5,4M 23 jun 17:17 gimp-2.8*
-rwxr-xr-x 1 root root 5,2M 4 jui 13:57 smbtorture*
-rwxr-xr-x 1 root root 5,0M 27 avr 02:24 gdb*
-rwxr-xr-x 1 root root 4,7M 4 jui 03:12 ctest*
-rwxr-xr-x 1 root root 4,4M 1 jun 07:37 dolphin-emu*
-rwxr-xr-x 1 root root 4,2M 5 jui 13:54 go-mtpfs*
-rwxr-xr-x 1 root root 3,9M 4 jui 03:12 cmake-gui*
-rwxr-xr-x 1 root root 3,8M 4 jui 03:12 cpack*
-rwxr-xr-x 1 root root 3,8M 2 avr 17:53 js17*
-rwxr-xr-x 1 root root 3,6M 4 jui 03:12 ccmake*
-rwxr-xr-x 1 root root 3,6M 4 jui 03:12 cmake*
Comme tu peux le voir, les exécutables les plus gourmands font 60 Mo (un émulateur) suivi d'un autre de 10 Mo, pour un total de 359 Mo pour l'ensemble des exécutables sur mon PC.
Comment es-ce possible d'utiliser aussi peu d'espace? Tout est organisé en librairies. Les applications GTK link a la librairie GTK, qui n'est chargée qu'une seule fois. Pareil pour Qt, et pareil pour toutes les librairies. Tu peux obtenir la liste des dépendances avec dpkg, je crois. D'ailleurs, les librairies non plus ne sont pas très gourmandes:
~ % ls -ASlh /usr/lib/ | head -n 11
total 598M
-rwxr-xr-x 1 root root 36M 27 jun 15:12 libnvidia-glcore.so.319.32*
-rwxr-xr-x 1 root root 27M 24 mai 14:04 libLLVM-3.2svn.so*
-rwxr-xr-x 1 root root 26M 14 jun 18:29 libwebkitgtk-1.0.so.0.17.5*
-rwxr-xr-x 1 root root 22M 24 mai 15:43 libicudata.so.51.2*
-rw-r--r-- 1 root root 20M 2 aoû 2012 libCg.so
-rw-r--r-- 1 root root 19M 5 mar 12:28 libcryptopp.a
-rwxr-xr-x 1 root root 11M 2 jui 06:19 libQtGui.so.4.8.5*
-rwxr-xr-x 1 root root 11M 27 avr 20:24 libgs.so.9.07*
-rwxr-xr-x 1 root root 11M 27 jun 15:12 libcuda.so.319.32*
-r-xr-xr-x 1 root root 8,1M 21 mai 11:50 libpython3.3m.so.1.0*
Et enfin, finalement, sur GNU/Linux les applications stockent toutes leurs données dans des fichiers séparés, souvent dans /usr/share. Par exemple, les icones sont toutes dans /usr/share/icons, les plugins d'applications dans /usr/lib/(application)/ (ex: /usr/lib/mupen64plus/), les fichiers de l'application dans /usr/share/(applicatuin) (ex: /usr/share/skype/)
/usr/share/skype % tree .
.
├── avatars
│ ├── Angel Skype.png
│ ├── Architect Skype.png
│ ├── Beach Skype.png
│ ├── Behind Skype.png
│ ├── Business Skype.png
│ ├── Call Me.png
│ ├── Call Me Sweetheart.png
│ ├── Carnaval Skype.png
│ ├── Chic Skype.png
│ ├── Christmas Skype.png
│ ├── College Skype.png
│ ├── Desert Skype.png
│ ├── Designer Skype.png
│ ├── Devil Skype.png
│ ├── DIY Skype.png
│ ├── DJ Skype.png
│ ├── Earbud Skype.png
│ ├── Empire Skype.png
│ ├── Fax Skype.png
│ ├── Geisha Skype.png
│ ├── Hula Skype.png
│ ├── Make Skype Not War.png
│ ├── Metal Skype.png
│ ├── Ninja Skype.png
│ ├── Party Skype.png
│ ├── Pop Skype.png
│ ├── Rice Skype.png
│ ├── Skypahontas.png
│ ├── Skype 502.png
│ ├── Skype-ahoy.png
│ ├── Skype Aid.png
│ ├── Skype-a-Manger.png
│ ├── Skype Artiste.png
│ ├── Skype Beauty.png
│ ├── Skype Bling.png
│ ├── Skype Boarder.png
│ ├── Skype Brrr... .png
│ ├── Skype Candy.png
│ ├── Skype Cola.png
│ ├── Skype Cool Shades.png
│ ├── Skype Extreme.png
│ ├── Skype Goaaaaal.png
│ ├── Skype Headset.png
│ ├── Skype in a Bag.png
│ ├── Skype-in-one.png
│ ├── Skype Jah.png
│ ├── Skype Jyve.png
│ ├── Skype.png
│ ├── Skypers of the Caribbean.png
│ ├── Skype Safety.png
│ ├── Skype San.png
│ ├── Skype Shorty.png
│ ├── Skype Smiley.png
│ ├── Skype Time.png
│ ├── Star Skype.png
│ ├── Sushi Skype.png
│ ├── The Skypeness.png
│ ├── Travel Skype.png
│ ├── Wetsuit Skype.png
│ └── Yin Yang Skype.png
├── lang
│ ├── skype_bg.qm
│ ├── skype_bg.ts
│ ├── skype_cs.qm
│ ├── skype_cs.ts
│ ├── skype_de.qm
│ ├── skype_de.ts
│ ├── skype_en.qm
│ ├── skype_en.ts
│ ├── skype_es.qm
│ ├── skype_es.ts
│ ├── skype_et.qm
│ ├── skype_et.ts
│ ├── skype_fr.qm
│ ├── skype_fr.ts
│ ├── skype_it.qm
│ ├── skype_it.ts
│ ├── skype_ja.qm
│ ├── skype_ja.ts
│ ├── skype_ko.qm
│ ├── skype_ko.ts
│ ├── skype_lt.qm
│ ├── skype_lt.ts
│ ├── skype_lv.qm
│ ├── skype_lv.ts
│ ├── skype_no.qm
│ ├── skype_no.ts
│ ├── skype_pl.qm
│ ├── skype_pl.ts
│ ├── skype_pt_br.qm
│ ├── skype_pt_br.ts
│ ├── skype_pt_pt.qm
│ ├── skype_pt_pt.ts
│ ├── skype_ro.qm
│ ├── skype_ro.ts
│ ├── skype_ru.qm
│ ├── skype_ru.ts
│ ├── skype_th.qm
│ ├── skype_th.ts
│ ├── skype_tr.qm
│ ├── skype_tr.ts
│ ├── skype_uk.qm
│ ├── skype_uk.ts
│ ├── skype_zh_s.qm
│ ├── skype_zh_s.ts
│ ├── skype_zh_t.qm
│ └── skype_zh_t.ts
└── sounds
├── CallBusy.wav
├── CallConnecting.wav
├── CallFailed.wav
├── CallHangup.wav
├── CallHold.wav
├── CallRemoteHangup.wav
├── CallResume.wav
├── CallRingingIn.wav
├── CallRingingOut.wav
├── ChatIncomingInitial.wav
├── ChatIncoming.wav
├── ChatOutgoing.wav
├── ContactAdded.wav
├── ContactAuthRequest.wav
├── ContactOffline.wav
├── ContactOnline.wav
├── SkypeLogin.wav
├── SkypeLogout.wav
├── TransferComplete.wav
├── TransferFailed.wav
├── TransferRequest.wav
└── VoicemailReceived.wav
3 directories, 128 files
BREF: Les exécutables sont chargés entièrement en mémoire, et tous les fichiers ressources sont séparés dans de nombreux fichiers séparés, donc l'application en cours d'exécution est très peu affectée. Lors d'une mise à jours, elle prend effet lorsque la librairie ou l'application est redémarrée (par exemple, en fermant toutes les applications Qt, la prochaine application Qt qui sera ouverte utiisera la version mise à jours). C'est pareil pour tous les composents, même ceux plus important comme le display manager, X, NetworkManager et autres. En plus de cela, APT redémarre automatiquement certains services lorsqu'ils sont mis à jours, tel que déjà mentionné. Seul le noyau nécessite un redémarrage complet pour être mis à jours (et il est possible, pour les machines nécessitant zéro downtime, d'utiliser des outils comme ksplice pour mettre à jours le noyau en place directement en mémoire).
En ce qui concerne Windows, beaucoup de programmes incluant ceux de Microsoft font redémarrer inutilement, juste pour être certain que tout est redémarré, pour être certain que certains logiciels ne tournent plus en arrière plan et autre. Certains composents sont également beaucoup plus étroitement liés entre eux, ce qui nécessite de redémarrer plusieurs choses. Mais dans le doute, ils préfèrent faire un redémarrage complet au cas où ça serait foireux. Tu peux en faire le test, installer un gros logiciel, refuser de redémarrer, tuer les services si nécessaire et démarrer l'application. Magie! Ça fonctionne parfaitement même sans redémarrer, même pour les drivers! C'est juste moins compliqué pour l'utilisateur lamda de simplement redémarrer le PC et tout fonctionne du premier coup, que de l'envoyer dans une longue procédure lui expliquant quoi faire pour toutes les conneries qui peuvent arriver et qui font que le logiciel plante au démarrage.