Comprendre les niveaux de l'informatique

9

Désolé, pour ma question confuse. Je cherche des pointeurs.

Jusqu'à présent, j'ai principalement travaillé avec Java et Python sur la couche application et je n'ai qu'une vague compréhension des systèmes d'exploitation et du matériel. Je veux en savoir beaucoup plus sur les niveaux inférieurs de l'informatique, mais cela devient vraiment écrasant d'une manière ou d'une autre. À l'université, j'ai suivi un cours sur la microprogrammation, c'est-à-dire comment les processeurs sont câblés pour implémenter les codes ASM. Jusqu'à présent, j'ai toujours pensé que je n'en ferais pas plus si j'en apprenais plus sur le "bas niveau".

Une question que je me pose est: comment est-il même possible que le matériel soit caché presque complètement au développeur? Est-il exact de dire que le système d'exploitation est une couche logicielle pour le matériel? Un petit exemple: en programmation, je n'ai jamais rencontré le besoin de comprendre ce qu'est le cache L2 ou L3. Pour l'environnement d'application d'entreprise typique, il n'est presque jamais nécessaire de comprendre l'assembleur et les niveaux inférieurs de l'informatique, car de nos jours il existe une pile technologique pour presque tout. Je suppose que l'intérêt de ces niveaux inférieurs est de fournir une interface vers des niveaux supérieurs. D'un autre côté, je me demande dans quelle mesure les niveaux inférieurs peuvent avoir une influence, par exemple toute cette histoire de calcul graphique.

Donc, d'autre part, il y a cette branche informatique théorique, qui travaille sur des modèles informatiques abstraits. Cependant, j'ai également rarement rencontré des situations, où j'ai trouvé utile de penser dans les catégories de modèles de complexité, de vérification de preuve, etc. un grand nombre de N. Ce qui me manque est une référence pour un cadre pour penser à ces choses. Il me semble qu'il y a toutes sortes de camps différents, qui interagissent rarement.

Ces dernières semaines, j'ai lu sur les problèmes de sécurité. Ici, en quelque sorte, la plupart des différentes couches se rejoignent. Les attaques et les exploits se produisent presque toujours au niveau inférieur, donc dans ce cas, il est nécessaire de se renseigner sur les détails des couches OSI, le fonctionnement interne d'un système d'exploitation, etc.

RParadox
la source
1
Il y a une excellente réponse à cela (la première à la question) programmers.stackexchange.com/questions/81624/…
Puckl
Les attaques et les exploits peuvent se produire à tous les niveaux. Si j'écris un script PHP vulnérable, il peut être exploité indépendamment du système d'exploitation sous-jacent, sans parler du matériel.
tdammers
1
Trouvé un grand livre sur le sujet: les éléments des systèmes informatiques: construire un ordinateur moderne à partir des premiers principes Noam Nisan, Shimon Schocken. Une conférence de M. Schocken sur cette approche: youtube.com/watch?v=IlPj5Rg1y2w&feature=plcp
RParadox
À l'époque du dos, utiliser le langage d'assemblage pour les routines graphiques VGA était à peu près le seul moyen d'obtenir des performances, mais je suppose que je ne savais pas ce que je faisais! Mais au cours des 10 dernières années ou plus de ma carrière, je n'ai pas eu à regarder quelque chose d'aussi bas. Et j'ignore maintenant surtout ce qui se passe à ces niveaux. J'ai rarement besoin d'allouer ou de nettoyer ma propre mémoire. Je soupçonne que beaucoup dans mon équipe ne savent pas ce qu'est une pile! À bien des égards, il n'est pas productif de coder à un tel niveau, réinventant ainsi la roue. Nous nous tenons plutôt sur les épaules de géants.
Gavin Howden

Réponses:

19

Le mot-clé pour penser à ces choses est l' abstraction .

L'abstraction signifie simplement d'ignorer délibérément les détails d'un système afin que vous puissiez le considérer comme un composant unique et indivisible lors de l'assemblage d'un système plus grand à partir de nombreux sous-systèmes. Il est d'une puissance inimaginable - écrire un programme d'application moderne tout en considérant les détails de l'allocation de mémoire et du déversement des registres et des temps d'exécution des transistors serait possible d'une manière idéalisée, mais il est incomparablement plus facile de ne pasd'y penser et d'utiliser à la place des opérations de haut niveau. Le paradigme informatique moderne repose essentiellement sur plusieurs niveaux d'abstraction: électronique à semi-conducteurs, microprogrammation, instructions machine, langages de programmation de haut niveau, OS et API de programmation Web, cadres et applications programmables par l'utilisateur. Pratiquement personne ne pouvait comprendre l'ensemble du système de nos jours, et il n'y a même pas de voie imaginable par laquelle nous pourrions jamais revenir à cet état de fait.

