OS "Sivelkiriya": Ein Beispiel für die Erstellung eines Programms

Hallo Habr.

Dieser Beitrag setzt den Zyklus der Veröffentlichungen über das OS-Projekt Sivelkiriya fort. Der erste Artikel des Zyklus enthielt eine allgemeine Beschreibung des Konzepts, der zweite erläuterte, warum es benötigt wurde und in welcher Form das Produkt das Licht sehen konnte, der dritte beschrieb Architekturlösungen und der vierte beantwortete die Frage, wie die Aktionen von Betriebssystementwicklern und koordiniert werden sollten Software in diesem Modell. Dieser Artikel zeigt ein Beispiel für die Aufteilung eines einfachen Programms in Module, um es in die Realität des neuen Betriebssystems zu integrieren.

Stellen Sie sich ein klassisches Beispiel vor: Ein Programm, mit dem Sie eine Datei mit einem Bitmap-Bild öffnen und auf dem Bildschirm anzeigen können. Das Bild kann skaliert werden. Wenn die Größe im aktuellen Maßstab die Bildschirmgröße überschreitet, scrollen Sie.

In modernen Betriebssystemen wird dieses Problem häufig durch eine Anwendung mit einer geschlossenen Architektur gelöst, die entweder selbst den gesamten erforderlichen Code enthält oder Komponenten von Drittanbietern ausschließlich von sich aus verwendet. Der entscheidende Punkt ist, dass Sie einen Teil der Anwendung nicht verwenden können - Sie können sie entweder unverändert starten oder eine andere Lösung verwenden.

Um zu verstehen, wie dieses Problem im Rahmen des Sivelkiriya-Betriebssystems gelöst wird, müssen Sie zunächst „unter die Haube“ dieses Programms schauen und verstehen, was es tut und mit welchen Konzepten es arbeitet. Das Folgende sind die Entitäten, die während des Betriebs des Programms entstehen.

  1. Der Ort des Bildes.Im klassischen Fall wird dies durch den Pfad zur Datei auf der Festplatte beschrieben. Mit etwas größerer Betrachtung fallen auch Adressen im lokalen Netzwerk oder im Internet in diese Kategorie. Dies schöpft jedoch nicht alle Möglichkeiten aus: Das Bild kann sich im RAM, am Ausgang eines Programms (z. B. eines Fotoprozessors oder eines Grafik-Renderers), auf einer Webseite, in einer Chat- oder E-Mail-Nachricht, in einem Archiv oder einem Office-Dokument befinden. Trotz der Tatsache, dass sich technisch alle diese Optionen voneinander unterscheiden und eine unterschiedliche Verarbeitung erfordern, dienen sie aus Sicht des Benutzers alle einem Zweck: Sie geben an, wo sich das Bild befindet, das er anzeigen möchte. Das Erstellen einer Schnittstelle, mit der Sie unter so vielen Optionen auswählen können, ist keine triviale Aufgabe, aber konzeptionell gibt es keine Hindernisse für diesen Ansatz.Darüber hinaus gibt es keinen Grund, warum dem Benutzer nicht die Möglichkeit gegeben werden sollte, das Bild an einem der oben genannten Orte anzuzeigen.
  2. , . , , , .
  3. . , , jpeg gif. : jpeg .gif, gif . , , , , web-.
  4. , ( ) .
  5. . , tiff, . — , gif — .
  6. .
  7. : , , , .
  8. .
  9. ( ) , .
  10. ( ), .

Innerhalb des Betriebssystems Sivelkiriya wird jede der oben aufgeführten Entitäten durch eine bestimmte Datenschnittstelle beschrieben. Eine solche Darstellung ermöglicht ihre Verwendung in vielen Kontexten außerhalb des ursprünglichen Modells (auf das später eingegangen wird).

