6 votes

Comment l'image Smalltalk gère-t-elle les entrées-sorties ?

Je viens de commencer à apprendre Smalltalk, j'ai parcouru sa syntaxe, mais je n'ai jamais vraiment codé avec. En lisant quelques articles d'introduction et quelques questions de SO comme :

Une question me vient toujours à l'esprit : Comment l'image Smalltalk gère-t-elle les entrées-sorties ?

Un programme Smalltalk peut reprendre à l'endroit où il s'est arrêté, en utilisant les informations stockées dans l'image. Disons que j'ai des connexions TCP ouvertes (sans parler de toutes sortes de tampons), comment les récupérer ? Il semble qu'il n'y ait pas d'autre moyen que de les rouvrir (confirmé par cette réponse ). Et si Smalltalk rouvre ces connexions, cela ne va-t-il pas à l'encontre de l'idée de "reprendre l'exécution du programme à un moment ultérieur exactement là où vous l'avez laissée" ? Ou y a-t-il une certaine magie derrière cela ?

Je ne vois pas d'inconvénient à ce que la réponse soit spécifique à certains dialectes, par exemple le Pharo.

Il serait également intéressant de connaître les ressources permettant d'en savoir plus sur ce sujet.

5voto

JayK Points 112

Comme vous l'avez noté, certaines ressources ne font pas partie du tas de mémoire et ne seront donc pas récupérées en chargeant simplement l'image en mémoire. Cela s'applique en particulier à toutes sortes de ressources gérées par le système d'exploitation, et aux Smalltalks multiplateformes où vous pouvez copier l'image d'un système d'exploitation à un autre et redémarrer l'image, même si vous devez restaurer ces ressources différemment qu'elles ne l'étaient auparavant.

Dans les Smalltalks que j'ai vus, l'astuce consiste à faire en sorte que toutes les classes reçoivent un message immédiatement après la reprise de l'image. En implémentant une méthode pour ce message, elles peuvent restaurer toutes les ressources transitoires (sockets, connexions, foreign handles, ...) dont leurs instances pourraient avoir besoin. Pour trouver toutes les instances, certains Smalltalks fournissent des messages tels que allInstances ou vous devez gérer vous-même un registre des objets concernés.

Et si Smalltalk rouvre ces connexions, cela ne va-t-il pas à l'encontre de l'idée de "reprendre l'exécution du programme à un moment ultérieur exactement là où vous l'avez laissée" ?

Du point de vue de l'utilisateur, après cette réinitialisation et cette réaffectation des ressources, tout semble encore "exactement là où vous vous étiez arrêté", même si certains détails techniques ont changé sous le capot. Bien sûr, ce ne sera pas le cas s'il est impossible de restaurer les ressources (pas de réseau, par exemple). Certaines limites ne peuvent être surmontées par la magie de Smalltalk.

Comment l'image Smalltalk gère-t-elle les entrées-sorties ?

Pour rendre possible la reprise décrite ci-dessus, toutes les ressources externes sont enveloppées et représentées sous la forme d'une sorte d'objet Smalltalk. Les objets enveloppants seront conservés dans l'image, bien qu'ils soient déconnectés du monde extérieur lorsque Smalltalk est arrêté. Les objets enveloppants peuvent ensuite restaurer les ressources externes après le redémarrage de l'image.

4voto

Jörg W Mittag Points 153275

Il peut être utile d'ajouter une petite leçon d'histoire : Smalltalk a été créé dans les années 1970 au Palo Alto Research Center (PARC) de Xerox. Au même moment, au même endroit, l'informatique personnelle a été inventée. C'est également au même moment, au même endroit, que l'Ethernet a été inventé.

Smalltalk était un système intégré unique, c'était à la fois l'IDE, l'interface graphique, le shell, le noyau, le système d'exploitation, même le microcode de l'unité centrale faisait partie du système Smalltalk. Smalltalk n'avait pas à gérer des ressources non-Smalltalk provenant de l'extérieur de l'image, parce qu'à toutes fins utiles, il n'y avait pas d'autres ressources que Smalltalk. n'était pas "extérieur" . Il était possible de recréer l'état exact de la machine, puisqu'il n'y avait pas vraiment de frontière entre la machine virtuelle et la machine. (La quasi-totalité du système était implémentée en Smalltalk. Il n'y avait que quelques petits bouts de microcode, d'assemblage et de Mesa. Même ce que nous considérerions aujourd'hui comme des pilotes de périphériques était écrit en Smalltalk).

Il n'était pas nécessaire de maintenir des connexions réseau avec d'autres ordinateurs, car personne, en dehors de quelques laboratoires, n'avait besoin d'une connexion réseau. avait des réseaux. En fait, presque aucune organisation ne possédait plus d'un ordinateur. Il n'était pas nécessaire d'interagir avec le système d'exploitation hôte car les machines Smalltalk n'avaient pas de système d'exploitation ; Smalltalk était le système d'exploitation. (Vous connaissez sans doute la célèbre citation de Les principes de conception de Dan Ingalls derrière Smalltalk : "Un système d'exploitation est un ensemble de choses qui ne s'intègrent pas dans un langage. Il ne devrait pas y en avoir.") Smalltalk étant le système d'exploitation, il n'y avait pas besoin de système de fichiers, toutes les données étaient simplement des objets.