Le revers de l'abstraction est la perte de puissance. En laissant les décisions sur les détails à des niveaux inférieurs, nous acceptons souvent qu'elles puissent être prises avec une efficacité sous-optimale, car les niveaux inférieurs n'ont pas le `` Big Picture '' et peuvent optimiser leur fonctionnement uniquement par la connaissance locale, et ne sont pas aussi (potentiellement) intelligent en tant qu'être humain. (Habituellement. Par exemple, la compilation de HLL en code machine est de nos jours souvent mieux effectuée par les machines que par l'homme le plus compétent, car l'architecture du processeur est devenue si compliquée.)

La question de la sécurité est intéressante, car les failles et les «fuites» dans l'abstraction peuvent souvent être exploitées pour violer l'intégrité d'un système. Lorsqu'une API postule que vous pouvez appeler les méthodes A, B et C, mais uniquement si la condition X est remplie, il est facile d'oublier la condition et de ne pas être préparé aux retombées qui se produisent lorsque la condition est violée. Par exemple, le débordement de tampon classique exploite le fait que l'écriture dans des cellules de mémoire produit un comportement indéfini sauf si vous avez alloué vous-même ce bloc de mémoire particulier. L'API garantit seulement que quelque chosese produira en conséquence, mais dans la pratique, le résultat est défini par les détails du système au niveau inférieur suivant - que nous avons délibérément oublié! Tant que nous remplissons la condition, cela n'a aucune importance, mais sinon, un attaquant qui comprend intimement les deux niveaux peut généralement diriger le comportement de l'ensemble du système comme souhaité et provoquer de mauvaises choses.

Le cas des bogues d'allocation de mémoire est particulièrement mauvais car il s'est avéré très difficile de gérer la mémoire manuellement sans une seule erreur dans un grand système. Cela pourrait être considéré comme un cas d'abstraction raté: bien qu'il soit possible de faire tout ce dont vous avez besoin avec le CmallocAPI, c'est tout simplement trop facile à abuser. Certaines parties de la communauté de programmation pensent maintenant que ce n'était pas le bon endroit pour introduire une limite de niveau dans le système, et à la place promouvoir les langues avec la gestion automatique de la mémoire et la collecte des ordures, qui perd un peu de puissance, mais offre une protection contre la corruption de mémoire et un comportement indéfini . En fait, une raison majeure de continuer à utiliser C ++ de nos jours est précisément le fait qu'il vous permet de contrôler exactement quelles ressources sont acquises et libérées quand. De cette façon, le schisme majeur entre les langues gérées et non gérées aujourd'hui peut être vu comme un désaccord sur l'endroit où définir précisément une couche d'abstraction.

La même chose peut être dite pour de nombreux autres paradigmes alternatifs majeurs dans l'informatique - le problème surgit vraiment tout le temps où de grands systèmes doivent être construits, parce que nous sommes tout simplement incapables de concevoir des solutions à partir de zéro pour les exigences complexes courantes aujourd'hui. (Un point de vue commun en IA ces jours -ci est que le cerveau humain en fait fait le travail comme celui - comportement résultant par des boucles de rétroaction, les réseaux massivement interconnectés etc. au lieu de modules séparés et des couches avec de simples interfaces abstraites entre eux, et que c'est pourquoi nous ont si peu réussi à simuler notre propre intelligence.)

Kilian Foth
la source
1
Grand merci. Ainsi, l'exemple de la récupération de place / gestion de la mémoire est probablement l'exemple le plus connu de cette interaction. Neil Gershenfeld a écrit des trucs intéressants, bien que je n'en comprenne que des parties.
RParadox
... Très bon point sur la complexité. Si seulement des machines peuvent concevoir nos machines, où cela mène-t-il? Si les gens d'IA parlent d'IA créant des IA plus intelligentes, nous y sommes peut-être presque. ;)
RParadox