Jede Schnittstelle wird von einem Objekt implementiert, das von einem Modul erstellt wird. Der Code der Methoden des Objekts wird im Rahmen des Moduls ausgeführt, das es generiert hat. Gleichzeitig ist es falsch, über das Starten von Modulen als separate Anwendungen zu sprechen, da sie weder über eigene Threads noch über Speicher außerhalb der von ihnen erstellten Objekte verfügen. Wenn Sie einen Status speichern müssen, der über die Arbeit mit einem einzelnen Image hinausgeht, wird dieser in einem separaten Objekt gespeichert, auf das nach allgemeinen Regeln zugegriffen wird - über die OS-Objektschnittstelle.

Die Struktur der Module, die an der Arbeit dieses Programms beteiligt sind, kann folgendermaßen aussehen:

  1. Das erste Modul definiert das Verhalten eines Objekts, das die Schnittstelle „Objektposition“ implementiert (ein Bild ist ein Sonderfall eines Objekts). Insbesondere wird festgelegt, wie von einem bestimmten Speicherort aus auf Bytes zugegriffen werden soll. Er kann jedoch Module verwenden, die je nach physischem Standort des Objekts direkten Zugriff auf die Festplatte oder die Netzwerkunterstützung bieten.
  2. Das zweite Modul bietet direkten Zugriff auf Bildbytes. Darüber hinaus enthält es Hinweise zum möglichen Inhaltstyp basierend auf der Speichermethode (Dateierweiterung, Webserver-Header usw.).
  3. Das dritte Modul bestimmt anhand von Hinweisen zum Inhaltstyp und zum Zugriff auf die Bytedarstellung den tatsächlichen Inhaltstyp (Bilddateiformat).
  4. , ( , , ) ( ) . , : , . — : jpeg .
  5. , , , , . — — , , .
  6. , . , . — , , , , , , , .

Zusätzlich zu den beschriebenen Modulen kann das Programm natürlich an Modulen teilnehmen, die zusätzliche Funktionen bieten: Protokollierung, Rendern von Fensterkomponenten, Audio-Feedback usw.

Es ist leicht zu erkennen, dass eine solche Struktur die Wiederverwendung implementierter Funktionen so einfach wie möglich macht. Wenn Sie also einen neuen Codec im System installieren, wird dieser Bildtyp automatisch in allen Kontexten und in allen Programmen unterstützt. Verschiedene Module können von verschiedenen Programmierern und in verschiedenen Sprachen geschrieben werden. Im Rahmen dieses Interaktionsmodells sind diese Unterschiede jedoch nicht signifikant. Ein und derselbe Codec kann sowohl zum Laden von Bildern auf einen Bildschirm in dieser Benutzeroberfläche als auch zum Rendern in einem Nachrichtenprogramm, einem Browser, einem Verzeichnisinhalts-Viewer usw. verwendet werden.

Die Unterstützung für neue Anwendungsfälle erfolgt elementar. Wenn Sie beispielsweise einige zusätzliche Schnittstellen hinzufügen, können Sie Aktionen unterstützen, z. B. das Wechseln zum nächsten und vorherigen Bild (unabhängig von deren Position und Zugriff) oder das Anwenden von Filtern. Die Einführung eines Thin Clients ist ebenfalls kein Problem: Da der Durchgang von Daten und Aufrufen über die Grenzen des Moduls vom Betriebssystem gesteuert wird, können teure Vorgänge (z. B. Dekodieren des Inhalts einer Datei und Skalieren eines Bildes) auf einen anderen Computer übertragen werden.

