Organisation de la mémoire

Et quelques petites questions sur les OS et les noyaux

a marqué ce sujet comme résolu.

Bonjour,

Dans mon cours sur la mémoire il est dit que la mémoire est séparée en blocs de $1$ octet, soit $2^3 = 8$ bits. Pour le moment cela ne me pose aucun problème mais par la suite il est dit qu’une mémoire pouvant contenir $2^k$ bits à des adresses mémoires pour chacun des "blocs" et que ces adresses mémoires sont composées d’au minimum $k$ bits. Mais pourquoi au minimum $k$ bits ? Puisque la mémoire est séparée en blocs de $1$ octet, il y a donc $2^{k-3}$ blocs et ainsi des adresses mémoires d’une taille de $k-3$ bits suffisent largement ?

Bref, je ne comprend pas trop si quelqu’un pouvait m’expliquer il est le bienvenue :p

Merci d’avance !

+0 -0

Merci ! Je suivais le cours ici : https://sites.uclouvain.be/SystInfo/notes/Theorie/html/Assembleur/memory.html Juste en dessous du schéma (de Von Neumann) il est bien marqué ce que j’ai dit plus haut (en espérant ne pas avoir mal interprété).

Je profite juste de l’occasion pour poser deux autres questions sur les OS et les noyaux : Si j’ai bien compris un OS est un programme qui regroupe un ensemble de programmes, les programmes systèmes et les programmes applicatifs. Les programmes systèmes sont les programmes qui permettent de manipuler les périphériques. En général l’ensemble des programmes systèmes constitue le noyau de l’OS. Pour faire appel à un périphérique un programme applicatif lance une interruption qui provoque l’arrêt du programme en cours et lance un programme du noyau. On appel cela un appel système.

Bon j’espère que pour le moment je n’ai pas dit de grosses bêtises. Cela veut-il dire que lorsque je fais un std::cin >> en C++ cela provoque l’entrée standard soit l’attente d’une réponse du clavier et donc un appel système ? Dans tous ce que j’ai lu il est marqué que les appels systèmes prennent beaucoup de temps et que donc il est préférable d’en faire le moins possible. Pourtant en présentant les différents types de noyaux d’os il est marqué que pour minimiser le nombre d’appels systèmes il faut avoir un maximum de programmes systèmes dans le noyau. Mais pourquoi ? Si les programmes systèmes sont dans l’espace noyaux et non dans l’espace utilisateur pourquoi cela réduirait le nombre d’appels systèmes ?

Merci d’avoir pris le temps de me lire !

J’ai pas le temps de lire le reste de ta réponse pour le moment, mais sur ta première question :

Une mémoire qui permet de stocker $2^k$ bytes de données utilisera au minimum $k$ bits pour représenter l’adresse d’une zone mémoire.

Dans le document que tu cites, le mot "byte" est utilisé indifféremment du mot "octet" (il peut y avoir des interprétations légèrement différentes des deux mots en français, mais en tout cas "byte" et "bit" ne sont jamais synonymes). De fait, $2^k$ bytes correspondent à $2^{k+3}$ bits.

il est bien marqué ce que j’ai dit plus haut (en espérant ne pas avoir mal interprété).

Et non, tu as commis une petite erreur. Les 2^k sont des bytes (de manière simpliste un octet), les k des bits.

Du coup le document a bon.

Concernant ta question sur OS et noyaux, ce ne sont pas des définitions strictes. Suivant le document ou le concepteur, cela va parler de différentes choses.

Un système d’exploitation c’est normalement le noyau + briques de base du système. Les briques de base sont généralement des bibliothèques (genre la bibliothèque standard du langage C), voire un shell (la ligne de commande par exemple) et quelques outils du genre.

Cependant, selon Apple, Microsoft ou Google, cela concerne le produit qui est vendu (à savoir macOS, Windows ou Android) en entier, donc cela inclut l’interface graphique, le navigateur Web par défaut, etc.

Je dirais que du point de vue du développeur, c’est le premier cas qui est le plus couramment admis, le second cas est plutôt employé par le grand public, la presse généraliste et les commerciaux.

Le noyau c’est lui qui va faire l’interface entre le matériel et les autres logiciels. Tu peux voir cela comme une machine virtuelle. S’il n’y avait pas de noyau, toutes les applications devraient connaître le fonctionnement exacte des périphériques sur l’ordinateur. Ton processeur, la RAM, la carte graphique, les disques durs, les normes USB, Ethernet, IP, etc. Les applications devraient réécrire beaucoup de code en commun pour gérer le matériel, tout en devant éviter les conflits. Le noyau permet d’éviter cela, il offre une abstraction du matériel, en gérant les différentes normes, les différences entre deux marques d’un même produits, etc. Le logiciel n’a qu’à se concentrer sur sa propre fonctionnalité et quand il a besoin du matériel il délègue au noyau la tâche de transformer les informations pour que le matériel et le logiciel dialoguent.

Concernant les appels systèmes, grosso-modo il y a plusieurs moyens de faire un noyau. Typiquement (ne prenant des cas extrêmes), tu as des noyaux où tout le code (pilotes de périphérique + le cœur du noyau) qui forment un binaire unique en mémoire et qui fonctionne dans l’espace noyau du processeur. C’est un noyau dit monolithique. À l’inverse, tu en as qui vont mettre un maximum de code en espace utilisateur, à savoir la plupart des pilotes, les systèmes de fichiers pour ne garder en somme que le strict minimum en espace noyau qu’est souvent la gestion de la mémoire et des processus. Ce sont des noyaux dits micro-noyau.