Smalltalk ne peut pas contrôler ce qui se trouve en dehors de Smalltalk. Il s'agit d'une propriété générale qui n'est pas propre à Smalltalk. Vous pouvez rompre l'encapsulation en Java en modifiant le bytecode compilé. Vous pouvez rompre la sécurité des types en Haskell en modifiant le code machine compilé. Vous pouvez créer une fuite de mémoire en Rust en modifiant le code machine compilé.

Ainsi, toutes les garanties, caractéristiques et propriétés de Smalltalk ne sont disponibles que tant que vous ne quittez pas Smalltalk.

Voici un exemple encore plus simple qui n'implique pas la mise en réseau ou le déplacement de l'image sur une autre machine : ouvrez un fichier dans le système de fichiers de l'hôte. Suspendre l'image. Supprimez le fichier. Reprendre l'image. Il n'y a pas de moyen possible pour reprendre l'image dans le même état.

Tout ce que Smalltalk peut faire, c'est approximatif l'état des ressources externes aussi bon que possible. Il peut tenter de rouvrir le fichier. Si le fichier a disparu, il peut éventuellement tenter d'en créer un avec le même nom. Il peut essayer de reprendre une connexion réseau. En cas d'échec, il peut essayer de rétablir la connexion, de créer une nouvelle connexion à la même adresse.

Mais en fin de compte, tout ce qui se trouve en dehors de l'image échappe au contrôle de Smalltalk, et Smalltalk ne peut rien y faire.

Il convient de noter que cette discordance d'impédance entre l'intérieur de l'image et le "monde extérieur" est l'une des principales critiques formulées à l'encontre de Smalltalk. Et si vous regardez les systèmes Smalltalk qui essaient de s'intégrer profondément dans le monde extérieur, ils doivent souvent faire des compromis. Par exemple, GNU Smalltalk, qui est spécifiquement conçu pour s'intégrer profondément dans un système Unix, renonce en fait à l'image et à la persistance.

1voto

tukan Points 7900

J'ajouterai un autre point de vue aux belles réponses de Joerg et JayK.

Ce qu'il est important de comprendre, c'est le contexte de l'époque où Smalltalk a été créé. (Joerg a déjà souligné l'aspect important de tout ce qui est Smalltalk). Nous parlons de l'époque juste après ARPANET .

Je pense qu'ils ne s'attendaient pas à la collaboration et à l'interconnexion que nous connaissons aujourd'hui. L'image a été conçue comme un enregistrer d'une session d'un unique programmateur sans toute personne extérieure la communication. Les temps ont changé et aujourd'hui vous posez naturellement la question de l'OI. Comme JayK l'a indiqué, vous pouvez réinitialiser l'image afin d'obtenir une image similaire à celle que vous avez obtenue à la fin de votre session.

Le vrai problème, la raison pour laquelle j'ai décidé d'ajouter mon grain de sel, c'est la collaboration entre plusieurs développeurs. C'est là que l'image, l'idée originale, est, à mon avis, dépassée. Il n'existe aucun moyen de partager une image entre plusieurs développeurs afin qu'ils puissent développer en même temps et partager le code.

Ne serait-il pas formidable d'avoir une image centrale et que les développeurs n'aient que les diffs et ouvrent leur environnement où ils terminent avec le nouveau code de tout le monde incorporé ? Cela vous rappelle quelque chose ? C'est le genre de VCS que nous avons comme mercurial, git etc. sans l'image, seulement le code. Malheureusement, une telle reconstruction d'image n'existe pas.

Smalltalk essaie de rattraper son retard par rapport à l'outil de versionnement standard que nous utilisons aujourd'hui.

(Note complémentaire : Smalltalk avait ses propres systèmes de "versioning", mais ils sont plutôt déficients à bien des égards par rapport aux VCS actuels. Les systèmes utilisés sont Monticello (Pharo), ENVY (VA Smalltalk) et Store (VisualWorks).

Pharo essaie maintenant de prendre le train en marche et d'implémenter la fonctionnalité git via iceberg . La branche Smalltalk/X-jv a intégré un support mercuriel décent. La branche Squeak a Squot pour git (pour l'instant) [merci @JayK].

Il ne reste plus qu'à ajouter la prise en charge des images centrales/diff :).

1voto

Snorik Points 133

Il est nécessaire d'intervenir un peu dans la discussion sur le contrôle des sources.

La solution que j'ai vue avec VS(E)/VA est de travailler avec Envy/PVCS et de partager ce référentiel avec les développeurs. Chaque développeur a sa propre image avec tous les avantages et inconvénients des images. Une entreprise pour laquelle je travaillais se demandait s'il ne serait pas judicieux de reconstruire l'image de développement à partir de zéro toutes les deux semaines afin de se débarrasser de tout ce qui pourrait diluer la qualité du code (Filehandles ouverts, variables globales, entrées dans le dictionnaire de pool, vous l'aurez et cela fera planter votre code pendant l'exécution).

Lorsqu'il s'agit de construire un "run-time", vous prenez l'image standard minuscule et simple, et tout votre code provient des fichiers bind et SLL.

0voto

Stephan Eggermont Points 11224

Pour obtenir du code pratique concernant le démarrage et l'arrêt des images, jetez un coup d'œil au côté classe de l'application ZnServer . SessionManager est la classe qui fournit toutes les fonctionnalités dont vous avez besoin pour gérer l'abandon des ressources du système à l'arrêt et leur réapprovisionnement au démarrage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X