Da die Prototypen aller oben beschriebenen Module dem Betriebssystem bekannt sind, kennt es deren Anforderungen aus Systemsicht und kann entsprechend handeln. Beispielsweise kann die Bildskalierungsoperation in einem separaten Thread ausgeführt werden, sodass die Arbeit mit großen Bildern die Schnittstelle auf Low-End-Computern nicht blockiert. Da die Module keine Annahmen über die Threads treffen, in denen sie ausgeführt werden, sind darüber hinaus zusätzliche Optimierungen möglich: Beispielsweise kann der Benutzeroberflächenthread nur dann vom Thread getrennt werden, der für die Berechnung verantwortlich ist (in diesem Fall Skalierung) Ich hatte keine Zeit, die Arbeit innerhalb eines festgelegten Zeitraums abzuschließen, und mit einer schnellen Neuskalierung kann das Zeichnen des Bildes in einem neuen Maßstab bereits zuvor in einem zusätzlichen Stream gestartet werdenAls Thread, der sich mit dem Rendern befasst und nicht mehr abgeschlossen werden muss, kann er das Signal bis zur Fertigstellung verarbeiten. Da das Betriebssystem Informationen zu allen laufenden Threads, zum Laden und zu den tatsächlichen Funktionen der Prozessoren des Computers enthält, können die Optimierungsdaten effektiver sein als diejenigen, die der Autor einer separaten Anwendung basierend auf Annahmen über die Ausführungsumgebung ausführen kann.

Die Frage, wie die Module, die gemeinsam eine Lösung für ein angewandtes Problem bieten, miteinander verknüpft sind, kann auf verschiedene Weise gelöst werden. Beispielsweise ist es offensichtlich, dass die Auswahl eines Moduls, das Bytes einer Datei von der Festplatte liest, vom Dateisystem dieses Abschnitts bestimmt wird, und in allen Fällen des Zugriffs auf denselben Abschnitt wird dasselbe Modul verwendet. Das Modul, das für die Bestimmung des Bildformats verantwortlich ist, wird wahrscheinlich auf Systemebene installiert und in allen Kontexten verwendet. Eine Ausnahme können Fälle sein, in denen ein Modul ausfällt: In diesem Fall kann das Betriebssystem nach einem anderen installierten Modul suchen, das diesem Prototyp entspricht, und versuchen, es mit denselben Eingabedaten zu verwenden, falls vorhanden. Auf diese Weise,Der Fehler kann ohne Benutzereingriff verarbeitet werden, und Daten darüber werden gesammelt und, sofern die Sicherheitsrichtlinien dieses Computers dies zulassen, zusammen mit den erforderlichen zugehörigen Informationen an die Entwickler des Problemmoduls weitergeleitet. Wenn ein Modul häufig Probleme hat, kann das Betriebssystem entscheiden, es aus der Suchkette auszuschließen oder seine Priorität darin zu verringern.

In anderen Fällen kann die Auswahl des Moduls benutzerdefiniert und in der Konfiguration gespeichert werden. Verschiedene Bildskalierungsmodule können daher einen unterschiedlichen Rendering-Stil bereitstellen (Anti-Aliasing-Parameter beim Verkleinern oder Verwischen der Pixelränder beim Vergrößern). Je nach Kontext benötigt der Benutzer möglicherweise einen anderen Ansatz (scharfe Pixelränder für eine präzise Positionierung oder verschwommen für visuellen Komfort).

Die Methoden zum Starten von Modulen können ebenfalls variieren. Das Modul, das für das Rendern des Bildbetrachterfensters verantwortlich ist, kann beispielsweise von dem Modul aufgerufen werden, das für das Rendern des Desktops verantwortlich ist (durch Klicken auf die Grafikdatei auf dem Desktop), oder von dem Modul, das das Programmstartmenü anzeigt. Nach dem Start lädt das Fenstermodul die Module, die es zum Ausführen der aktuellen Aufgabe benötigt.

Diese Beschreibung ist nur eine Demonstration der grundlegenden Möglichkeit der Implementierung eines solchen Interaktionsschemas und kann nicht als vollständige Anweisung zum Schreiben eines Bildbetrachters, Betriebssystems und / oder von Modulen dafür betrachtet werden.

Frühere Artikel der Reihe finden Sie hier: eins , zwei , drei , vier. Der vollständige Text ist nach wie vor auf der Projektwebsite verfügbar .

All Articles