L’avantage du noyau monolithique c’est qu’il est plus performant. Comme le noyau, et les pilotes, doivent dialoguer beaucoup ensemble, mettre cela en espace utilisateur oblige à recourir à beaucoup d’appels système et à complexifier l’architecture du dit noyau. À l’inverse, un micro-noyau est plus fiable car si un pilote a un soucis, il est aisé de le relancer sans que le fonctionnement de la machine soit perturbée.

Donc ce qui te perturbe, c’est cette histoire là, on mettant plus de code au niveau noyau on réduit le nombre d’appels système.

Dans la réalité, MINIX est un micro-noyau pur, Linux et *BSD ont un noyau monolithique modulaire et macOS tout comme Windows ont un noyau hybride (entre les deux).

+0 -0

@Lucas-84 Je me sens un peu bête :honte: @Renault Merci beaucoup pour l’explication ! C’est plus claire maintenant.

EDIT: Cette notion de noyau a été inventé que pour des questions de sécurité ? Parceque sinon pourquoi ne pas enlever cette notion de noyau, mettre tous les programmes dans un seul et même espace et ainsi on a plus d’appels systèmes et l’OS est super performant ?

+0 -0

Il y a en effet une question de sécurité là dessous pour éviter que n’importe qu’elle application puisse faire n’importe quoi. Pratiquement aucune sécurité ne pourrait être mise en place sans ce mécanisme.

Il y a aussi une question de simplicité, en général l’espace noyau est aussi le seul qui a accès aux adresses mémoires physiques réelles, les applications n’ayant que des adresses virtuelles. Cela simplifie beaucoup la gestion de l’espace mémoire pour elles, seul le noyau ayant à gérer la mémoire réelle ce qui n’est pas simple. Les applications se croient seules dans la mémoire ainsi.

+0 -0

Ok merci pour ta réponse ! Néanmoins certains informaticiens n’utilisent pas des OS sans noyaux ? Comme ça tout est plus rapide et eux mêmes gèrent la sécurité en codant leur application par exemple ou encore en téléchargeant des applications "ne faisant pas n’importe quoi".

Bon je sais que je vous embête un peu avec toutes mes questions à la noix, mais néanmoins deux autres choses me turlupinent. Dans le modèle de Von Neumann pourquoi est il révolutionnaire de mettre dans une seule mémoire à la fois les instructions des programmes et leurs données ? Enfin, pourquoi des OS de 64 bits alors qu’aucun ordinateur actuel ne peut avoir $2^64$ octets en mémoire ? Pourquoi pas des ordinateurs de $2^60$ ? Je suppose que cela est dû au fait qu’on préfère les puissances de deux, mais néanmoins je ne trouve pas cela très convaincant.

Merci pour votre patience et futurs réponses.

Néanmoins certains informaticiens n’utilisent pas des OS sans noyaux ? Comme ça tout est plus rapide et eux mêmes gèrent la sécurité en codant leur application par exemple ou encore en téléchargeant des applications "ne faisant pas n’importe quoi".

Le gain de vitesse sur ce sujet n’est plus aussi fondamental qu’il y a quelques années. Par rapport à la difficulté qu’est de gérer un matériel moderne soi même.

Là où il n’y a pas d’OS c’est vraiment pour des petits systèmes embarqués où les applications sont simples et le matériel pas très performant. L’intérêt d’un OS étant discutable dans ce genre de contexte.

Dans le modèle de Von Neumann pourquoi est il révolutionnaire de mettre dans une seule mémoire à la fois les instructions des programmes et leurs données ?

C’est une conception plus simple et fiable. La gestion de la mémoire, entre la mémoire vive, vidéo, les différents caches, les registres de différents périphériques est assez complexe. Il faut s’assurer que l’ensemble se déroule sans anicroches. Mettre les données à part du code nécessiterait plus de fils pour le processeur, diviser le cache entre code et données, gérer le fait que le temps d’accès mémoire ne serait pas forcément strictement identique entre les deux. Bref, c’est chiant.

Enfin, pourquoi des OS de 64 bits alors qu’aucun ordinateur actuel ne peut avoir 264 octets en mémoire ?

Comme tu le sais, tout est arbitraire en informatique. On a même eu des processeurs décimaux, des bytes qui ne font pas un octet, etc. Techniquement oui on aurait pu faire autrement.

Déjà ce n’est pas vraiment l’OS qui impose le fait d’être en 32 ou 64 bits, c’est le processeur sur lequel il s’exécute. Dans le cas des x86 (Intel et AMD en gros), ils ont choisi qu’après 32 bits ce serait 64 bits. Même si ces processeurs n’ont pas les 64 bits de mémoire câblés. Cependant les registres (et la taille des adresses mémoires) est bien 64 bits. Donc même si aujourd’hui tu ne peux pas exploiter réellement les 64 bits d’adressage, tu bénéficient de la taille des registres qui a augmenté aussi (cela est utile pour les gros calculs). Et avec la mémoire qui augmente en quantité, même si on n’atteint pas la limite des 64 bits, on s’en approche, et les applications comme l’OS savent en profiter sans grands changements.

La question des puissances de deux n’est pas idiote. En fait en électronique les puissances de deux ont un avantage intéressant : si on veut le double de mémoire dans un SSD, il suffit d’ajouter la même puce à côté, ou de faire un copier/coller (avec quelques ajustements) de la conception de la puce précédente. C’est pareil pour les processeurs, les fils d’adresses, etc. Gérer les situations intermédiaires est possible mais bien plus chiant.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte