OS "Sivelkiriya": un exemple de construction d'un programme

Bonjour, Habr.

Ce billet poursuit le cycle de publications sur le projet Sivelkiriya OS. Le premier article du cycle a donné une description générale du concept, le second a expliqué pourquoi il était nécessaire et sous quelle forme le produit pouvait voir la lumière, le troisième a décrit les solutions architecturales et le quatrième a répondu à la question de savoir comment coordonner les actions des développeurs de systèmes d'exploitation et Logiciel dans ce modèle. Cet article montrera un exemple de division d'un programme simple en modules afin de l'adapter aux réalités du nouveau système d'exploitation.

Prenons un exemple classique: un programme qui vous permet d'ouvrir un fichier contenant une image bitmap et de l'afficher à l'écran. L'image peut être mise à l'échelle et, si sa taille à l'échelle actuelle dépasse la taille de l'écran, faites défiler.

Dans les systèmes d'exploitation modernes, ce problème est souvent résolu par une application avec une architecture fermée, c'est-à-dire qui contient elle-même tout le code requis ou utilise des composants tiers uniquement de sa propre initiative. Le point clé est que vous ne pouvez pas utiliser une partie de l'application - vous pouvez la démarrer telle quelle ou utiliser une autre solution.

Afin de comprendre comment ce problème est résolu dans le cadre de l'OS Sivelkiriya, vous devrez d'abord regarder «sous le capot» de ce programme et comprendre ce qu'il fait et avec quels concepts il fonctionne. Voici les entités qui surviennent pendant le fonctionnement du programme.

  1. L'emplacement de l'image.Dans le cas classique, il est décrit par le chemin d'accès au fichier sur le disque. Avec une considération un peu plus large, les adresses sur le réseau local ou sur Internet entrent également dans cette catégorie. Cependant, cela n'épuise pas toutes les possibilités: l'image peut être située dans la RAM, à la sortie d'un programme (par exemple, un processeur photo ou un rendu graphique), sur une page Web, dans un chat ou un e-mail, à l'intérieur d'une archive ou d'un document de bureau. Malgré le fait que techniquement toutes ces options sont différentes les unes des autres et nécessitent un traitement différent, du point de vue de l'utilisateur, elles ont toutes un but: elles indiquent où se trouve l'image qu'il souhaite visualiser. La création d'une interface qui vous permet de choisir parmi tant d'options est une tâche non triviale, mais conceptuellement, il n'y a aucun obstacle à cette approche.De plus: il n'y a aucune raison de ne pas donner à l'utilisateur la possibilité de visualiser l'image située dans l'un des emplacements ci-dessus.
  2. , . , , , .
  3. . , , jpeg gif. : jpeg .gif, gif . , , , , web-.
  4. , ( ) .
  5. . , tiff, . — , gif — .
  6. .
  7. : , , , .
  8. .
  9. ( ) , .
  10. ( ), .

Dans le système d'exploitation Sivelkiriya, chacune des entités énumérées ci-dessus est décrite par une certaine interface de données. Une telle représentation permet leur utilisation dans de nombreux contextes en dehors du modèle d'origine (qui seront discutés plus loin).

Chaque interface est implémentée par un objet, qui est créé par un module. Le code des méthodes de l'objet est exécuté dans le cadre du module qui l'a généré. Dans le même temps, il est incorrect de parler de lancement de modules en tant qu'applications distinctes, car ils n'ont ni leurs propres threads, ni mémoire en dehors des objets créés par eux. Si vous avez besoin de stocker un état qui va au-delà du travail avec une seule image, il est stocké dans un objet séparé, dont l'accès est effectué selon des règles générales - via l'interface d'objet OS.

La structure des modules impliqués dans les travaux de ce programme peut ressembler à ceci:

  1. Le premier module définit le comportement d'un objet qui implémente l'interface «Object location» (une image est un cas particulier d'un objet). En particulier, il détermine comment accéder aux octets à partir d'un emplacement donné. Cependant, il peut utiliser des modules qui fournissent un accès direct au disque ou à la prise en charge réseau, en fonction de l'emplacement physique de l'objet.
  2. Le deuxième module fournit un accès direct aux octets d'image. En outre, il fournit des conseils sur le type de contenu possible en fonction de la méthode de stockage (extension de fichier, en-têtes de serveur Web, etc.).
  3. Le troisième module, en utilisant des conseils sur le type de contenu et l'accès à sa représentation en octets, détermine le type réel de contenu (format de fichier image).
  4. , ( , , ) ( ) . , : , . — : jpeg .
  5. , , , , . — — , , .
  6. , . , . — , , , , , , , .

Bien sûr, en plus des modules décrits, le programme peut participer à des modules qui fournissent des fonctionnalités supplémentaires: journalisation, rendu des composants de la fenêtre, rétroaction sonore, etc.

Il est facile de voir qu'une telle structure rend la réutilisation des fonctionnalités implémentées aussi simple que possible. Ainsi, l'installation d'un nouveau codec dans le système signifie que ce type d'image sera automatiquement pris en charge dans tous les contextes et dans tous les programmes. Différents modules peuvent être écrits par différents programmeurs et dans différentes langues, cependant, dans le cadre de ce modèle d'interaction, ces différences ne sont pas significatives. Un même codec peut être utilisé à la fois pour charger des images sur un écran dans cette interface et pour les rendre dans un programme de messagerie, un navigateur, une visionneuse de répertoire, etc.

La prise en charge de nouveaux cas d'utilisation est réalisée de manière élémentaire. Par exemple, l'ajout de quelques interfaces supplémentaires vous permet de prendre en charge des actions telles que le déplacement vers les images suivantes et précédentes (quel que soit leur emplacement et comment y accéder) ou l'application de filtres. L'introduction d'un client léger n'est pas non plus un problème: puisque le passage des données et des appels à travers les frontières du module est contrôlé par le système d'exploitation, il est possible de transférer des opérations coûteuses (par exemple, décoder le contenu d'un fichier et mettre à l'échelle une image) vers une autre machine.

Les prototypes de tous les modules décrits ci-dessus étant connus du système d'exploitation, celui-ci connaît leurs besoins du point de vue du système et peut agir en conséquence. Par exemple, l'opération de mise à l'échelle de l'image peut être effectuée dans un thread séparé afin que le travail avec de grandes images ne bloque pas l'interface sur les ordinateurs bas de gamme. De plus, comme les modules ne font pas d'hypothèses sur les threads dans lesquels ils sont exécutés, des optimisations supplémentaires sont possibles: par exemple, le thread d'interface utilisateur peut être séparé du thread responsable de l'informatique (dans ce cas, la mise à l'échelle), uniquement si ce dernier Je n'ai pas eu le temps de terminer le travail dans une période de temps prédéterminée, et avec une nouvelle mise à l'échelle rapide, le dessin de l'image à une nouvelle échelle peut être démarré dans un flux supplémentaire avant mêmeen tant que thread engagé dans le rendu, qui n'a plus besoin d'être terminé, il parviendra à traiter le signal jusqu'à son terme. Étant donné que le système d'exploitation dispose d'informations sur tous les threads en cours d'exécution, sur le chargement et les capacités réelles des processeurs de l'ordinateur, les données d'optimisation peuvent être plus efficaces que celles que l'auteur d'une application distincte peut faire en fonction d'hypothèses sur son environnement d'exécution.

La question de savoir comment les modules qui fournissent conjointement une solution à un problème appliqué sont liés entre eux peut être résolue de plusieurs manières. Par exemple, il est évident que le choix d'un module qui lit les octets d'un fichier à partir du disque est déterminé par le système de fichiers de cette section, et dans tous les cas d'accès à la même section, le même module sera utilisé. Le module chargé de déterminer le format d'image est susceptible d'être installé au niveau du système et utilisé dans tous les contextes. Une exception peut être les cas où un module tombe en panne: dans ce cas, le système d'exploitation peut rechercher un autre module installé qui correspond à ce prototype, et s'il existe, essayez de l'utiliser avec les mêmes données d'entrée. De cette façon,l'erreur peut être traitée sans intervention de l'utilisateur, et les données la concernant sont collectées et, si les politiques de sécurité de cette machine le permettent, transmises aux développeurs du module de problème avec les informations connexes nécessaires. Dans le cas où un module rencontre souvent des problèmes, le système d'exploitation peut décider de l'exclure de la chaîne de recherche ou d'abaisser sa priorité.

Dans d'autres cas, le choix du module peut être défini par l'utilisateur et stocké dans la configuration. Ainsi, différents modules de mise à l'échelle de l'image peuvent fournir un style de rendu différent (paramètres d'anti-aliasing lors d'un zoom arrière ou flou des bordures de pixels lorsqu'il augmente). Selon le contexte, l'utilisateur peut avoir besoin d'une approche différente (bordures de pixels nettes pour un positionnement précis ou floues pour le confort visuel).

Les méthodes de démarrage des modules peuvent également varier. Par exemple, le module responsable du rendu de la fenêtre de visualisation d'images peut être appelé par le module responsable du rendu du bureau (en cliquant sur le fichier graphique sur le bureau), ou par le module qui affiche le menu de lancement du programme. Après le démarrage, le module de fenêtre charge les modules dont il a besoin pour terminer la tâche en cours.

Cette description n'est qu'une démonstration de la possibilité fondamentale de mettre en œuvre un tel schéma d'interaction et ne peut pas être considérée comme une instruction complète pour écrire une visionneuse d'images, un système d'exploitation et / ou des modules pour celui-ci.

Les articles précédents de la série sont disponibles ici: un , deux , trois , quatre. Le texte intégral, comme précédemment, est disponible sur le site Web du projet .

All Articles