DE10246369A1 - Regulating data access to data of at least one data memory involves individual systems reserving data or address areas of data source, blocking against access by other individual systems with locks with local and temporal components - Google Patents

Regulating data access to data of at least one data memory involves individual systems reserving data or address areas of data source, blocking against access by other individual systems with locks with local and temporal components Download PDF

Info

Publication number
DE10246369A1
DE10246369A1 DE10246369A DE10246369A DE10246369A1 DE 10246369 A1 DE10246369 A1 DE 10246369A1 DE 10246369 A DE10246369 A DE 10246369A DE 10246369 A DE10246369 A DE 10246369A DE 10246369 A1 DE10246369 A1 DE 10246369A1
Authority
DE
Germany
Prior art keywords
nest
data
operations
address
instance
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Withdrawn
Application number
DE10246369A
Other languages
German (de)
Inventor
Thomas Schoebel-Theuer
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Schobel-Theuer Thomas Dr
Original Assignee
Schobel-Theuer Thomas Dr
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Schobel-Theuer Thomas Dr filed Critical Schobel-Theuer Thomas Dr
Priority to DE10246369A priority Critical patent/DE10246369A1/en
Priority to DE10393434T priority patent/DE10393434D2/en
Priority to AU2003270288A priority patent/AU2003270288A1/en
Priority to PCT/EP2003/010792 priority patent/WO2004031954A2/en
Priority to PCT/EP2003/010794 priority patent/WO2004031955A2/en
Priority to US10/529,435 priority patent/US20060168413A1/en
Publication of DE10246369A1 publication Critical patent/DE10246369A1/en
Withdrawn legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F15/00Digital computers in general; Data processing equipment in general
    • G06F15/16Combinations of two or more digital computers each having at least an arithmetic unit, a program unit and a register, e.g. for a simultaneous processing of several programs
    • G06F15/163Interprocessor communication
    • G06F15/167Interprocessor communication using a common memory, e.g. mailbox
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0628Interfaces specially adapted for storage systems making use of a particular technique
    • G06F3/0629Configuration or reconfiguration of storage systems
    • G06F3/0637Permissions

Abstract

The method involves individual systems reserving data or address areas of a data source and blocking the individual areas against access by other individual systems, whereby the reservations or locks have local and temporal components. Address regions and/or partial address regions are shifted so that the allocation of logical addresses to physical addresses is altered in accordance with the shift operation while maintaining the physical addresses.

Description

1 Ziele und Grundidee 1 goals and basic idea

Die neue Betriebssystem-Architektur soll eine vollständige Verschmelzung von Datenbanken und Betriebssystemen ermöglichen, sowie den Funktionsumfang von verteilten Betriebssystemen, Netzwerk-Betriebssystemen und Echtzeit-Betriebssystemen, mit oder ohne MMU-Hardware, auf einer gemeinamen Code-Basis ermöglichen.The new operating system architecture intended a complete merger of databases and enable operating systems as well as the functionality of distributed operating systems, network operating systems and real-time operating systems, with or without MMU hardware, all on one enable common code base.

Der Schlüssel dazu ist eine universelle Erweiterbarkeit und dynamische Konfiguration zur Laufzeit, wodurch sich die neue Architektur prinzipiell für jedes dieser Anwendungsgebiete eignet. Darüber hinaus sollen neue Anwendungsgebiete durch Konfigurationen erschlossen werden, die weder mit bisherigen Betriebssystemen noch mit Datenbanken auf einfache Weise realisierbar waren.Of the key this is a universal extensibility and dynamic configuration at runtime, making the new architecture in principle for each This application is suitable. In addition, new application areas can be tapped by configurations that are neither with previous ones Operating systems even with databases easily feasible were.

Erreicht wird dieses Ziel durch die Abstraktionen Nest und Baustein. Es wird gezeigt, dass sich ein performantes Betriebssystem im Wesentlichen allein aus diesen beiden Abstraktionen aufbauen läßt.Reached This goal is through the abstractions nest and building block. It will demonstrated that a performant operating system is essentially can be built solely from these two abstractions.

Gegenüber aktuellen Betriebssystem- und Kern-Architekturen wird die innere Komplexität in vielen Fällen reduziert, da eine relativ kleine Menge von primitiven Grundoperationen sehr weite Bereiche der wesentlichen Grundfunktionen eines Betriebssystems abdeckt; nicht nur Konzepte wie Inodes und deren Caches werden durch die Konzepte Nest und Baustein ersetzt, sondern sogar bisher als absolut notwendig erachtete Konzepte wie Dateisysteme als solche.Opposite current ones Operating system and core architectures reduce internal complexity in many cases, because a relatively small amount of primitive basic operations are very wide areas of the essential basic functions of an operating system covers; not just concepts like inodes and their caches are going through replaced the concepts nest and building block, but even so far absolutely necessary concepts such as file systems as such.

Die vorgestellte Architektur schreibt keine speziellen Implementierungs-Paradigmen vor; es sind sowohl Implementierungen durch Server-Prozesse („Communicating Sequential Frocesses", z.B. in Mikrokern-Architekturen), als auch Implementierungen durch Rollenwechsel von Benutzer-Prozessen in Kern-Modi, als auch in Mischformen dieser Paradigmen möglich.The architecture presented does not write any special implementation paradigms in front; there are both implementations through server processes ("Communicating Sequential Frocesses ", e.g. in microkernel architectures) as well as implementations by Role change of user processes in core modes, as well as in mixed forms possible for these paradigms.

1.1 Einführung1.1 Introduction

Die Grundidee dieser Arbeit besteht darin, ein Betriebssystem auf allen Ebenen und Schichten im wesentlichen aus zwei Abstraktionen aufzubauen: Nester und Bausteine.The The basic idea of this work is to have an operating system at all To build layers and layers essentially from two abstractions: Nests and building blocks.

Präzisere Definitionen folgen später; zum Verständnis dieser Einführung reicht es, sich eine Nest-Instanz als einen (virtuellen) Adressraum vorzustellen, in dem sich Daten befinden können. Nicht alle Stellen dieses Adressraums müssen zugreifbar sein, es können beliebige Löcher darin vorhanden sein. Dies ähnelt einem Sparse File unter Unix, nur mit dem Unterschied, dass Zugriffe auf Löcher als Fehler behandelt werden. In Erweiterung zu bisher verwendeten Adressraum-Abstraktionen gibt es auf Nestern eine Verschiebe-Operation move, mit der ein ganzer Speicherblock im virtuellen Adressraum auf virtuelle Weise verschoben werden kann. Der Speicherblock erscheint anschließend unter verschobenen virtuellen Adressen; die Implementierung erfolgt jedoch so, dass keine tatsächlichen Kopieroperationen im Speicher ablaufen, sondern nur der virtuelle Eindruck einer Verschiebung entsteht.More precise definitions follow later; for understanding this introduction It is enough to have a nest instance as a (virtual) address space imagine where data can be located. Not all places this Address space must be accessible, it can any holes be present in it. This is similar a sparse file under Unix, only with the difference that requests on holes be treated as a mistake. In extension to previously used Address space abstractions have nests on a move operation move, with which a whole block of memory in the virtual address space can be moved in a virtual way. The memory block appears subsequently under moved virtual addresses; the implementation is done however, so that no actual Copy operations in memory expire, but only the virtual one Impression of a shift arises.

Bausteine kann man sich als „Transformatoren" vorstellen, die ein oder mehrere Eingangs-Nester in ein oder mehrere andere Ausgangs-Nester transformieren. Bausteine lassen sich instantiieren, d.h. man kann beliebig viele Inkarnationen des gleichen Baustein-Typs herstellen, deren Eingänge sich mit den Ausgängen anderer Baustein-Instanzen verbinden oder „verdrahten" lassen. Als für Menschen leicht verständliche Darstellung benutze ich Zeichnungen, wie sie in der Elektro- und Digitaltechnik für Schaltbilder verwendet werden. Eine Baustein-Instanz wird als Kästchen mit linksseitigen Eingängen und rechtsseitigen Ausgängen gezeichnet. Die „Verdrahtungsregeln" sind gleich wie bei Schaltbildern in der Elektrotechnik.building blocks one can imagine oneself as "Transformatoren", which one or more entrance nests into one or more other exit nests transform. Blocks can be instantiated, i. you can choose any produce many incarnations of the same building block type whose inputs with the exits of others Connect or "wire" block instances as for people easy to understand Representation I use drawings, as in the electrical and Digital technology for Schematics are used. A block instance is shown as a box left-side entrances and right-sided outputs drawn. The "wiring rules" are the same as in circuit diagrams in electrical engineering.

Als erstes Beispiel sehen wir uns in 1 ein Szenario an, wie es bei konventionellen Betriebssystemen auftritt. Am Ende der Baustein-Hierarchie steht eine Instanz von mmu_i386, die einen (nicht eingezeichneten) virtuellen Benutzer-Adressraum 1:1 auf ihr Eingangs-Nest abbildet, indem sie die MMU-Hardware (Memory Management Unit) benutzt. Der Benutzer-Adressraum enthält genau das, was sich im Eingangs-Nest dieses Bausteins „befindet" bzw. was dort vom Vorgänger-Baustein (virtuell) zur Verfügung gestellt wird. In Beispiel ist dies ein virtuelles Prozessabbild, das von der union-Instanz generiert wird und als wesentliche Grundelemente jeweils ein Code-, ein Daten-, ein Stack-„Segment" sowie eine virtuelle Abbildung einer mmap-Datei zu einem ausführbaren Prozessabbild zusammenstellt. Der Begriff „Segment" wird jedoch in dieser Arbeit nicht verwendet, da er mit der Nest-Abstraktion zusammenfällt bzw. einen Spezialfall davon darstellt (üblicherweise enthält ein Segment lediglich keine Löcher).The first example is in 1 a scenario as it occurs with conventional operating systems. At the end of the building block hierarchy is an instance of mmu_i386, which maps a (not shown) virtual user address space 1: 1 on its input nest by using the MMU hardware (Memory Management Unit). The user address space contains exactly what is "located" in the input nest of this block, or what is provided there (virtually) by the predecessor block, in this example, a virtual process image that is generated by the union instance and composes as essential basic elements in each case a code, a data, a stack "segment" and a virtual image of a mmap file to an executable process image. However, the term "segment" is not used in this work because it coincides with, or is a special case of, the nest abstraction (usually contains a segment only no holes).

Der union-Baustein wird aus mehreren Quellen gespeist. Drei davon sind Nest-Instanzen, die man konventionell als „Dateien" oder „Files" bezeichnen würde: eine Quelle ist eine device_ramdisk-Instanz, die flüchtigen Hauptspeicher bereitstellt (in der Praxis ist es sinnvoll, hierfür eine gepufferte „temporäre Datei" zu verwenden, damit bei Speichermangel ein Auslagern auf Hintergrundspeicher möglich ist).Of the union block is fed from multiple sources. Three of them are Nest instances conventionally referred to as "files" or "files": a source is a device_ramdisk instance, the fleeting ones Memory (in practice it makes sense to use a buffered "temporary file" for this purpose) in case of lack of storage it is possible to outsource to background storage).

Die „Datei"-Nester stammen wiederum aus Quellen, die die Bezeichnung dir_*tragen. Die dir_*-Bausteine erfüllen ungefähr die gleichen Funktionen wie Verzeichnisse in konventionellen Dateisystemen. Im Unterschied zu konventionellen Dateisystemen implementieren sie keine Verzeichnis-Bäume, sondern nur flache Verzeichnisse. Durch Schachtelung von dir_*-Instanzen lassen sich sehr leicht konventionelle Verzeichnisbaum-Hierarchien nachbilden. Man kann sich eine dir_*-Instanz als eine Art „Container" vorstellen, der den Platz für seine Ausgangs-Nester in seinem Eingangs-Nest allokiert und verwaltet. Dabei wird die Tatsache ausgenutzt, dass das Eingangs-Nest die relativ billige Verschiebeoperation move bereitstellt, mit deren Hilfe das Platzmanagement leicht lösbar wird. Verschiebe-Operationen können beispielsweise benutzt werden, wenn neue Ausgangs-Nester hinzukommen oder wenn sich die Größe oder der Platzbedarf eines Ausgangs-Nestes ändert.The "file" nests are again from sources bearing the name dir_ *. The you _ * - building blocks fulfill approximately the same functions as directories in conventional file systems. Unlike conventional file systems, they implement no directory trees, but only flat directories. By nesting you _ * instances can easily be conventional directory tree hierarchies replicate. One can imagine a you _ * - instance as a kind of "container", the the place for its initial nests are allocated and managed in its entrance nest. The fact is exploited that the entrance nest the relative cheap move operation provides move, with the help of which space management easily detachable becomes. Shift operations can For example, when new starting nests are added or if the size or the space requirement of an initial nest changes.

Die billige virtuelle Verschiebeoperation muss irgendwo herkommen und implementiert werden; dies erledigt die map_simple-Instanz, die im Beispiel an der „Wurzel" der Verzeichnis-Hierarchie steht. Dort werden diejenigen Probleme gelöst, die bei konventionellen Dateisystemen als Fragmentierungs-Probleme bekannt sind (Lokalitätsverhalten des Zugriffs).The cheap virtual move operation must come from somewhere and to be implemented; this is done by the map_simple instance, the in the example at the "root" of the directory hierarchy stands. There, those problems are solved that are conventional File systems are known as fragmentation problems (local behavior of access).

Die vorgeschaltete buffer-Instanz sorgt für die Entkoppelung des zeitlichen Zugriffsverhaltens auf langsame Peripheriegeräte wie z.B. Festplatten (device_ide), und läßt sich von der Funktionalität her mit konventionellen Buffer-Caches vergleichen.The upstream buffer instance ensures the decoupling of the temporal Access behavior to slow peripheral devices such as Hard drives (device_ide), and lets himself go from the functionality compare to conventional buffer caches.

Sämtliche Leitungen in der Zeichnung repräsentieren Nest-Instanzen, die jeweils immer die gleiche Schnittstelle besitzen. Die Bausteine sind daher in beinahe beliebiger Weise miteinander kombinierbar (die Frage ist nur, welche Kombinationen Sinn machen).All Represent lines in the drawing Nest instances, each with the same interface. The components are therefore in almost any way with each other combinable (the only question is which combinations make sense).

Das Beispiel in 2 soll die Flexibilität dieses Systems andeutungsweise demonstrieren. Im Vergleich zu vorhin kommen zwei remote-Instanzen hinzu, die das Client-Server-Paradigma auf Nester übertragen. Eine remote-Instanz macht ein Nest so auf einem anderen Rechner verfügbar, als wäre es dort lokal vorhanden. Die eine remote-Instanz sitzt im Beispiel am Ende der Hierarchie und macht ein komplettes Prozessabbild auf einem anderen Rechner verfügbar. Dort befindet sich eine weitere mmu_i386-Instanz, in der parallele Kontrollflüsse ablaufen können, die sich physikalisch auf einem anderen Rechner befinden. Mit ähnlichen Konfigurationen läßt sich beispielsweise verteiltes Rechnen (number-crunching) oder Prozess-Migration betreiben.The example in 2 should demonstrate the flexibility of this system suggestively. Compared to earlier, two remote instances are added, which transfer the client-server paradigm to nests. A remote instance makes a nest available on another machine as if it were there locally. In the example, the one remote instance is at the end of the hierarchy and makes a complete process image available on another computer. There is another mmu_i386 instance in which parallel control flows can physically run on another machine. With similar configurations, for example, distributed-number-crunching or process migration can be performed.

Die andere remote-Instanz stellt das andere Extrem von möglichen Einsatz-Szenarien dar: die bisherige „Wurzel" der Verzeichnis-Hierarchie wird auf einem anderen Rechner verfügbar gemacht; diese Funktionalität entspricht etwa derjenigen von konventionellen Netzwerk-Dateisystemen. Wie man an diesem Beispiel sieht, braucht hierfür kein neuer Baustein-Typ implementiert zu werden. Die anderen Bausteine müssen dazu allerdings eine später genauer untersuchte Kompetenz, nämlich die multiuser- oder multiversion-Kompetenz. Nur wenn diese gegeben ist, dürfen Eingänge mehrerer Baustein-Instanzen parallel am gleichen Ausgang angeschlossen werden.The another remote instance represents the other extreme of possible Usage scenarios: the previous "root" of the directory hierarchy is on available on another computer made; this functionality is similar to that of conventional network file systems. As you can see from this example, no new block type needs to be implemented to become. However, the other components need to be more precise later examined competence, namely the multiuser or multi-version competence. Only if this is given, may inputs of several Block instances are connected in parallel to the same output.

Das Beispiel 3 soll andeuten, wie sich die Funktionalität von Datenbanken auf Basis der Abstraktionen Nest und Baustein implementieren läßt. Die Grundidee besteht darin, (relationale) Datenbank-Tabellen in Nestern abzulegen. Der Baustein join führt die bekannte Join-Operation durch, indem er an seinem Ausgang eine virtuelle Produkt-Tabelle zur Verfügung stellt, die lesbar und ggf. auch in gewissen Grenzen modifizierbar sein kann. Der nachfolgende transaction-Baustein dient als Isolations-Pufferfür zwei transaktionale Sichten, die voneinander unabhängige isolierte Sichten mit der bekannten ACID-Eigenschaft (siehe z.B. [HR83; LS87, GR93]) bereitstellt. Die beiden Sichten werden im Beispiel in Benutzer-Adressräume eingeblendet; damit haben wir einen Synergieeffekt zwischen dem Fachgebiet der Betriebssysteme und der Datenbanken ermöglicht.The Example 3 is intended to indicate how the functionality of databases implement nest and building block based on the abstractions. The The basic idea is to (relational) database tables in nests store. The building block joins perform the well-known join operation by making a virtual one at its output Product table available which can be readable and, if necessary, modified within certain limits can be. The following transaction block serves as an isolation buffer for two transactional ones Views, the independent isolated views with the known ACID property (see, e.g. [HR83; LS87, GR93]). The two views are in the example in user address spaces displayed; so we have a synergy between the Specialization of operating systems and databases.

Wie man sich leicht vorstellen kann, sind transaktionale Sichten nicht nur für die klassischen Einsatzgebiete in Datenbanken nützlich, sondern können je nach Einsatz an verschiedenen Stellen einer Baustein-Hierarchie beispielsweise zur Isolation kompletter Prozessabbilder, oder im anderen Extrem von Festplatten-Partitions-Abbildern dienen.As you can easily imagine, transactional views are not only useful for traditional database applications, but can also be used at different locations in a building block hierarchy, for example, to isolate complete process images, or at the other extreme, from solid serve to disk partition images.

2 Entwurfs-Prinzipien2 design principles

In diesem Kapitel möchte ich die allgemeinen Prinzipien darstellen und begründen, auf denen die vorgestellte Betriebssystem-Architektur beruht.In like this chapter I present and explain the general principles which the presented operating system architecture is based.

2.1 Generizität: Wahl der angemessenen Abstraktionsebene2.1 Genericity: choice the appropriate level of abstraction

Ausgangbasis aller Überlegungen ist die Funktionalität, die ein Betriebssystem implementieren muss, wenn es bestimmte Anforderungen erfüllen soll.base all considerations is the functionality which must implement an operating system if there are specific requirements fulfill should.

Die Anforderungen werden in dieser Arbeit als „freie Variable" betrachtet1. Anforderungen können sich fortlaufend ändern; daher werden Klassen von Anforderungen auf informelle Weise betrachtet.The requirements are in this work as "free variable" considered one needs to change continuously;. Therefore, classes are considered requests informally.

Für die zu implementierende Funktionalität gilt ein informelles Gesetz, das im Volksmund als "von nichts kommt nichts" bekannt ist. Alles, was das System leisten soll (unabhängig davon, was das sein soll), muss irgendwo irgendwie von irgendwem implementiert werden.For the too implementing functionality applies an informal law, which comes in the vernacular as "nothing nothing "known is. Everything the system should do (regardless of what it should be) somehow somehow be implemented by anyone.

Gängige Methoden zur Lösung dieser Problematik werden vor allem im Software-Engineering, speziell bei den objektorientierten Entwurfs-Methoden (z.B. [Mey88]) gelehrt (Stichwort Anpassbarkeit an neue Aufgabenstellungen). Der objektorientierte Ansatz versucht dabei die Wiederverwendbarkeit von Software-Modulen zu verbessern, indem er die Erweiterung bestehender Module und Schnittstellen zum Zwecke der Anpassung an neue Aufgabenstellungen ermöglicht. In der Praxis eingesetzte objektorientierte Software mit einer längeren Entwicklungsgeschichte zeigt nicht selten eine riesige Ansammlung von Klassen mit einer ziemlich komplizierten Klassen-Hierarchie und schwer durchschaubaren Vererbungs- und Enthaltenseins-Beziehungen („is-a" und „has-a"-Beziehungen). Bei eingehender Betrachtung findet sich darin viel Redundanz, die (vielleicht) hätte vermieden werden können, wenn man die jetzigen Anforderungen von Anfang an gekannt hätte und bei sorgfältigem Systementwurf berücksichtigt hätte2.Common methods for solving this problem are mainly taught in software engineering, especially in object-oriented design methods (eg [Mey88]) (keyword adaptability to new tasks). The object-oriented approach seeks to improve the reusability of software modules by enabling the extension of existing modules and interfaces for the purpose of adapting to new tasks. In practice, object-oriented software with a longer history of development often reveals a vast collection of classes with a rather complicated class hierarchy and difficult-to-understand inheritance and containment relationships ("is-a" and "has-a" relationships). On closer inspection, there is a lot of redundancy that (maybe) could have been avoided if the present requirements had been known from the start and taken into account with careful system design 2 .

Die allgemeine Fragestellung lautet daher, wie man unnötige Redundanz in der Implementierung möglichst weitgehend vermeiden kann, selbst wenn alle Anforderungen (noch) gar nicht bekannt sind.The general issue is therefore how to avoid unnecessary redundancy in the implementation as possible can largely avoid, even if all requirements (still) are not known at all.

2.1.1 Parametrische Generizität2.1.1 Parametric Genericity

Ein Mittel zur Vermeidung unnötiger Redundanzen ist der Einsatz von Generizität.One Means to avoid unnecessary Redundancy is the use of genericity.

Als Generizität betrachte ich jedes Mittel, das es erlaubt, ähnliche Dinge nur einmal hinzuschreiben, obwohl sie mehrmals vorkommen (evtl. in Varianten).When genericity I look at every means that allows to write down similar things only once, though they occur several times (possibly in variants).

Diese Definition ist wesentlich weit-reichender als die oftmals in der Literatur anzutreffende Verwendung des Begriffs Generizität (siehe z. B. [Mey88, Kapitel 6 und 19]). Ich verwende diesen Begriff nicht in der Reinform, sondern betrachte immer nur Spielarten3 von Generizität.This definition is much more far-reaching than the use of the term genericity, which is often used in the literature (see, for example, [Mey88, Chapters 6 and 19]). I do not use this term in its pure form, but always look at varieties 3 of genericity.

Eine besondere Spielart ist die parametrische Generizität. Beispiele hierfür sind Ersetzungmechanismen wie z.B. der Lambda-Kalkül (siehe z.B. [Fie88]) und seine Anwendung in funktionalen Sprachen wie Lisp oder ML oder Haskell (vgl. [Tho96]), Parameter-Substitution in Makro-Präprozessoren, Parameter von Template-Mechanismen in objektorienten Sprachen wie C++, oder Anwendungen des Schlüsselwortes generic in Ada. Parametrizität bedeutet, dass im Unterschied zu allgemeineren Ersetzungsmechanismen wie z.B. Chomsky-Typ-0-Grammatiken oder L-Systeme keine beliebigen Ersetzungen möglich sind, sondern syntaktisch eindeutig gekennzeichnete Platzhalter, die formale Parameter genannt werden, durch Terme oder Ausdrücke mit einer festgelegten Syntax (aktuelle Parameter) substituiert werden.A special feature is the parametric genericity. Examples therefor are replacement mechanisms, e.g. the lambda calculus (see e.g. [Fie88]) and its application in functional languages such as Lisp or ML or Haskell (see [Tho96]), parameter substitution in macro preprocessors, Parameters of template mechanisms in object-oriented languages such as C ++, or keyword applications generic in Ada. parametricity means that unlike more general substitution mechanisms such as. Chomsky type 0 grammars or L systems none arbitrary Replacements possible are syntactically uniquely identified placeholders, which are called formal parameters, by terms or expressions with a fixed syntax (current parameters).

In der Literatur wird häufig der nackte Begriff der Generizität in ungefähr der gleichen Bedeutung wie hier die parametrische Generizität verwendet, oder er steht in noch weiterer Einschränkung synonym für parametrische Polymorphie von Typen (vgl. [CW85]), beispielsweise bei Meyer [Mey88, Kapitel 6 und 19]4. Das Konzept der parametrischen Generizität setzt nicht das Vorhandensein von Typprüfungen voraus5, jedoch sollten im Idealfall derartige Mechanismen vorhanden sein. Moderne funktionale Sprachen wie Haskell erlauben Typsicherheit durch automatisierte Typ-Inferenz sogar bei Typ-Parametern (parametrische Polymorphie von Typen, vgl. [CW85]). Makro-Präprozessoren führen dagegen meist nur eine reine Text-Substitution durch, die zwar universell für beliebige programmiersprachliche Konstrukte anwendbar ist, aber keine separate Prä-Compilierung und keine Typprüfung von Makros ermöglicht6.In the literature, the naked concept of genericity is often used in roughly the same sense as parametric genericity, or, in still further limitation, synonymous with parametric polymorphism of types (see [CW85]), for example, Meyer [Mey88, Chapter 6 and 19] 4 . The concept of parametric genericity does not require the presence of type tests 5 , but ideally such mechanisms should be present. Allow modern functional languages like Haskell Type safety through automated type inference even with type parameters (parametric polymorphism of types, see [CW85]). In contrast, macro preprocessors usually only perform a pure text substitution, which is universally applicable to arbitrary programming language constructs, but does not allow separate pre-compilation and type checking of macros 6 .

Parametrische Generizität erlaubt die Automatisierung immer wiederkehrender Programmierungs- und Formulierungs-Vorgänge. Formale Parameter können mehrmals auf verschiedene Weise durch verschiedene aktuelle Parameter substituiert werden. Dadurch ist eine kompakte Notation möglich, die Redundanz bei der Formulierung eines Algorithmus sparen hilft. Dieser Effekt ist nicht nur bei der Programmierung im Kleinen, sondern auch bei der Programmierung im Großen nutzbar.parametric genericity allows the automation of repetitive programming and Formulation processes. Formal parameters can several times in different ways by different current parameters be substituted. This makes a compact notation possible Redundancy in the formulation of an algorithm helps to save. This Effect is not only in programming on a small scale, but also usable in programming on a large scale.

Im Folgenden werde ich weitere Arten von Generizität auf informelle Weise vorstellen, die sich durch parametrische Generizität darstellen und simulieren lassen. Diese informell verwendeten Begriffe stellen kein eigenständiges theoretisches Konzept dar, sondern sind vielmehr als Denk-Kategorien oder besser Denk-Hilfsmittel für den Entwurf von komplexen Systemen durch Menschen gedacht.in the Below, I will introduce more types of genericity in an informal way, which can be represented and simulated by parametric genericity to let. These informally used terms do not represent an independent theoretical Concept rather than thinking categories or better thinking aids for the Design of complex systems thought by humans.

Die Grundregel beim Entwurf lautet: verwende Generizität, wo immer es auf einfache Weise möglich ist und wo immer es Redundanz einsparen kann7.The basic rule of design is: use genericity wherever it is easily possible and wherever it can save redundancy 7 .

2.1.2 Erweiterungs-Generizität2.1.2 Expansion Genericity

Die in der Objektorientierung verwendete Erweiterung bzw. Spezialisierung von Schnittstellen durch Vererbung (gelegentlich auch die Einschränkung von Schnittstellen) läßt sich ebenfalls als eine besondere Art bzw. als Spezialfall von parametrischer Generizität charakterisieren: Erweiterungs-Generizität.The extension or specialization used in object orientation of interfaces through inheritance (occasionally the limitation of Interfaces) can be also as a special kind or as a special case of parametric genericity characterize: extension genericity.

Erweiterungs-Generizität läßt sich auch durch theoretische Begriffe wie Untertypen (subtyping, vgl. [CW85]) oder praxisnähere Ausprägungen wie Abstrakte Basisklassen beschreiben.Expansion genericity can be also by theoretical terms such as subtypes (subtyping, see [CW85]) or more practical manifestations How to describe abstract base classes.

Im Anhang A wird durch ein Beispiel nachgewiesen, dass sich die Vererbung prinzipiell durch parametrische Generizität simulieren läßt8. Dieses Beispiel soll kein Vorbild guten Software-Engineerings darstellen, sondern lediglich zeigen, dass man prinzipiell die Vererbung sogar mit primitiven Mitteln wie dem C-Präprozessor nachbilden kann, obwohl der C-Präprozessor nicht einmal bedingte Ausdrücke innerhalb von Makro-Expansionen auswerten kann (was jedoch zur Nachbildung überschriebener Methoden sehr nützlich wäre). Der interessierte Leser, der das Beispiel aus Anhang A nachzuvollziehen versucht, wird auf den Kunstgriff verwiesen, dass man in einigen Makro-Sprachen die Namen von zu expandierenden Makros auch berechnen kann; im C-Präprozessor benötigt man dazu den Konkatenations-Operator ##. Dieser Kunstgriff wird u.a. auch gerne in Kreisen von TEX-Programmierern eingesetzt (vgl.\csname in [Knu94]).In Appendix A, an example shows that inheritance can be simulated in principle by parametric genericity 8 . This example is not intended to be a model of good software engineering, but merely to show that inheritance can in principle be replicated using primitive means such as the C preprocessor, although the C preprocessor can not even evaluate conditional expressions within macro-expansions however, it would be very useful to copy overridden methods). The interested reader, who tries to understand the example in Appendix A, is referred to the artifice that in some macro languages one can also compute the names of macros to be expanded; in the C preprocessor one needs the concatenation operator ##. Among other things, this trick is often used in the circles of T E X programmers (see \ csname in [Knu94]).

Aus theoretischer Sicht handelt es sich hierbei um Funktionen höherer Ordnungen. Einige Verfechter objektorientierter Entwurfsmethoden wie z.B. [Mey88, Abschnitt 3.6.3] benutzen im Vergleich zu hier einen eingeschränkten Begriff von Generizität, dem sie dann nicht die Mächtigkeit zutrauen, den er bei entsprechender Fassung in der Theorie jedoch besitzt. Diese Mächtigkeit umfasst auch wesentliche Grundkonzepte der Objektorientierung. Daher betrachte ich Generizität schlechthin als Oberbegriff, unter den die Objektorientierung als Spezialfall untergeordnet wird.Out From a theoretical point of view these are functions of higher orders. Some proponents of object-oriented design methods such as e.g. [Mey88, Section 3.6.3] use a limited term compared to here of genericity, then they do not have the power he would be confident in the appropriate version in theory, however has. This power also includes essential basic concepts of object orientation. Therefore I look at genericity par excellence, under which the object orientation as Special case is subordinated.

2.1.3 Kompositorische Generizität2.1.3 Compositional genericity

Eine weitere besondere Form von Generizität spielt bei uniformen IO-Schnittstellen wie [Che87], in stapelbaren Dateisystem-Layern wie [HP94]9, in den Streams von System V Release 4 [GC94, Kapitel 7], oder beim Port-Konzept von Gnu Hurd [Hur] eine Rolle, die man als Vorläufer der hier vorgestellten Architektur ansehen kann. Konzeptuell wird bei den genannten Systemen die gleiche Art von Generizität wie bei der vorgestellten Architektur favorisiert, die ich kompositorische Generizität nennen möchte. Auf den ersten Blick scheint kompositorische Generizität keine parametrische Generizität zu sein, da die syntaktische Darstellung oftmals anders als in funktionalen Sprachen oder Makro-Sprachen aussieht. Wie wir jedoch in Abschnitt 6.3 sehen werden, implementieren Bausteine Funktionen in einem weiteren Sinn, wobei die Verdrahung von Bausteinen zu komplexeren Netzwerken sich als eine spezielle Art der Komposition von Funktionen auffassen lässt. Kompositorische Generizität ist ebenfalls eine Variante von parametrischer Generizität, die sich allerdings von der Erweiterungs-Generizität in der Entwurfs-Philosophie (nicht notwendigerweise jedoch in den verwendeten Mechanismen) stark unterscheidet: während objektorientierte Paradigmen ebenso wie die in den 1970er Jahren populären Hierarchie-Konzepte [Dij68, Dij71, BS75] ausdrücklich die Erweiterung von Schnittstellen bzw. von abstrakten Maschinen um neue Funktionalität durch Hinzunahme weiterer Operationen und Abstraktionen bezwecken und anstreben, wird bei kompositorischer Generizität das Gegenteil angestrebt: die Schnittstelle muss in den Grundzügen auf allen oder möglichst vielen Hierarchieebenen gleich oder zumindest weitgehend kompatibel bleiben, damit eine vielfältige Kombinierbarkeit möglich ist. Bei kompositorischer Generizität wird die Erweiterung der Funktionalität nicht durch Erweiterung der Schnittstellen, sondern durch Hinzunahme weiterer Funktionalität innerhalb der kombinierten Funktionen erzielt; neue Funktionalität ergibt sich mithin durch die besondere Art der Verdrahtung zu einem Netzwerk.Another particular form of genericity plays in uniform IO interfaces such as [Che87], in stackable file system layers such as [HP94] 9 , in the streams of System V Release 4 [GC94, Chapter 7], or in the port concept of Gnu Hurd [Hur] a role that can be regarded as a forerunner of the architecture presented here. Conceptually, the systems mentioned favor the same kind of genericity as in the architecture presented, which I would call compositional genericity. At first glance, compositional genericity does not seem to be parametric genericity, because the syntactic representation often looks different than in functional languages or macro languages. However, as we will see in Section 6.3, building blocks implement functions in a broader sense, with the wiring of building blocks to more complex networks considered to be a special way of composing functions. Compositional genericity is also a variant of parametric genericity, which, however, differs greatly from extension genericity in the design philosophy (but not necessarily in the mechanisms used): while object-oriented paradigms and popular hierarchy concepts in the 1970s [ Dij68, Dij71, BS75] expressly the extension of interfaces or of abstract machines aiming at new functionality by adding further operations and abstractions, the opposite is aimed at in terms of compositional genericity: the basic features of the interface must remain the same or at least largely compatible on all or as many hierarchical levels as possible in order to allow a wide variety of combinations. With compositional genericity, the enhancement of functionality is not achieved by extending the interfaces, but by adding further functionality within the combined functions; new functionality results from the special way of wiring to a network.

2.1.4 Universelle Generizität2.1.4 Universal Genericity

Um kompositorische Generizität über das bisherige Anwendungsfeld von IO-Schnittstellen [Che87]hinaus auf das gesamte Betriebssystem ausdehnen zu können, müssen nicht nur die Urbild- und Bildbereiche der beteiligten Funktionen zueinander passen, sondern diese müssen darüber hinaus eine weitere Art von Generizität ermöglichen, die ich universelle Generizität10 nennen möchte. Beispiele für universelle Konstrukte sind Turingmaschinen oder Registermaschinen, die prinzipiell andere Turing- oder Registermaschinen simulieren können. Universelle Generizität ist analog dazu die Fähigkeit, alternative Funktionalitäten, Repräsentationen, Zugriffsverhalten, Granularitäten etc. auf relativ einfache Weise11 simulieren zu können; der Begriff ist daher kein absoluter Begriff, sondern gilt immer nur relativ zum Universum der jeweils simulierbaren alternativen Konzepte.In order to be able to extend compositional genericity beyond the previous field of application of IO interfaces [Che87] to the entire operating system, not only the image and image areas of the functions involved must fit together, but they must also enable another type of genericity, the I want to call universal genericity 10 . Examples of universal constructs are Turing machines or register machines, which in principle can simulate other Turing or register machines. Universal Genericity is analogous to the ability to alternate functions, representations, access performance, granularity, etc. to simulate 11 with relative ease; the term is therefore not an absolute concept, but always applies only relative to the universe of each simulated alternative concepts.

Ein Beispiel für universelle Generizität in Betriebssystemen ist die bekannte File-IO-Schnittstelle von Unix [RT74], die aufgrund ihrer Fähigkeit zu IO mit beliebiger dynamischer Blocklänge und beliebigen Zugriffsmustern auch ältere File-Konzepte wie z.B. Lochkartenstapel mit fester Satzlänge simulieren kann, darüber hinaus aber auch unterschiedliche Zugriffsmuster verschiedener Leser und Schreiber ermöglicht, die mit den vorher üblichen satzorientierten IO-Schnittstellen nicht auf einfache Weise realisierbar waren. Dieses inzwischen zur Selbstverständlichkeit gewordene historische Beispiel einer Vereinfachung durch universelle Generizität zeigt auf, dass „weniger oft mehr" ist: der Verzicht auf das Konzepteines „Datensatzes" (record) in Unix macht nicht nur die Schnittstellen und die Implementierung einfacher, sondern verbessert darüber hinaus sogar noch die Funktionalität. Universelle Generizität ist daher in hohem Maße erstrebenswert und wird insbesondere beim Entwurf der Nest-Abstraktion (Kapitel 3) eine herausragende Rolle spielen.One example for universal genericity in operating systems is the well-known File IO interface of Unix [RT74], because of their ability to IO with any dynamic block length and any access patterns also older ones File concepts such as Simulate punch card stacks with fixed record length can, about it but also different access patterns of different readers and scribe allows with the usual ones Set-oriented IO interfaces can not be realized in a simple way were. This historical now taken for granted Example of a simplification by universal genericity shows on that "less often more "is: the Renouncement of the concept of a record in Unix not just the interfaces and the implementation easier, but improve it In addition, even the functionality. Universal Genericity is therefore to a great extent is desirable and especially in the design of the nest abstraction (Chapter 3) play a prominent role.

2.1.5 Fragen der Anwendung von Generizität2.1.5 Application questions of genericity

Die zentralen Fragen bei der Anwendung von kompositorischer und universeller Generizität lauten:

  • • Wie sollen die Bild- und Urbildbereiche aussehen?
  • • Welche Funktionalitäten sollen durch die Bausteine realisiert werden?
The central questions in the application of compositional and universal genericity are:
  • • What should the image and image areas look like?
  • • Which functionalities should be realized by the blocks?

Diesen Fragen liegt das gemeinsame Problem der Wahl der am besten geeigneten Abstraktionsebene für die zu lösenden Aufgaben (bei teilweise unbekannten Anforderungen) zu Grunde. Die Vorstellung und Propagierung eines bestimmten Mechanismus alleine nicht viel über deren konkrete Anwendung in einem bestimmten Gebiet aus. Entwurfs-Entscheidungen sind nicht immer eindeutig aufgrund gesicherter Methoden und Erkenntnisse lösbar, da bereits die Betrachtung der Problemstellung ein menschlicher Interpretationsprozess ist. In dieser Arbeit werde ich daher der Pragmatik einen vergleichsweise großen Raum einräumen und syntaktische und semantische Konstrukte nur zur Verdeutlichung und Notation der zugrundeliegenden Ideen verwenden.this Asking questions is the common problem of choosing the most appropriate one Abstraction level for the ones to be solved Tasks (for partially unknown requirements). The Presentation and propagation of a particular mechanism alone not much about their concrete application in a particular area. Design Decisions are not always clear due to proven methods and insights solvable since the consideration of the problem is already a human one Interpretation process is. In this work I will therefore the Pragmatics give a comparatively large space and syntactic and semantic constructs only for clarification and notation of the use underlying ideas.

Eine konkrete Wahl von Abstraktionsebenen könnte die berechtigte Kritik auf sich ziehen, daß präzise Aussagen über Vor- und Nachteile bestimmer Entwurfs-Entscheidungen nicht oder nicht ausreichend möglich sind. Im Forschungsgebiet der Betriebssysteme hat es bisher meines Wissens nach keine Evaluation verschiedener Entwurfs-Konzepte auf der Ebene ganzer Betriebssysteme gegeben, die diese Konzepte als solche auf einer wirklich vergleichbaren Grundlage (d.h. deren isolierte Auswirkung auf gut messbare Größen wie Performanz oder weniger gut messbare Größen wie die Änderungsfreundlichkeit) ohne Einfluss weiterer versteckter Parameter wie z.B. die Kenntnisse und Fähigkeiten der jeweiligen Implementierer untersucht hätten12; da solche Evaluationen nach aktuellem Stand kaum möglich erscheinen, ist es stattdessen üblich, das Für und Wider verschiedener Entwurfs-Alternativen durch informelle Argumentation darzustellen.A concrete choice of levels of abstraction could justify the legitimate criticism that precise statements about the advantages and disadvantages of specific design decisions are not or not sufficiently possible. As far as I know, there has not been an evaluation of various design concepts at the level of entire operating systems in the field of research of the operating systems, which bases these concepts on a truly comparable basis (ie their isolated effect on well measurable quantities such as performance or less well measurable quantities such as the change-friendliness) without the influence of further hidden parameters such as the knowledge and abilities of the respective implementers 12 ; Since such evaluations appear to be hardly possible according to the current state of affairs, it is instead customary to present the pros and cons of various design alternatives through informal argumentation.

Der Begriff der „Architektur" wird in dieser Arbeit in einem weiteren Sinn verwendet als vielerorts in der Literatur (vgl. z.B. [PC75, Jon80, MP81, B+95, Lie95b, EKO95, Ass96])13, da er weder feste Implementierungsparadigmen wie „communicating sequential processes" (siehe[Hoa78]) vorschreibt14, noch die Frage nach Kern-Größen und -Umfängen (vgl. [Lie95b]) in festliegender Weise beantwortet, noch die Frage nach den Grenzen zwischen Benutzer-Adressräumen und Kern- oder Server-Adressräumen festlegt, sondern diese Fragen je nach Systemkonfiguration anders lösen kann, ohne den Quelltext des Systems ändern zu müssen. Im Vergleich zur konventionellen Handhabung des Architektur-Begriffes könnte man die hier vorgestellte Architektur daher auch als Meta-Architektur bezeichen; ich habe davon jedoch Abstand genommen, da der Begriff „Architektur" laut Brockhaus schlicht „Baukunst" bedeutet, und daher die in der Literatur teilweise vorkommende engere Auflassung nicht impliziert. In der Bedeutung als „Meta-Architektur" werden einige konventionelle Architekturfragen, die bisher als „festverdrahtet" betrachtet worden sind und deren Diskussion in der Literatur große Beachtung gefunden hat, zu dynamischen Parametern, deren Variation einen direkten Vergleich dieser Paradigmen bei einer Evaluation erleichtert15.The term "architecture" is used in this work in a broader sense than in many places in the literature (see, eg, [PC75, Jon80, MP81, B + 95, Lie95b, EKO95, Ass96]) 13 , since it has no fixed implementation paradigms "Communicating sequential processes" (see [Hoa78]) prescribes 14 , nor the question of core sizes and circumference (see [Lie95b]) answered in a fixed manner, nor the question of the Defines boundaries between user address spaces and core or server address spaces, but can solve these questions differently depending on the system configuration, without having to change the source code of the system. Compared to the conventional handling of the architectural concept, the architecture presented here could therefore also be referred to as meta-architecture; However, I have refrained from doing so, since the term "architecture", according to Brockhaus, simply means "architecture", and therefore does not imply the narrower statement that sometimes occurs in the literature. In the sense of "meta-architecture", some conventional architectural issues that have been considered "hardwired" and whose discussion has received much attention in the literature, become dynamic parameters whose variation facilitates a direct comparison of these paradigms in an evaluation 15 ,

Zur Begriffsbildung: statt mit Architektur oder Meta-Architektur könnte man die vorliegende Entwurfs-Methodik auch als Framework16 oder als Komponenten-Architektur17 bezeichnen. Da diese Begriffe nach weit verbreiteter Auffassung zur Zeit sehr eng mit der Objektorientierung verknüpft sind, die ich in der vorliegenden Arbeit zwar ermögliche, aber nicht zur zwingenden Voraussetzung der Architektur erhebe, habe ich von einer derartigen Begriffsbildung vorerst Abstand genommen. Im Unterschied zu Szyperskis Komponenten-Begriff [Szy98] könnte man die hier vorgeschlagenen Bausteine auch als leichtgewichtige18 instantiierbare19 Komponenten charakterisieren.To form a concept: instead of using architecture or meta-architecture, the present design methodology could also be referred to as framework 16 or as component architecture 17 . As these terms, according to widespread opinion, are at present very closely linked with the object orientation, which I make possible in the present work, but do not raise to the compelling presupposition of architecture, I have for the time being refrained from such a concept formation. Unlike Szyperskis component term [Szy98] could characterize these proposed building blocks as a lightweight 18 instantiable 19 components.

Bei Konflikten zwischen verschiedenen Arten von Generizität bei zu treffenden Entwurfs-Entscheidungen propagiere ich zumindest für die Anwendung in Betriebssystemen die folgende Priorisierung miteinander konkurrierender Arten von Generizität:

  • 1. Universelle Generizität
  • 2. Kompositorische Generizität
  • 3. Erweiterungs-Generizität
In conflicts between different types of genericity in design decisions to be made, I propagate, at least for use in operating systems, the following prioritization of competing types of genericity:
  • 1. Universal Genericity
  • 2. Compositional Genericity
  • 3. Expansion Genericity

Eine genaue Evaluation der Vor- und Nachteile dieser Priorisierung für die Anwendung in Betriebssystemen steht noch aus, mindestens solange das hier vorstellte Konzept noch nicht in die Praxis umgesetzt worden ist.A accurate evaluation of the advantages and disadvantages of this prioritization for the application in operating systems is still pending, at least as long as that here presented concept has not yet been put into practice.

2.2 Trennung von Mechanismus/Strategie/Repräsentation2.2 Separation of mechanism / strategy / representation

Im Betriebssystem-Bau ist das Prinzip der Trennung von Mechanismus (mechanism) und Strategie (policy) schon sehr lange bekannt und benutzt worden; eine Darstellung dieses Prinzips und ihrer Vorteile findet man z.B. in [LCC+75, CJ75].In operating system construction, the principle of separation of mechanism and policy has been known and used for a long time; a description of this principle and its advantages can be found eg in [LCC + 75, CJ75].

Als unabhängig von Mechanismen und Strategien ist fernerhin die Repräsentation zu betrachten20. Beispielsweise lässt sich ein Monitor [Han73, Hoa74] als programmiersprachliche Repräsentation eines Mechanismus verstehen, der prinzipiell wie ein binäres Semaphor funktioniert; die programmiersprachliche Repräsentation eines Monitors lässt sich bekanntermassen auf einfache Weise mittels Semaphoren und konventionellen Sprachmitteln simulieren21. Hieraus ist zu erkennen, dass die Auswahl einer einzigen Repräsentation ausreichend ist und Redundanz vermeiden hilft22; diese Repräsentation sollte jedoch möglichst universell und einfach handhabbar/verstehbar sein. Die Entscheidung für die Auswahl einer bestimmten syntaktischen Repräsentation ist daher der Pragmatik zuzurechnen; im Rahmen dieser Arbeit wird nicht weiter darauf eingegangen; insbesondere werden Repräsentationsfragen nicht zur Auswahl von Mechanismen oder Strategien herangezogen.Furthermore, independent of mechanisms and strategies, representation has to be considered 20 . For example, a monitor [Han73, Hoa74] can be understood as a programming-language representation of a mechanism that works in principle like a binary semaphore; the programming language representation of a monitor can be simulated in a simple manner by means of semaphores and conventional language means 21 . From this it can be seen that the selection of a single representation is sufficient and helps to avoid redundancy 22 ; however, this representation should be as universal and easy to handle / understand as possible. The decision to choose a particular syntactic representation is therefore attributable to pragmatics; this work will not be discussed further; In particular, representation questions are not used to select mechanisms or strategies.

Die Abgrenzung zwischen Mechanismus und Strategie ist nicht immer eindeutig möglich, da sie vom Kontext und der gewählten Abstraktionsebene abhängt. Eine Strategie kann beispielsweise ihrerseits wieder in Unter-Strategien und Unter-Mechanismen zerfallen. Auch Mechanismen können in ihrer Feinstruktur wiederum Strategien enthalten.The Differentiation between mechanism and strategy is not always clear possible, as they are from the context and the chosen Abstraction level depends. For example, a strategy can turn back into sub-strategies and sub-mechanisms disintegrate. Mechanisms can also be found in their fine structure in turn contain strategies.

Auf relativ grober Abstraktionsebene korrespondieren Mechanismen und Strategien mit den hier propagierten Abstraktionen Nest und Baustein auf ziemlich direkte Weise: ein Nest stellt einen Satz von abstrakten Mechanismen zur Verfügung, ein Baustein implementiert eine Strategie oder eine Menge von Strategien.On relatively coarse levels of abstraction correspond mechanisms and Strategies with the hereby propagated abstractions nest and building block in a fairly direct way: a nest represents a set of abstract Mechanisms available A building block implements a strategy or a set of strategies.

Die Nest-Schnittstelle stellt insofern abstrakte Mechanismen bereit, als dass die konkrete Implementierung der Mechanismen durch späte Bindung (late binding) zu Stande kommen kann.The Nest interface provides abstract mechanisms than that the concrete implementation of the mechanisms by late binding (late binding) can occur.

Die Trennung zwischen Mechanismus und Strategie wird durch die hier vorgestellte Architektur nicht nur direkt unterstützt, sondern geradezu zum Prinzip erhoben. Da Bausteine wiederum andere Bausteine enthalten oder über ihre Eingänge benutzen können, lässt sich das Prinzip der schrittweisen Verfeinerung auf die Trennung in Mechanismen und Strategien anwenden: eine Baustein-Hierarchie fungiert gleichzeitig als hierarchisch-rekursive Zerlegung des zu lösenden Problems in Mechanismen und Strategien.The separation between mechanism and strategy is not only directly supported by the architecture presented here, but also virtually elevated to the principle. Since blocks in turn ent ent other components or using their inputs, the principle of gradual refinement can be applied to the separation of mechanisms and strategies: a building block hierarchy simultaneously functions as a hierarchical-recursive decomposition of the problem to be solved into mechanisms and strategies.

2.3 Das Verantwortungs-Prinzip2.3 The responsibility principle

Verantwortung und ihre Aufteilung ist ein Prinzip, das in komplexeren menschlichen Gesellschaften und Systemen wie Firmen oder Behörden seit Jahrtausenden mit Erfolg praktiziert wird; als Ergebnis eines Aufteilungsvorgangs von Verantwortung entstehen Zuständigkeiten. Im Kontext von Betriebssystemen wurde Verantwortung ebenfalls als Strukturierungs-Leitlinie eingesetzt (ohne dass dies den jeweiligen Autoren völlig bewusst gewesen sein muss23): die in den 1970er Jahren populären hierarchischen Strukturen [Dij68, Dij71] lassen sich beispielsweise durch Aufteilung von Verantwortung gewinnen, ebenso die Weiterführung dieser Idee in sogenannten „objektorientierten" Betriebssystemen (beispielsweise [K+81, Y+90, B+95, Ass96] u.v.m.), aber auch die auf bestimmten festen Mechanismen aufgebauten Betriebssysteme (z.B. auf Capabilities basierend [NW77, T+90]). Auch das im Software-Engineering oft zitierte Lokalitäts-Prinzip als Mittel zur Strukturierung von Systemen beruht letztlich auf der Aufteilung von Verantwortung. Es gibt unzählige weitere Beispiele.Responsibility and its division is a principle that has been successfully practiced in more complex human societies and systems such as corporations or government for millennia; Responsibilities arise as a result of a division process of responsibility. In the context of operating systems, responsibility was also used as a structuring guideline (without the authors having to be fully aware of this 23 ): the popular hierarchical structures of the 1970s [Dij68, Dij71] can be obtained, for example, by sharing responsibility the continuation of this idea in so-called "object-oriented" operating systems (for example [K + 81, Y + 90, B + 95, Ass96] and many more), but also the operating systems built on certain fixed mechanisms (eg based on capabilities [NW77, T + 90 The locality principle often cited in software engineering as a means of structuring systems is ultimately based on the division of responsibility .There are innumerable other examples.

2.3.1 Kontrollflüsse2.3.1 Control flows

Ein sequentieller Kontrollfluss (thread, konzeptuelle Beschreibung bereits in [DH66]) lässt sich als Aktivitätsträger charakterisieren, der von außen beobachtbar nur eine sequentielle Folge von (Maschinen-)Operationen ausführt. Kontrollflüsse sind bereits in [Dij68] zur Strukturierung von Verantwortung in Betriebssystemen benutzt worden; diese feste Verbindung von Kontrollflüssen mit der Verantwortung für bestimmte Bereiche wird in der vorliegenden Arbeit jedoch aufgegeben. Kontrollflüsse können zur Strukturierung von Verantwortung benutzt werden, jedoch gibt es in der hier vorgestellten Architektur keine notwendigerweise feste Verbindung mit Verantwortungsbereichen (wobei im Einzelfall auch feste Verbindungen hergestellt werden können, aber nicht müssen).One sequential control flow (thread, conceptual description already in [DH66]) characterize themselves as activity carriers, the outside observable only a sequential sequence of (machine) operations performs. control flows are already in [Dij68] for structuring responsibility in Operating systems have been used; this solid connection of control flows with the responsibility for however, certain areas are abandoned in this work. control flows can are used to structure responsibility, but there are it is not necessarily in the architecture presented here firm connection with areas of responsibility (whereby in the individual case also solid connections can be made, but do not have to).

Kontrollflüsse werden als vollkommen unabhängig von konventionellen Konzepten wie Prozesse oder Mechanismen wie Schutzbereiche angesehen. Im Gegensatz zu anderen Arbeiten werde ich den Begriff des Prozesses vermeiden, da es für ihn mehrere verschiedene Definitionen gibt24. Seit der Wiederentdeckung der Schutzbereiche (spheres of protection [DH66], protection domains [NW74, CJ75]) im Kontext so genannter Single-Address-Space-Systeme [C+94, Ros94] (vgl. Beschreibung und Schutzmechanismen von CTSS in [BPS81]) hat sich die Bedeutung der Begriffe weiter verkompliziert. Ich beschränke mich daher auf die Begriffe Kontrollfluss und Schutzbereich.Control flows are considered completely independent of conventional concepts such as processes or mechanisms such as protection areas. Unlike other works, I will avoid the concept of the process because there are several different definitions for it 24 . Since the rediscovery of protection domains (spheres of protection [DH66], protection domains [NW74, CJ75]) in the context of so-called single-address-space systems [C + 94, Ros94] (see description and protection mechanisms of CTSS in [BPS81 ]), the meaning of the terms has become even more complicated. I restrict myself therefore to the terms control flow and protection area.

Jeder Kontrollfluss hat zu jedem Zeitpunkt einen eindeutig bestimmten Kontext. Die Bedeutung dieses Kontexts hängt vom jeweils gewählten Ausführungs-Modell ab: bei der Simulation eines „Prozesses" wäre dies beispielsweise das Prozessabbild, in dem sich der Kontrollfluss befindet und seine Operationen ausführt; im Fall von Single-Space- oder Hybridsystemen wäre dies der jeweils aktuelle Schutzbereich. Kontexte können auf Anforderung gewechselt werden (vgl. [DH66]): ein Kontrollfluss wechselt damit in einen anderen „Prozess" bzw. in einen anderen Schutzbereich, der sich ggf. auch auf einem anderen Rechner befinden kann. Hiervon sind zwei verschiedene Varianten denkbar: eine ohne Abspeichern des alten Kontextes im Stile von Wechseln zwischen Coroutinen, die andere mit Abspeichern aller durchlaufenen Kontexte in Form eines Stapelspeichers mit der Möglichkeit zur Rückkehr in einen früheren Kontext ähnlich einem synchronen RPC oder LRPC. Eine Konsequenz aus der Wechselmöglichkeit ist, dass die Anzahl der in einem „Prozess" oder Schutzbereich tätigen Kontrollflüsse sich dynamisch ändern und auch zeitweise zu Null werden kann.Everyone Control flow has a clearly defined at any time Context. The meaning of this context depends on the chosen execution model from: in the simulation of a "process" this would be for example the process image in which the control flow is located and its Performs operations; in the case of single-space or hybrid systems, this would be the most current one Protection. Contexts can be on Requirement to be changed (see [DH66]): a control flow changes thus into another "process" or into another Protection area, which may also be on another computer can. Of these, two different variants are conceivable: one without Saving the old context in the style of switching between coroutines, the other with saving of all contexts in the form a stack with the possibility to return in an earlier Context similar a synchronous RPC or LRPC. A consequence of the change possibility is that the number of control flows in a "process" or protection area is change dynamically and can temporarily become zero.

Man sollte sich vor Augen halten, dass Schutzbereiche einen Mechanismus zur Durchführung und Überwachung von Sicherheits-Konzepten darstellen, wohingegen Verantwortungsbereiche ein davon prinzipiell unabhängiges logisches Konzept zur Strukturierung eines Systems darstellen. Die Abbildung von Verantwortungsbereichen auf Schutzbereiche ist eine Frage von Strategien und kann auf unterschiedliche Weise, ggf. auch dynamisch zur Laufzeit, gelöst werden.you It should be remembered that protection areas have a mechanism to carry out and monitoring of security concepts, whereas areas of responsibility one of them in principle independent represent a logical concept for structuring a system. The Representation of areas of responsibility to protection areas is one Question of strategies and can be done in different ways, if necessary dynamically at runtime, solved become.

Kontrollflüsse werden, in konventionellen Architekturen als eigenständige Abstraktion betrachtet. Da ihre Implementierung in einem eigenen Baustein erfolgen kann, ist die Behandlung als separate Abstraktion nicht unbedingt notwendig. Wegen ihrer dynamischen Durchdringung der gesamten Infrastruktur kann man sie jedoch als Hilfsabstraktion bezeichnen.Control flows, considered in conventional architectures as an independent abstraction. Since their implementation can be done in a separate building block, the treatment as a separate abstraction is not absolutely necessary. Because of its dynamic penetration of the entire infrastructure but you can call them an auxiliary abstraction.

Im Folgenden betrachten wir unser Betriebssystem zur Vereinfachung standardmäßig (sofern nicht ausdrücklich abgewichen wird) weder mit Hilfe von Prozess- oder Schutzbereichen, noch von Kontrollflüssen oder anderen Aktivitätsträgern, sondern ausschließlich auf Basis der jeweils zu implementierenden und zu verantwortenden Funktionalität.In the following we will look at our operating system for simplicity by default (if not explicitly deviated) neither with the help of process or protection areas, nor of control flows or other activity carriers, but exclusively on the basis of the respectively to be implemented and responsible functionality.

2.3.2 Schnittstellen-Mechanismen2.3.2 Interface mechanisms

Die Gesamtverantwortung eines Betriebssystems kann auf sehr viele verschiedene Arten aufgeteilt werden; die von mir bevorzugten Aufteilungs-Strategien werden in Abschnitt 2.4 näher dargestellt. Jegliche Art von Aufteilung von Verantwortung führt dazu, dass Modularisierungs-Grenzen in ein System eingeführt werden, die bei formalisierter Darstellung auch als Schnittstellen-Instanzen bezeichnet werden.The Overall responsibility of an operating system can be based on a great many different ones Species are divided; my preferred distribution strategies become closer in section 2.4 shown. Any kind of responsibility sharing leads to that modularization limits are introduced into a system, in the case of formalized representation also as interface instances be designated.

Durch die Einführung von Schnittstellen-Instanzen zur Begrenzung von Modul-Instanzen entsteht eine Unterscheidung der durchzuführenden Operationen in Aufrufer- und Bearbeiter-Instanzen, die jeweils immer nur relativ zu einer festen Schnittstelle so bezeichnet werden; dieselbe Instanz kann bezüglich verschiedener Schnittstellen gleichzeitig als Aufrufer oder Bearbeiter fungieren. Bei verschiedenen unterscheidbaren Operationen können diese Rollen unterschiedlich verteilt sein, beispielsweise kann eine Modul-Instanz A gegenüber der Instanz B bei der Durchführung der Operation op1 als Aufrufer, bei op2 als Bearbeiter fungieren.The introduction of interface instances for the limitation of module instances creates a distinction between the operations to be performed in caller and processor instances, which are always designated in this way only relative to a fixed interface; The same instance can simultaneously act as a caller or editor for different interfaces. In various distinguishable operations, these roles may be distributed differently, for example, a module instance A may act as a caller to instance B when performing operation op 1, and as an agent in op 2 .

Als Mechanismen zur Weitergabe der Verantwortung einer Aufrufer- an eine Bearbeiter-Instanz kommen mehrere bekannte und bewährte Methoden in Betracht. Beispielsweise kommen hierfür in Frage, in der Reihenfolge fallenden Overheads bzw. fallender Kosten:

  • • RPC (remote procedure call) [BN84, TA90]
  • • LRPC (local/lightweight RPC) [B+90]
  • • Indirekte Prozeduraufrufe
  • • Direkte Prozeduraufrufe
  • • Makro- oder Inline-Prozeduraufrufe
Mechanisms for passing on the responsibility of a caller to an agent instance are several well-known and proven methods. For example, this may be considered in the order of decreasing overheads or falling costs:
  • • RPC (remote procedure call) [BN84, TA90]
  • • LRPC (local / lightweight RPC) [B + 90]
  • • Indirect procedure calls
  • • Direct procedure calls
  • • Macro or inline procedure calls

Diese Beispiel-Mechanismen eignen sich teilweise nur für die synchrone Weitergabe von Verantwortung, bei der die Aufrufer-Instanz bis zur Beendigung der Bearbeitung warten muss. Bei asynchroner Weitergabe der Verantwortung entsteht implizit ein weiterer logischer Kontrollfluss25. Die asynchrone Weitergabe von Verantwortung per Prozeduraufruf ist daher nicht ohne Einbezug des jeweils verwendeten Kontrollfluss-Konzeptes (siehe Abschnitt 2.3.1) möglich.Some of these example mechanisms are only appropriate for synchronous responsibility sharing, where the caller instance must wait until the end of processing. Asynchronous transfer of responsibility implicitly creates another logical control flow 25 . The asynchronous transfer of responsibility by means of a procedure call is therefore not possible without the use of the control flow concept used (see Section 2.3.1).

Man sollte sich vor Augen halten, dass die Frage nach einer parallel oder sequentiell übertragenen Verantwortung pririzipiell von der Aufteilungsstrategie in Module unabhängig ist und daher als eine Frage der konkreten Implementierungsstrategie der Module gesehen werden kann, auch wenn die zugehörigen Mechanismen nicht vollkommen (wenn auch weitgehend) voneinander unabhängig sind.you It should be remembered that the question of a parallel or sequentially delegated responsibility is pririzipiell independent of the division strategy into modules and therefore as a matter of concrete implementation strategy the modules can be seen, even if the associated mechanisms not completely (though largely) independent of each other.

Universelle Generizität relativ zu den oben genannten synchronen Mechanismen läßt sich direkt durch einheitliche Verwendung von synchronem RPC auf allen Ebenen des Systems erzielen, da dieser die Semantik der anderen Mechanismen als Spezialfall mit umfasst. Dies würde jedoch die Performanz eines lokalen Rechners in unakzeptabler Weise verschlechtern. Zur Erzielung universeller Generizität schlage ich daher eine Erweiterung der bereits in [Str78] dargestellten Methode vor:
Man wähle eine einheitliche und bequeme syntaktische Repräsentation, beispielsweise die Prozeduraufruf-Syntax der verwendeten Programmiersprache. Die Bindung von Instanzen dieser Konstrukte an einen der obigen Mechanismen erfolgt dann entweder zur Übersetzungszeit des jeweiligen Moduls, oder falls möglich auch zur Laufzeit bei der Instantiierung eines Moduls (die Unterscheidung zwischen indirekten/direkten/Inline-Aufrufen ist mit heute gängiger Standard-Technik26 nicht ohne weiteres zur Laufzeit möglich).
Generic genericity relative to the above-mentioned synchronous mechanisms can be achieved directly by uniformly using synchronous RPC at all levels of the system, as this includes the semantics of the other mechanisms as a special case. However, this would unacceptably degrade the performance of a local computer. To achieve universal genericity, therefore, I propose an extension of the method already presented in [Str78]:
Choose a consistent and convenient syntactic representation, such as the procedure call syntax of the programming language used. The binding of instances of these constructs to one of the above mechanisms then takes place either at the translation time of the respective module, or if possible at runtime during the instantiation of a module (the distinction between indirect / direct / inline calls is common today with standard technology 26 not readily available at runtime).

2.3.3 Abgrenzung von Verantwortung durch Kapselung2.3.3 Differentiation of responsibility by encapsulation

Im Software-Engineering ist lange bekannt, dass die Prüfbarkeit, Wartbarkeit und viele andere Eigenschaften von Modulen verbessert werden, wenn die Schnittstellen möglichst „dünn" sind und möglichst wenig Information über die innere Struktur der Implementierung preisgeben (Pririzip der Verbergung von Information, vgl. [Par72]).in the Software engineering has long been known that testability, Maintainability and many other properties of modules improved if the interfaces are as "thin" as possible and as little information as possible reveal internal structure of the implementation (Pririzip of concealment of information, cf. [Par72]).

Dies bedeutet zum einen, dass Schnittstellen stets offengelegt werden müssen, wobei die Schnittstelle zwischen Bausteinen eine von der Architektur vorgebene Form haben muss, an die sich die Implementierer von Bausteinen halten müssen. Alles andere ist als lokale Variablen eines Bausteins zu betrachten. Die interne Realisierung von Bausteinen darf jedoch bzw soll möglichst andere Baustein-Instanzen als lokale Variablen benutzen (wobei wiederum keine „schwarzen Schnittstellen" eingeführt werden dürfen), so dass sich insgesamt eine baumartige Lokalitäts-Hierarchie ergibt, die von der hierarchischen Struktur der äußerlichen Baustein-Verdrahtungen unabhängig ist. Die Verantwortung für den Einsatz und den Betrieb von lokalen Baustein-Instanzen liegt beim Implementierer eines Bausteins. Die Tatsache der Benutzung von lokalen Baustein-Instanzen ist dabei von außen nicht sichtbar.This means, on the one hand, that interfaces must always be disclosed, and that the interface between components must have an architecture-dictated form, which building block implementers must adhere to. Everything else should be considered as local variables of a building block. However, the internal implementation of blocks may or should be as far as possible different block instances than local variables (again, no "black interfaces" may be introduced), resulting in an overall tree-like locality hierarchy that is independent of the hierarchical structure of the external building block wirings.The responsibility for the use and operation of local building blocks Instances lies with the implementor of a block The fact of using local block instances is not visible from the outside.

2.4 Zerlegungs- und Rekombinationsstrategien2.4 decomposition and recombination strategies

2.4.1 Zerlegung der zu lösenden Aufgaben in möglichst wenige universelle Elementarteile2.4.1 Disassembly of the be solved Tasks in as possible few universal elementary parts

Bei der Problemanalyse propagiere ich die Anwendung einer einfachen Methode: es ist zu fragen, wie generische Funktionalität (vorzugsweise in Form von universeller Generizität) in möglichst wenige, aber universelle Elementarfunktionalität zerspalten werden kann. Aus dieser Elementarfunktionalität ergeben sich dann die Elementaroperationen als Umsetzung in ein von-Neumann-Maschinenmodell, die im Pseudo-Code einer imperativen Programmiersprache notiert werden.at In the problem analysis I propagate the application of a simple one Method: it is to ask how generic functionality (preferably in the form of universal genericity) in as few but universal Elemental functionality can be split. Result from this elementary functionality then the elementary operations as conversion into a von Neumann machine model, which is noted in the pseudo-code of an imperative programming language become.

2.4.2 Orthogonalität und Rekombinierbarkeit von Elementaroperationen2.4.2 Orthogonality and recombination of elementary operations

Im Idealfall sollten die Elementaroperationen die Eigenschaft der Orthogonalität besitzen, d.h. keine der Elementaroperationen sollte sich durch Kombination anderer Elementaroperationen simulieren lassen. Eine Zerspaltung in orthogonale Elementaroperationen kann dazu führen, dass sehr kleine, nach üblichen Maßstäben „triviale" Elementaroperationen entstehen, die in der Praxis selten oder nie als alleinstehende Operationen genutzt werden, sondern häufig nur in Kombination mit anderen Elementaroperationen. Entwerfer haben oft die konkrete programmiersprachliche Repräsentation einer Elementaroperation als Prozeduraufruf oder RPC im Hinterkopf und schrecken daher oft vor dem Overhead einer solchen „trivialen" Zerlegung zurück. Das Problem des Overheads läßt sich jedoch weitgehend vermeiden, wenn man die systematische Rekombination von Elementaroperationen als eigenes Grundkonzept einführt.in the Ideally, the elementary operations should have the property of orthogonality, i.e. none of the elementary operations should be combined to simulate other elementary operations. A splitting in orthogonal elementary operations can lead to very small, by conventional standards "trivial" elementary operations arise in practice rarely or never as a single person Operations are used, but often only in combination with other elementary operations. Designers often have the concrete programming language representation an EO as a procedure call or RPC in mind and therefore often shy away from the overhead of such a "trivial" decomposition Problem of overhead can be however, largely avoid the systematic recombination of elementary operations as a separate basic concept.

Wenn die Rekombination orthogonaler Elementaroperationen bei der Bearbeiter-Instanz der Prozedur- oder RPC-Aufrufe erfolgt, ergibt sich nur ein geringer bis verschwindender Overhead im Vergleich zur direkten Implementierung jeglicher Kombination. Der Vorteil der Zerlegung besteht jedoch darin, daß im Regelfall nur der Programmcode für die wenigen Elementaroperationen implementiert werden muss, nicht dagegen für alle vorkommenden Kombinationen, die oft wesentlich zahlreicher ausfallen.If the recombination of orthogonal elementary operations at the agent instance When the procedure or RPC calls are made, the result is a small one until vanishing overhead compared to direct implementation any combination. The advantage of the decomposition, however, exists in that in the Normally only the program code for the few elementary operations must not be implemented against it for all occurring combinations, often much more numerous fail.

2.5 Das Problem der „Eierlegenden Wollmilchsau"2.5 The problem of "egg legends jack of all trades "

Größere Softwaresysteme, die über längere Zeit benutzt und erweitert wurden oder die für sehr große Anwendungsfelder und -bandbreiten ausgelegt wurden, zeigen oft ein Phänomen auf, das salopp mit „Featuritis" bezeichnet wird. Solche Alleskönner haben manchmal Schwierigkeiten, ganz einfache grundlegende Aufgaben auf einfache und effiziente Weise zu erledigen. Die Softwarestruktur ist im Vergleich zu einfachen Programmen, die nur die Grundaufgaben abdecken, oder im Vergleich zu Spezialisten meist deutlich aufgebläht (Overhead) und schwerer zu durchschauen.Larger software systems, the above longer Time were used and expanded or for very large application fields and bandwidths often show a phenomenon that is casually referred to as "featuritis". Such all-rounders sometimes have trouble, very simple basic tasks to do in a simple and efficient way. The software structure is compared to simple programs that are just the basic tasks cover, or in comparison to specialists mostly bloated (overhead) and harder to see through.

Um dieses Problem handhabbar zu machen, schlage ich die Verwendung unterschiedlicher Modelle vor, zwischen denen möglichst eine hierarchische Inklusions-Beziehung in dem Sinne herrschen sollte, daß man ein Modell als Spezialfall eines anderen Modells betrachten kann; oft ist das weniger mächtige Modell auch einfacher. Als Beispiel hierfür werden in Abschnitt 3.2 verschiedene Zugriffs-Modelle auf Nester wie singleuser oder multiuser behandelt werden.Around To make this problem manageable, I suggest the use different models in front, between which as possible a hierarchical one Inclusion relationship in the sense that one should prevail Consider model as a special case of another model; often is the less powerful Model also easier. An example of this is given in section 3.2 Access models are treated on nests like singleuser or multiuser become.

Eine Nest- oder Baustein-Implementierung braucht nicht unbedingt alle möglichen Modelle zu unterstützen. So kann man beispielsweise mit der Implementierung der einfacheren Modelle beginnen und diese erst später und bei Bedarf auf die komplizierten Modelle erweitern oder für die kompizierteren Modelle alternative Implementierungen vornehmen (deren höheren Kosten müssen dann von den Verwendern der einfacheren Modell-Variante nicht bezahlt werden). Welche Modelle von einer Nest- oder Baustein-Implementierung im Einzelfall unterstützt werden, wird als Kompetenz (competence) dieser Implementierungs-Instanz bezeichnet. Demgegenüber steht das Verhalten (habit) einer konkreten Aufrufer-Instanz; damit werden die Anforderungen an die Kompetenzen der Implementierungs-Instanz bezeichnet.A Nest or building block implementation does not necessarily need all of them potential Support models. So you can, for example, with the implementation of the simpler Models begin later and later on when needed expand complicated models or for the more complex models implement alternative implementations (their higher costs then have to not paid by users of the simpler model variant become). Which models of a nest or building block implementation supported in individual cases becomes, becomes as authority (competence) of this implementing instance designated. In contrast, is the behavior (habit) of a concrete caller instance; in order to become the requirements of the competencies of the implementation instance designated.

Die Kompetenzen einer Implementierungs-Instanz müssen zum Verhalten einer Aufrufer-Instanz kompatibel sein. Die Kompetenzen und das Verhalten von Nest- und Baustein-Instanzen werden je Baustein-Art in Form von Attributen angegeben. Die Kompatibilität kann dann bei der Verdrahtung konkreter Baustein-Instanzen automatisch getestet werden, wobei inkompatible Verdrahtungen zurückgewiesen werden. The Competencies of an implementation instance must be compatible with the behavior of a caller instance be. The competencies and behavior of nesting and building block instances are specified per block type in the form of attributes. The compatibility can then automatically tested during the wiring of concrete block instances with incompatible wiring rejected.

Attribute können entweder statisch oder dynamisch sein: statische Attribute eines Baustein-Typs ändern sich nie (sie hängen nur vom Baustein-Typ oder der gewählten Implementierung ab), dynamische Attribute hängen von der konkreten Instantiierung und/oder von der Verdrahtung mit anderen Bausteinen ab, ändern sich jedoch nicht während der Lebensdauer einer Baustein-Instanz. Werte, die sich während der Lebensdauer einer Baustein-Instanz ändern können, stellen keine Attribute dar, sondern gehören zum Zustand der Baustein-Instanz.attributes can either static or dynamic: static attributes of a Modify block type never (they hang only of the block type or the chosen implementation), hanging dynamic attributes from the concrete instantiation and / or wiring with other building blocks change but not during the lifetime of a block instance. Values that arise during the Can change the lifetime of a block instance, do not represent any attributes but belong to the state of the block instance.

Attribute werden insbesondere zur Unterscheidung verschiedener Modelle eingesetzt und in Schreibmaschinenschrift gesetzt.attributes are used in particular for distinguishing different models and typewritten.

2.6 Automatismen2.6 automatisms

Die Grundidee der Automatisierung wird seit Jahrhunderten erfolgreich zur Reduktion von Aufwand und Kosten eingesetzt.The The basic idea of automation has been successful for centuries used to reduce effort and costs.

Im Kontext der hier vorgestellten Architektur bedeutet Automatisierung, dass vorzugsweise von deskriptiven Methoden Gebrauch gemacht wird, um einen Mechanismus selbsttätig auszulösen, der immer wiederkehrende Vorgänge selbsttätig bearbeitet.in the Context of the architecture presented here means automation, preferably using descriptive methods, to a mechanism automatically trigger, the recurring events automatic processed.

Die Implementierung vieler Automatismen ist eine Frage von konkreten Strategien, die in speziellen Bausteinen (strategy_*) lokalisiert werden sollten (vgl. Abschnitt 4.2.2).The Implementing many automatisms is a matter of concrete Strategies localized in special building blocks (strategy_ *) should be (see section 4.2.2).

Zur Erstellung von Bausteinen sind weitere Automatismen von großem Nutzen, die über den Funktionsumfang üblicher Werkzeuge wie Compiler oder Debugger hinaus gehen sollten. Viele mit den hier vorgestellen (Schnittstellen-)Mechanismen zusammenhängende Konstruktionsvorgänge lassen sich automatisieren.to Creation of building blocks are further automatisms of great benefit, the above the range of functions usual Tools like compilers or debuggers should go out. Lots with the here vorbestellen (interface) mechanisms related construction processes to automate themselves.

Die in Abschnitt 2.3.2 vorgestelle späte Bindung an konkrete Aufrufmechanismen kann beispielsweise auf folgende Weise automatisiert werden:
Der Programmierer gibt ein statisches Baustein-Attribut an, mit dem er sein Denk-Modell deklariert, mit dessen Hilfe er den Programmcode entwickelt hat. Das Attribut kann folgende Werte annehmen:
code_nolock. Der Programmierer tut so, als gäbe es nur einen einzigen Kontrollfluss, der den Baustein betreten dürfte27; er kümmert sich also überhaupt nicht um Parallelität. Dies hat zur Folge, dass aus Sicherheitsgründen niemals ein weiterer Kontrollfluss den Baustein betreten darf, selbst wenn der bereits eingetretene Kontrollfluss eine lange dauernde blockierende Operation aufruft.
code_monitor Wie vorher, nur ist der Programmierer sich immerhin der Tatsache bewusst, dass mehrere Kontrollflüsse vorkommen können. Jeder Aufruf der Blockierungs-Operation wait (siehe Abschnitt 3.3.2) führt automatisch zu einer Entblockierung des Zugriffsschutzes gegenüber anderen Kontrollflüssen. Der Programmierer ist für die Beachtung der damit verbundenen Effekte verantwortlich; insbesondere ist ihm bewusst, dass kritische Abschnitte genau an der Stelle einer wait-Operation aufgehoben werden (analog zum Monitor-Konzept).
code_reentrant Der Programmierer ist sich dessen bewusst, dass mehrere Kontrollflüsse den Baustein asynchron betreten können. Er ist selbst für die Sicherung kritischer Abschnitte und für das Setzen von Locks verantwortlich.
For example, the late binding to concrete call mechanisms presented in section 2.3.2 can be automated in the following way:
The programmer specifies a static building block attribute, with which he declares his thinking model with which he has developed the program code. The attribute can take the following values:
code_nolock. The programmer pretends that there is only one control flow that is likely to enter the building block 27 ; he does not care about parallelism at all. As a result, for security reasons, another control flow must never enter the building block, even if the control flow that has already occurred calls for a long-lasting blocking operation.
code_monitor As before, but the programmer is at least aware of the fact that several control flows can occur. Each call to the wait wait operation (see Section 3.3.2) automatically unblocks the access protection against other control flows. The programmer is responsible for observing the effects involved; in particular, he is aware that critical sections are canceled at exactly the point of a wait operation (analogous to the monitor concept).
code_reentrant The programmer is aware that multiple control flows may enter the device asynchronously. He is responsible for securing critical sections and setting locks.

Ein zu syntaktischer Analyse fähiger und die Schnittstellen-Konventionen kennender Quelltext-Präprozessor extrahiert diesen Attribut-Wert aus dem Quelltext und generiert bei Bedarf (je nach eingestelltem Aufruf-Mechanismus) automatisch Lock-Operationen zur Klammerung kritischer Abschnitte, Fallunterscheidungs-Kontrollstrukturen zum Demultiplexen eingehender (L)RPC-Aufrufe, und so weiter. Auf diese Weise läßt sich jedes Programmiermodell mit jedem Schnittstellen-Mechanismus kombinieren28; bei Verwendung von statischen oder Inline-Prozeduraufrufen werden durch den Präprozessor mehrere Quelltexte verschiedener Bausteine zu einem einzigen Kombi-Baustein fest zusammengeschweisst29. Bei geeigneter sorgfältiger Konstruktion und Verwendung gut optimierender Compiler läßt sich durch Inline-Prozeduraufrufe jeglicher Schnittstellen-Aufwand fast vollständig eliminieren; dies ist insbesondere zum Anschluss von Prüf- und Sicherheits-Bausteinen oder kleineren Trivial-Bausteinen nützlich.A source-code preprocessor capable of syntactic analysis and knowing the interface conventions extracts this attribute value from the source code and, if necessary (depending on the set call mechanism), automatically generates lock operations for clustering critical sections, case distinction control structures for demultiplexing incoming ( L) RPC calls, and so on. In this way, any programming model can be combined with any interface mechanism 28 ; when static or inline procedure calls are used, the preprocessor hardwires several source texts of different components into a single combo module 29 . With proper careful design and use of well-optimizing compilers, inline procedure calls can almost completely eliminate any interface overhead; This is particularly useful for connecting test and safety devices or smaller trivial devices.

2.7 Zugriffsrechte und Schutzmechanismen2.7 access rights and protections

2.7.1 Grundlegende Betrachtung2.7.1 Basic View

Die Rechteverwaltung in Betriebssystemen basiert bei den meisten praktisch eingesetzten Modellen [Lan81] auf Rechte-Relationen, die Subjekte und Objekte miteinander in Beziehung setzen; typischerweise lassen sich derartige Relationen zwischen Subjekten und Objekten tabellarisch darstellen.The Rights management in operating systems is most practical used models [Lan81] on rights relations, the subjects and relate objects to each other; typically leave such relations between subjects and objects are tabulated represent.

Ich möchte für die Rechteverwaltung einen Ansatz vorstellen, der sich bei geeigneter Interpretation ebenfalls als Subjekt-Objekt-Schema auffassen läßt, dabei jedoch beliebige Dinge als Subjekte bzw Objekte auffassen kann.I would like to for the Rights management, an approach that is appropriate Interpretation also as a subject-object-schema can be understood, thereby However, any things can be understood as subjects or objects.

Zunächst ist zu fragen, was überhaupt zu schützen ist. Hierauf sind mehrere Antworten möglich. Eine möglichst allgemeine Antwort ist, dass es sich um Informationen handelt, die zu schützen sind. Dies umfasst die klassischen Objekte (die auf jeden Fall Informationsträger darstellen), bedeutet aber nach meiner Ansicht etwas mehr. In einem Betriebssystem gibt es Informationen, die nicht unbedingt in Form zugreifbarer Datenobjekte vorliegen müssen. Typische Beispiele hierfür sind die Menge aller möglichen Schlüsselwerte eines geheimen kryptographischen Schlüssels, oder die Rechte anderer Subjekte (die nicht unbedingt explizit repräsentiert zu sein brauchen), oder die Kompetenzen oder das Verhalten anderer Subjekte, oder andere Subjekte schlechthin; Subjekte können in anderem Kontext wiederum Objekte darstellen. Informationen über Objekte lassen sich ggf. auch durch Schlussfolgern oder Ableiten erhalten. Ich schlage deshalb vor, statt der Begriffe Subjekt und Objekt andere Begriffe zu verwenden, die durch die folgenden Überlegungen begründet sind:
Der Zweck eines Betriebssystems ist die Ausführung von Operationen; dies geschieht in der hier vorgestellten Architektur (vgl. Abschnitt 3.2 und Kapitel 6) durch Bearbeiter-Instanzen im Auftrag von Aufrufer-Instanzen. Da eine Aufrufer-Instanz wiederum im Auftrag mehrerer anderer Aufrufer-Instanzen handeln kann, ergeben sich zwei Fragestellungen:

  • 1. Wer soll natürlicherweise das Subjekt darstellen, das einen bestimmten Auftrag veranlasst?
  • 2. Wer soll natürlicherweise das Objekt darstellen, das den Auftrag ausführen soll?
First of all, ask what is to be protected at all. Hereupon several answers are possible. The most general answer is that this is information that needs to be protected. This includes the classic objects (which in any case represent information carriers), but in my opinion means something more. In an operating system there is information that does not necessarily have to be in the form of accessible data objects. Typical examples of this are the set of all possible key values of a secret cryptographic key, or the rights of other subjects (which need not necessarily be explicitly represented), or the competencies or behavior of other subjects, or other subjects par excellence; Subjects can in turn represent objects in another context. Information about objects may also be obtained by reasoning or deriving. I propose, therefore, that instead of the concepts of subject and object we use other concepts based on the following considerations:
The purpose of an operating system is the execution of operations; this is done in the architecture presented here (see Section 3.2 and Chapter 6) by processor instances on behalf of caller instances. Since a caller instance can act on behalf of several other caller instances, two questions arise:
  • 1. Who should naturally represent the subject who initiates a particular assignment?
  • 2. Who should naturally represent the object that should execute the order?

Die erste Frage ist auf verschiedene Weisen beantwortbar. Daher schlage ich die Einführung eines anderen Begriffes statt „Subjekt" vor, nämlich das Mandat (mandate). Operationen geschehen grundsätzlich aufgrund eines Mandates; im allgemeinen kann dabei eine Instanz (bzw ein Subjekt in bisheriger Terminologie) mehrere verschiedene Mandate wahrnehmen; auch kann es vorkommen, dass verschiedene Instanzen aufgrund des gleichen Mandats handeln. Beispiele hierfür finden sich in der realen Welt im Rechtswesen: ein und derselbe Rechtsanwalt kann gleichzeitig verschiedene Mandate für verschiedene Mandanten wahrnehmen. Ein Mandant kann verschiedene Mandate gleichzeitig an verschiedene Rechtsanwälte oder an den gleichen Rechtsanwalt vergeben. Er kann dasselbe Mandat aber auch an mehrere Rechtsanwälte gleichzeitig vergeben, beispielsweise bei Anwalts-Gemeinschaften oder Kanzleien. Mandate können vertreten oder weitergereicht werden. Im Rechtswesen können auch Untermandate vergeben und aufgeteilt werden; von der letzteren Möglichkeit habe ich hier wegen der damit verbundenen Komplexität und Folgeeffekte vorläufig Abstand genommen30. Die Menge aller möglichen Mandate sollte durch einen abstrakten Datentyp mit ausreichend grossem Wertevorrat31 dargestellt werden. Mandate haben keine festliegende Interpretation, sondern werden lediglich zwischen Baustein-Instanzen weitergereicht. Alle Operationen auf Mandaten wie z.B. ihre Erzeugung gehören somit zu den Strategien, die der Implementierer eines Bausteins selbstständig bestimmen kann. Mandate stellen somit eine weitere Hilfsabstraktion dar.The first question can be answered in different ways. Therefore, I propose the introduction of another term instead of "subject", namely the mandate, operations are basically on the basis of a mandate, in general an instance (or a subject in previous terminology) can perceive several different mandates, and it can For example, in the real world of law, one and the same lawyer can have different mandates for different clients, and one client can simultaneously assign different mandates to different lawyers or to the same lawyer He may also give the same mandate to several lawyers at the same time, such as lawyers' associations or law firms, mandates may be represented or passed on, and subcontracts may be subcontracted and divided in the legal field For the time being, because of the complexity and consequential effects, 30 The set of all possible mandates should be represented by an abstract data type with a sufficiently large stock of values 31 . Mandates have no fixed interpretation, but are only passed between block instances. All operations on mandates such as their generation are thus among the strategies that the implementer of a building block can independently determine. Mandates thus represent another auxiliary abstraction.

Die zweite Frage ist im Kontext der hier vorgestellten Architektur relativ schnell zu beantworten: ein Objekt ist auf jeden Fall die Ausgangs-Nest-Instanz, an die der zu bearbeitende Auftrag gerichtet wird. Diese Nest-Instanz zerfällt jedoch nicht nur in Unterobjekte wie z.B. einzeln adressierbare Bytes, sondern stellt auch wegen der eingangs aufgeführten Problematik nicht alle Informationen dar, die nach Möglichkeit geschützt werden sollten. Die folgende Begriffsbildung kommt diesem Ziel etwas näher:
Zu schützen ist die Ausführung von Operationen. Die Menge aller ausführbaren Operationen wird Operationenmenge genannt; dies sind alle möglichen Kombinationen von Operations-Bezeichnern mit ihren Eingabe-Parameter-Werten, oder in anderen Worten die Vereinigung aller kartesischen Produkte aller Operationsnamen mit ihren Parameter-Wertemengen (egal wie viele es sein mögen). Auch wenn man die Menge aller möglichen Parameter-Versorgungen als endlich betrachtet (indem man beispielsweise die Menge aller vorkommenden Zeichenketten-Parameter beschränkt), ist die Operationenmenge i.a. sehr groß. Eine dazu äquivalente Darstellung ist die Beschreibung als Menge aller möglichen Bitstrings, die in einem generischen Operations-Nest (vgl. Kapitel 6) auftreten können.
The second question can be answered relatively quickly in the context of the architecture presented here: an object is in any case the initial nest instance to which the request to be processed is directed. However, this Nest instance not only decomposes into sub-objects such as individually addressable bytes, but also does not represent all the information that should be protected if possible because of the problems outlined above. The following concept formation comes a little closer to this goal:
Protecting is the execution of operations. The set of all executable operations is called the set of operations; these are all possible combinations of operation identifiers with their input parameter values, or in other words, the union of all Cartesian products of all operation names with their parameter value sets (no matter how many). Also, considering the set of all possible parameter supplies as finite (for example, by limiting the set of all string parameters involved), the amount of operations is generally very large. An equivalent representation is the description as a set of all possible bit strings that can occur in a generic operation nest (see Chapter 6).

Eine Schutzmenge ist eine Teilmenge der Operationenmenge eines gegebenen Systems. Schutzmengen sind als Mengen aller (im Sinne irgendeines ausserhalb definierten Zulässigkeits-Begriffes) zulässigen Operationen zu interpretieren.A Protection amount is a subset of the operation amount of a given one System. Protective amounts are considered quantities of all (in the sense of any outside defined concept of admissibility) permissible operations to interpret.

2.7.2 Spezifikation von Schutzrechten2.7.2 Specification of property rights

Der Begriff der Schutzmenge vereinfacht die Abstraktion irgendwelcher Schutz- und Zulässigkeitsbegriffe auf mathematisch sehr einfach fassbare und hochgradig flexible Weise32. Da Schutzmengen i.a. zu groß für eine tabellarische Darstellung sind, braucht man irgendwelche Spezifikationsmechanismen, die sie beschreiben. Der Zweck eines Spezifikationsmechanismus besteht einerseits darin, eine Schutzmenge für menschliche Leser verstehbar und nachvollziehbar komprimiert darzustellen, und andererseits das Enthaltens-Problem der Schutzmenge speichereffizient auf Rechnern auswertbar zu machen.The term protection amount simplifies the abstraction of any concepts of protection and admissibility in a mathematically very simple and highly flexible way 32 . Since protection amounts are generally too large for a tabular representation, one needs any specification mechanisms that describe them. On the one hand, the purpose of a specification mechanism is to make an amount of protection comprehensible and comprehensibly compressed for human readers, and on the other hand to make the containment problem of the protection quantity evaluable on computers in a memory-efficient manner.

Als Spezifikationsmechanismen kommen sehr viele konkrete Realisierungen (z.B. passend eingeschränkte Prädikatenlogiken oder andere Kalküle) in Betracht, deren Diskussion den Rahmen dieser Arbeit sprengen würde. Es sind ohne weiteres auch militärische Schutzmodelle (vgl. [Lan81]) oder mehrere voneinander unabhängige Schutzmodelle gleichzeitig einsetzbar.When Specification mechanisms come a lot of concrete realizations (e.g., suitably restricted predicate logics or other calculi) whose discussion goes beyond the scope of this work would. They are also military Protective models (see [Lan81]) or several independent protection models can be used simultaneously.

2.7.3 Prüfung von Schutzrechten2.7.3 Examination of property rights

Die Prüfung von Schutzrechten kann in speziellen Prüf-Bausteinen check_* erfolgen, die sich prinzipiell an beliebigen Stellen einer Baustein-Hierarchie einfügen lassen. Dort weisen sie die im Sinne des jeweiligen Schutzmodells unzulässigen Operationen zurück. Falls man in speziellen Anwendungsbereichen wie z.B. Echtzeit-Steuerungen kein Schutzmodell benötigt, kann man auf die Instantiierung von check_*-Bausteinen vollkommen verzichten und damit jeglichen Overhead einsparen.The exam of protective rights can take place in special check modules check_ *, in principle, anywhere on a block hierarchy insert to let. There they have the in the sense of the respective protection model unacceptable Operations back. If you are in special applications such. Real-time controls no protection model needed, One can go to the instantiation of check _ * building blocks completely dispense and thus save any overhead.

Die konkrete Realisierung eines Schutzmechanismus ist eine Frage der Strategie, an welchen Stellen welche Arten von Prüfungen auf Basis welcher Mandate durchgeführt werden sollen. Zu beachten ist, dass zur Laufzeit beliebige Baustein-Instanzen neu instantiiert und neue Verdrahtungen erzeugt werden können, mit denen ein festes Schutzkonzept u.U. umgangen werden kann. Beim Einsatz kompositorischer Generizität steckt ein Teil der im System vorhandenen Informationen in der Verdrahtung der Bausteine, die hochgradig flexibel und dynamisch änderbar ist. Zur Lösung dieses Problems müssen die Instantiierungs-Operationen von control-Instanzen (siehe Abschnitt 4.2.1) in das jeweilige Schutzkonzept mit einbezogen und überwacht werden. Zur mathematischen Beschreibung der dynamischen Eigenschaften von Baustein-Netzwerken eignet sich eventuell die Menge aller möglichen Baustein-Konfigurationen, die durch control erzeugbar sind.The concrete realization of a protective mechanism is a matter of Strategy, at which points which types of tests Based on which mandates carried out should be. It should be noted that at runtime, any block instances newly instantiated and new wiring can be generated with which a solid protection concept u.U. can be bypassed. When used compositional genericity some of the information in the system is in the wiring the building blocks, the highly flexible and dynamically changeable is. To the solution need this problem the instantiation operations of control instances (see section 4.2.1) are included in the respective protection concept and monitored become. For the mathematical description of the dynamic properties of building block networks may be the set of all possible Block configurations that can be generated by control.

2.7.4 Sicherstellung von Schutzrechten2.7.4 Ensuring property rights

In der Literatur über Schutzmechanismen in Betriebssystemen werden vor allem zwei Mechanismen zur Sicherstellung eines Schutzkonzepts verwendet:

  • 1. Sicherstellung durch Zugriffsbeschränkung mittels eines Typkonzepts einer höheren Programmiersprache
  • 2. Sicherstellung durch die MMU
The literature on protective mechanisms in operating systems mainly uses two mechanisms to ensure a protection concept:
  • 1. Access restriction by means of a high-level language type concept
  • 2. Secured by the MMU

Typkonzepte von Programmiersprachen haben zwar den geringsten Laufzeit-Overhead, bieten jedoch i.a. nicht das Maß an Sicherheit gegen Umgehung durch böswillige Angriffe, wie dies MMU-Hardware ermöglicht, indem sie Zugriffe auf fremde Schutzbereiche physikalisch unterbindet.type concepts Although programming languages have the lowest runtime overhead, i.a. not the measure Security against evasion by malicious attacks, like this MMU hardware allows by physically blocking access to foreign protection areas.

Im Prinzip lassen sich beide Mechanismen in der hier vorgestellten Architektur einsetzen, wobei Mechanismus 1 durchaus Vorteile bei der Erhöhung der Zuverlässigkeit eines Systems gegen versehentliche Fehlfunktionen mit geringem Overhead besitzt; wirkliche Sicherheit gegen bösartige Angriffe bietet jedoch nur der Mechanismus 2.in the Principle can be both mechanisms in the presented here Architecture, although mechanism 1 certainly benefits the increase the reliability a system against accidental malfunctions with low overhead has; However, real security against malicious attacks offers only the mechanism 2.

Die Realisierung eines Schutzmodells ist daher von der Einteilung des Betriebssystems in Schutzbereiche abhängig (siehe Abschnitt 4.2). Im einen Extremfall kann das gesamte System in einem einzigen Schutzbereich ablaufen, im anderen Extremfall kann jede Baustein-Instanz in einem eigenen Schutzbereich ablaufen; es sind beliebige Zwischenstufen möglich. Sinnvollerweise sollten Zugriffsrechte vor allem an den Grenzen zwischen Schutzbereichen geprüft werden, sofern dieser Aufwand in Kauf genommen werden soll.The Realization of a protection model is therefore based on the classification of the Operating system in protected areas (see section 4.2). In one extreme case, the entire system can be in a single protection area In the other extreme case, each block instance can be executed in one run their own protection area; they are arbitrary intermediates possible. It makes sense to have access rights especially at the borders between protected areas if this effort is to be accepted.

2.8 Performanz-Fragen2.8 Performance questions

Nicht nur in der Literatur wird der Performanz eines Systems ein hoher Stellenwert eingeräumt. Das Ziel hoher Performanz kann gelegentlich mit anderen Zielen in Widerspruch stehen. Durch konsequente Anwendung der Trennung zwischen Mechanismen und Strategien läßt sich dieser Zielkonflikt jedoch in vielen Fällen vermeiden, wenn man beim Entwurf der Mechanismen auf deren performante Implementierbarkeit achtet (die tatsächlich erzielte Performanz hängt jedoch u.a. von den Kenntnissen, Fähigkeiten und Methoden des Implementierers ab33).Not only in the literature, the performance of a system is given a high priority. The high performance goal may occasionally conflict with other goals. By consistently applying the separation between mechanisms and strategies, however, this conflict of objectives can in many cases be avoided by paying attention to their high-performance implementability when designing the mechanisms (however, the performance actually achieved depends, among other things, on the knowledge, capabilities and methods of the implementer 33 ). ,

2.8.1 Performanz von Elementaroperationen2.8.1 Performance of Elementary Operations

In Abschnitt 2.4.2 wurde bereits die systematische Rekombination von Elementaroperationen aus methodischen Gründen heraus motiviert. Performanz stellt ein weiteres Motiv dar.In Section 2.4.2 has already been the systematic recombination of Elementary operations motivated out of methodological reasons. performance represents another motif.

Aufrufer benutzen Elementaroperationen häufig in Bündeln, d.h. in sukzessiven Folgen, die einem bestimmen Programmier-Muster folgen. Gebündelte Aufrufe von Elementaroperationen enthalten i.A. triviale Muster von Programmlogik: nur bei Erfolg der ersten Operation wird die nächste aufgerufen, wobei Ergebnis-Parameter der ersten Operation an die zweite weitergegeben werden. Es kommen viele verschiedene Muster in Betracht.caller use elementary operations frequently in bundles, i.e. in successive sequences that determine a programming pattern consequences. bundled Calls to elementary operations include i.A. trivial pattern of program logic: only upon success of the first operation will the next called result parameter of the first operation to the second be passed on. There are many different patterns into consideration.

Die Idee besteht nun darin, die Implementierung häufig vorkommender Muster (siehe z.B. Abschnitt 3.3.8) von der Implementierung der Elementaroperationen zu separieren. Hierfür eignen sich dedizierte Bausteine pattern_*, die sich mit beliebigen anderen Bausteinen kombinieren lassen. Dies bewirkt praktisch eine Schnittstellen-Erweiterung, die jedoch keine neue Funktionalität einführt, sondern lediglich der Bequemlichkeit und teilweise auch der Performanz-Verbesserung dient. Insbesondere bei Verwendung von RPC-Mechanismen in remote-Bausteinen sorgt die gebündelte Übertragung einer einzigen Operation über ein Netzwerk für die Einsparung von Nachrichten und Latenzzeit, wenn sie erst beim Server in Elementaroperationen aufgespalten und interpretiert wird. Damit dies auch in größeren Baustein-Hierarchien nutzbar wird, sollten relativ einfache Bausteine wie selector oder union, die fast gar nichts tun außer Operationen mit geringen Modifikationen weiterzureichen, gebündelte Muster als passend modifizierte Bündel an die nächste Instanz weiterreichen. Dies ist jedoch keine absolute Pflicht34.The idea is to separate the implementation of common patterns (see eg Section 3.3.8) from the implementation of elementary operations. For this purpose, dedicated blocks pattern_ * are suitable, which can be combined with any other blocks. This practically brings about an interface extension, which does not introduce any new functionality, but only serves the convenience and partly also the performance improvement. In particular, when using RPC mechanisms in remote devices, bundling a single operation across a network saves messages and latency when it is first split and interpreted at the server into elementary operations. In order for this to be useful in larger building block hierarchies, relatively simple building blocks such as selector or union, which do almost nothing except pass operations with minor modifications, should pass bundled patterns as suitably modified bundles to the next instance. However, this is not an absolute obligation 34 .

Zur Umsetzung dieser Idee sollte ein Baustein in seinen Verhaltens-Attributen die Muster angeben, die er verwenden möchte. Die Instantiierungs- und Verdrahtungs-Logik (control und strategy_*, siehe Abschnitt 4.2) kann dann die passenden Muster-Bausteine automatisch an geeigneten Stellen einfügen und zwischenschalten, so dass die Verwendbarkeit der Muster auf jeden Fall sichergestellt ist, ohne sich darum sorgen zu müssen. Falls der untergeordnete Baustein in seinen Kompetenz-Attributen angibt, mit einem bestimmten Muster umgehen zu können, wird dieser Zwischenschritt ggf. ausgelassen. In günstigen Fällen ergibt sich dadurch eine Kette von bündelungsfähigen Verdrahtungen, die sich auch über Speicher-Hierarchien hinweg erstreckt und so die Performanz deutlich verbessert.to Implementation of this idea should be a building block in its behavioral attributes specify the patterns he wants to use. The instantiation and wiring logic (control and strategy_ *, see section 4.2) then can the appropriate pattern building blocks automatically at appropriate Insert digits and interpose so that the usability of the patterns in any case, without having to worry about it. If indicates the child building block in its competence attributes, Being able to handle a certain pattern becomes this intermediate step possibly omitted. In cheap make This results in a chain of bundled wirings, which are also over Extends memory hierarchies and so the performance clearly improved.

2.8.2 Zero-Copy-Architektur2.8.2 Zero-copy architecture

Frühere IO-Schnittstellen wie die von Unix [RT74] oder [Che87] besaßen eine implizite Kopier-Semantik. Neuere Entwicklungen wie [BS96, PDZ99, PDZ00] vermeiden das Herstellen von Kopien in möglichst vielen Situationen. Es ist bekannt, dass dies dramatischen Einfluss auf die Performanz haben kann.Earlier IO interfaces like those of Unix [RT74] or [Che87] had an implicit copy semantics. Recent developments such as [BS96, PDZ99, PDZ00] avoid manufacturing of copies in as possible many situations. It is well known that this dramatic influence can have on the performance.

Die hier vorgestellte Architektur definiert daher die IO-Funktionalitiät der Nest-Schnittstelle mit Hilfe von Referenz-Semantik; die Übergabe von physischem Speicher über Schnittstellen hinweg erfordert dies ohnehin. Damit ist kopierfreie Übergabe von Daten über beliebig große Baustein-Hierarchien hinweg möglich. Falls in besonderen Fällen eine Kopier-Semantik gewünscht wird oder notwendig ist, kann sie leicht als interne Strategie durch einen Baustein implementiert werden.The The architecture presented here therefore defines the IO functionality of the Nest interface using reference semantics; the transfer of physical storage via interfaces away, this requires anyway. This is copy-free transfer of data over arbitrarily large Block Hierarchies possible. If in special cases a copy semantics desired is or is necessary, it can easily go through as an internal strategy a building block will be implemented.

2.8.3 Das Background-IO-Konzept2.8.3 The Background IO Concept

Durchsatz-begrenzende Flaschenhälse treten oft in komplexen Netzwerken von Baustein-Verdrahtungen oder in verteilten Systemen auf. Wenn ein Falschenhals auf physikalischen Bedingungen beruht (z.B. bei Festplatten-IO), läßt er sich prinzipell nicht entfernen (außer durch Kauf schnellerer und teurerer Hardware). Man kann jedoch Methoden entwicklen, um mit derartigen Flaschenhälsen besser leben zu können, d.h. zu versuchen, „das beste draus zu machen".Rate-limiting bottlenecks often occur in complex networks of building block wiring or in distributed systems. If a fake neck on physical Conditions (e.g., Hard Disk IO), it does not work in principle remove (except by buying faster and more expensive hardware). One can, however, methods develop in order to live better with such bottlenecks, i. to try, "that to make the best of it ".

IO-Prioritäten diesen diesem Zweck. Mittels IO-Prioritäten lassen sich wichtige von unwichtigen IO-Operationen trennen. Ich schlage die Verwendung folgender IO-Prioritässtufen vor:
prio_background Der IO-Auftrag kann irgendwann ausgeführt werden, beispielsweise wenn ansonsten ungenutzte Übertragungs-Bandbreite frei geworden ist. Die Wartezeit bis zur Ausführung darf beliebig lang sein; es werden keinerlei Fairness-Bedingungen garantiert oder erwartet.
prio_normal Der IO-Auftrag muss prinzipiell gleichberechtigt zu anderen Aufträgen bearbeitet werden, die ebenfalls prio_normal haben. Der Auftrag muss nach endlicher Zeit erledigt sein (kein Verhungern). Permutationen der Abarbeitungs-Reihenfolge sind im Rahmen dieser Bedingungen erlaubt.
prio_urgent Der IO-Auftrag ist anderen vorzuziehen. Die größere Wichtigkeit hat eine logische Begründung (beispielsweise Sicherung wichtiger Meta-Daten).
IO priorities this purpose. IO priorities can be used to separate important from unimportant IO operations. I suggest using the following IO priority levels:
prio_background The IO job can be executed at some point, for example if otherwise unused transmission bandwidth has become free. The waiting time until execution can be any length; no fairness conditions are guaranteed or expected.
prio_normal In principle, the IO job must be processed on an equal footing with other jobs that also have prio_normal. The job must be done after finite time (no starvation). Permutations of the execution order are allowed within these conditions.
prio_urgent The IO job is preferable to others. The greater importance has a logical justification (for example, backing up important metadata).

Die Idee besteht darin, bei Verstopfung eines IO-Flaschenhalses Aufträge mit prio_background vollkommen zu verdrängen. Bei geeigneter Realisierung lässt sich dies so gestalten, dass Hintergrund-Aufträge die normalen IO-Aktivitäten überhaupt nicht stören.The The idea is to block orders with prio_background if an IO neck is blocked completely displace. With suitable realization leaves This is done so that background jobs the normal IO activities at all do not bother.

Bei Festplatten kann man dies folgendermassen realisieren: erst werden alle Aufträge mit prio_urgent und prio_normal abgearbeitet. Danach folgt eine spekulative Wartepause in der Größenordnung von 10 ms bis 100 ms, nach deren Ablauf erst mit dem Abarbeiten der Hintergrund-Operationen begonnen wird. Falls während dieser Wartepause erneute Operationen mit prio_urgent oder prio_normal eintreffen, werden keine Hintergrund-Operationen gestartet, sondern die höher priorisierten sofort vorgezogen; danach beginnt die Wartepause von vorn. Der Sinn dieser Wartepause besteht darin, den mechanisch bewegten Schreib-Lesekopf nicht zu verstellen, falls eine Anwendung ihre IO-Anforderungen zwar in Gruppen (Bursts) stellt, zwischen den Anforderungen aber sehr kurze Lücken (z.B. wegen kurzer Rechenzyklen) einlegt. Ohne die Wartepause könnte der mechanische Arm der Festplatte während der sehr kleinen Lücke zwischen normal-priorisierten Burst-Operationen (wenige Mikro- oder Nanosekunden) auf die Position der Hintergrund-Operation verstellt werden, was bei heutigen Festplatten im Mittel etwa 5 ms bis 10 ms dauert, und hernach wieder auf die Position des Burst-Prozesses zurückgestellt werden. Da das mechanische Verstellen um mehrere Grössenordnungen langsamer geht als das sequentielle Lesen von Burst-Datenblöcken, würde dieses andauernde mechanische Hin-und-Herstellen zu einem Trashing-Effekt mit einem Zusammenbruch des Daten-Durchsatzes führen. Die Wartepause löst dieses Problem durch eine Spekulation auf das Eintreffen weiterer wichtiger Operationen. Wenn diese Spekulation nach einer relative langen Zeit von einigen Vielfachen der mittleren Zugriffszeit der Festplatte sich nicht erfüllt hat, dann ist es wegen der bekannten empirisch beobachteten zeitlichen Ungleichverteilung der IO-Anforderungen sehr unwahrscheinlich, dass ausgerechnet dann weitere IO-Operationen mit normaler Priorität eintreffen, während der Kopf für die Hintergrund-Aufträge verstellt wird. Falls dieser Fall trotzdem einmal eintreten sollte, dann verschlechtert er den ohnehin sehr geringen Durchsatz der normal-priorisierten Aufträge nicht mehr wesentlich.at Hard disks can be realized as follows: first all orders processed with prio_urgent and prio_normal. After that follows one speculative waiting break of the order of magnitude from 10 ms to 100 ms, after which they will be processed the background operations is started. If during this Wait for another operation with prio_urgent or prio_normal arrive, no background operations are started, but the higher prioritized immediately preferred; then the waiting break of front. The purpose of this waiting break is to move mechanically Read / write head can not be adjusted if an application uses its Although IO requests are placed in groups (bursts), between the requirements but very short gaps (for example because of short calculation cycles). Without the waiting break could the mechanical arm of the disk while the very small gap between normal-prioritized burst operations (a few micro- or Nanoseconds) to the position of the background operation which is about 5 ms to 10 on average for today's hard drives ms and then back to the position of the burst process reset become. Since the mechanical adjustment by several orders of magnitude slower than sequential reading of burst data blocks, this would continuous mechanical tailoring to a trashing effect with a breakdown in data throughput. The waiting break solves this Problem by speculation on the arrival of more important Operations. If this speculation after a relatively long time of a few multiples of the hard disk's medium access time not fulfilled has, then it is because of the known empirically observed temporal Unequal distribution of IO requirements very unlikely that just then other IO-operations with normal priority arrive, while the head for the background orders is adjusted. If this case should happen anyway, then it worsens the already very low throughput of the normal-prioritized assignments not much more.

Wenn man das Konzept eines den Normalbetrieb praktisch nicht störenden Hintergrund-IO-Betriebes in die Nest-Schnittstelle aufnimmt, ergeben sich neuartige Realisierungen für das Problem der Persistenz über Speicherlücken hinweg. So schadet es beispielsweise in einem Buffer-Cache überhaupt nicht, wenn man jegliche geänderten Puffer sofort nach Bekanntwerden der Änderung (Wechsel in den „dirty"-Zustand des Puffers) einen IO-Auftrag zum Abspeichern mit Hintergrund-Priorität generiert. Falls der Hintergrund-Auftrag sehr lange nicht ausgeführt wird, dann entsteht der gleiche Effekt wie beim konventionellen Puffern ohne IO-Auftrag. Werden Hintergrund-Aufträge jedoch auf „heissen" (d.h. oft zugegriffenen) Seiten ausgeführt, dann führt dies in der Summe zwar zu einer höheren Belastung des IO-Kanals mit Aufträgen, diese füllen jedoch nur die ansonsten ungenutzte Rest-Bandbreite des Kanals, die ansonsten „verschwendet" worden wäre.If one the concept of a normal operation practically not disturbing background IO operation in takes up the nest interface, there are new realizations for the Problem of persistence across memory leaks. For example, it damages a buffer cache at all not if you change any Buffer immediately after becoming aware of the change (change to the "dirty" state of the buffer) IO request generated for saving with background priority. If the background job is not running for a long time, then the same effect as with conventional buffering arises without IO job. However, background jobs are called "hot" (i.e., often accessed) Pages executed, then leads this in total to a higher load on the IO channel with orders, fill these however, only the otherwise unused residual bandwidth of the channel, which would otherwise have been "wasted".

Im Endeffekt entsteht dadurch eine zeitnahe Sicherung transienten Speichers auf persistente Hintergrund-Medien, die sich automatisch an die aktuell verfügbare Bandbreite adaptiert. Bei hoher verfügbarer Bandbreite werden spekulative Sicherungs-Vorgänge ausgeführt, die zu einer besseren Sicherheit gegen unvorhergesehene Ereignisse wie Stromausfall führen.in the The end effect is a timely backup of transient memory on persistent background media that automatically attaches to the currently available Bandwidth adapted. With high available bandwidth become speculative Backup operations executed the better security against unforeseen events like power failure lead.

Die Hintergrund-Priorität lässt sich weiterhin auch zum spekulativen Vor-Laden von Caches etc. nutzen. Spekulatives Ladevorgänge können wegen der Hintergrund-Priorität jederzeit von wichtigeren Vordergrund-Aktivitäten verdrängt werden. Die Realisierung solcher Preloading-Strategien kann beispielsweise durch zwischen geschaltete Verhaltens-Beobachter-Bausteine erfolgen, die das IO-Verhalten einer Anwendung beobachten und analysieren und daraus Schlüsse über das erwartete zukünftige Verhalten der Anwendung ziehen.The Background Priority let yourself continue to use for speculative pre-loading of caches, etc. Speculative loads can because of the background priority be displaced by more important foreground activities at any time. The realization Such preloading strategies can be done, for example, by between switched behavioral observer building blocks that perform the IO behavior observe and analyze an application and draw conclusions about it expected future Drag the behavior of the application.

In Abschnitt 3.3.1 wird näher beschrieben, wie sich die IO-Priorität bereits erteilter Aufträge nachträglich erhöhen lässt. Diese dynamische Änderungsmöglichkeit ist wichtig, da richtig spekulierte Anforderungen jederzeit zu „echten" Anforderungen einer Anwendung werden können.Section 3.3.1 describes in more detail how the IO priority of already issued orders is followed increase. This dynamic change opportunity is important because properly speculated requests can become "real" requirements of an application at any time.

3 Nester3 nests

Die Abstraktion des Nestes stellt ein konkretes Speichermodell dar. Betriebssystem-Konstrukteure sind traditionell gewohnt, dass ihnen die Hardware eines Rechners oder eines Rechner-Typs ein bestimmtes Speichermodell vorschreibt oder zumindest in relativ engen Grenzen sehr nahe legt. Diesem Zwang versuche ich an einigen Stellen so zu entkommen, dass dadurch keine grundlegende Verschlechterung der Performanz-Eigenschaften der Hardware ausgelöst wird.The Abstraction of the nest represents a concrete storage model. Operating system designers are traditionally used to them the hardware of a computer or a computer type a specific memory model prescribes or, at least, within relatively narrow limits very close. I try to escape this compulsion in some places so that no fundamental deterioration of the performance characteristics the hardware triggered becomes.

Eine Nest-Instanz ist ein logischer Adressraum, der von der Adresse 0 bis zu einer Maximalgröße (mit mindestens 64Bit35) laufen kann. Mit logischen Adressen darf Adress-Arithmetik getrieben werden; es werden Bytes36 adressiert.A Nest instance is a logical address space that can run from address 0 to a maximum size (at least 64-bit 35 ). Address arithmetic may be used with logical addresses; bytes 36 are addressed.

Ein Nest dient vor allem zur Abbildung von logischen Byte-Adressen auf physische Byte-Adressen von Datenblöcken. Damit soll u.a. das bekannte Konzept eines virtuellen Benutzer-Adressraums nachgebildet werden; dies ist jedoch prinzipiell unabhängig davon, ob MMU-Hardware in einem Rechner vorhanden ist oder nicht. Ein physischer Datenblock hat eine begrenzte Länge, innerhalb deren er sich durch Maschinenbefehle des Prozessors ansprechen läßt und innerhalb deren Adress-Arithmetik auf Basis von physischen Byte-Adressen getrieben werden darf.One Nest is primarily used to map logical byte addresses physical byte addresses of data blocks. This should u.a. the known Concept of a virtual user address space; however, this is in principle independent of whether MMU hardware is present in a computer or not. A physical data block has a limited length, within which it addresses itself by machine instructions of the processor lets and within whose address arithmetic is driven based on physical byte addresses may be.

3.1 Arten von Nestern3.1 types of nests

Es wird zwischen statischem und dynamischem Nest unterschieden: während ein statisches Nest sich ähnlich wie ein Unix-Device verhält und auch nur im Zusammenhang mit Peripheriegeräten o.ä. vorkommen sollte, basiert das gesamte restliche System auf dynamischen Nestern.It is distinguished between static and dynamic nest: during one static nest similar how a Unix device behaves and only in connection with peripherals or similar should occur the entire rest of the system on dynamic nests.

Ein dynamisches Nest kann im Unterschied zu einem konventionellen File abfragbare und veränderbare Löcher im Definitionsbereich der partiellen Abbildung von logischen Adressen auf physische Adressen von Datenblöcken enthalten, ähnlich wie ein Sparse File unter Unix (vgl. auch [Fot61, Lie95a]), jedoch wird diese Eigenschaft vom gesamten Betriebssystem auf allen Ebenen außer Low-Level-Gerätetreibern unterstützt und auch intensiv genutzt. Als neuartige Elementaroperation kommt die transparente Verschiebung von logischen Adressbereichen hinzu. Eine Verschiebung bewirkt, dass ein Teil des Definitionsbereiches der partiellen Abbildung von logischen Adressen auf Adressen von physischen Datenblöcken so verschoben wird, dass dieselben Datenblöcke anschließend unter einem Adress-Offset (im Vergleich zu den vorigen Adressen) im logischen Adressbereich erreichbar sind. Im Allgemeinen können durch Verschiebe-Operationen Löcher im Definitionsbereich entstehen und/oder geschlossen werden, eventuell können am Ziel der Verschiebung auch Datenblöcke „verloren gehen", d.h. sie werden nicht mehr vom Nest adressiert (können aber i.a. noch solange weiter existieren, solange noch dynamische Referenzen darauf bestehen).One dynamic nest can be unlike a conventional file interrogatable and changeable holes in the domain of partial mapping of logical addresses on physical addresses of data blocks, similar to a sparse file under Unix (see also [Fot61, Lie95a]), but this is Property of the entire operating system at all levels except low-level device drivers supports and also used intensively. As a novel elemental operation comes the transparent shift of logical address ranges added. A shift causes a part of the domain the partial mapping of logical addresses to addresses of physical blocks of data is moved so that the same data blocks below an address offset (compared to the previous addresses) in the logical Address range are reachable. In general, by moving operations holes arise in the domain of definition and / or closed, possibly can At the destination of the shift, data blocks are also "lost", i.e. they will not more addressed from the nest (can but i.a. still exist as long as there are still dynamic References exist).

In konventioneller Terminologie bedeutet eine Verschiebeoperation, dass je nach Vorzeichen des Verschiebe-Offsets und Länge des verschobenen Bereichs eine Insert- oder Delete- oder Move-Operation in einer Datei, in einer Datenbank, oder allgemein gesprochen in einem Nest durchgeführt wird. Ich verwende daher nur noch die Begriffe Nest und Verschiebe-Operation, um diese Sachverhalte zu charakterisieren. Wichtig an der Verschiebe-Operation ist, dass sie transparent erfolgt. Damit ist gemeint, dass nur diejenigen Teile des Gesamtsystems von einer Verschiebung Kenntnis erhalten, die unbedingt davon betroffen sind; für die anderen Teile ergeben sich durch die Verschiebung keine Änderungen.In conventional terminology means a shift operation, that depending on the sign of the shift offset and length of the moved area an insert or delete or move operation in a file, in a database, or generally spoken in carried out a nest becomes. So I'm just using the terms nest and move operation, to characterize these facts. Important to the move operation is that it is transparent. By that is meant that only those Get parts of the overall system from a shift note, which are necessarily affected; for the other parts no changes due to the shift.

Hierzu ein Beispiel (siehe auch Abschnitt 4.1.4): aus dem oberen Ende eines Original-Nestes sei ein Teil-Nest ausgeschnitten worden. Die Ausschneide-Operation bewirkt, dass die zugrunde liegenden Datenblöcke sowohl im Original-Nest als auch im ausgeschnittenen Teil-Nest erscheinen, dort jedoch unter neuen Adressen (im Regelfall bei 0 oder einer anderen festen Adresse beginnend). Nun finde eine Verschiebung im Original-Nest statt, die das gesamte ausgeschnittene Teil-Nest mit umfasse, der gesamte Ausschnitt also mit-verschoben werde. Transparenz bedeutet in diesem Beispiel, dass sich an den Adressen des ausgeschnittenen Teil-Nestes nichts ändert. Benutzer des Teil-Nestes merken gar nichts davon, dass ihr Gastgeber-Adressraum „hinter ihrem Rücken" verschoben wurde.For this an example (see also section 4.1.4): from the upper end of a Original nest had been cut out a part-nest. The cut-out operation causes the underlying data blocks both in the original nest appear as well in the cut-out part nest, but there under new addresses (usually at 0 or another fixed address starting). Now find a shift in the original nest, which includes the entire cut-out nest, the entire Extract so be-shifted. Transparency means in this Example, that at the addresses of the cut out part nest nothing changes. Users of the sub-nest do not notice that their host address space is "behind her back "was postponed.

3.2 Zugriffs-Modelle3.2 access models

Auf einer Nest-Instanz lassen sich Operationen ausführen, darunter elementare Grundoperationen. Operations-Aufrufe dürfen grundsätzlich parallel durch Aufrufer-Instanzen (wer auch immer das sein mag) bzw. asynchron an eine Bearbeiter-Instanz (i.d.R. die Implementierung der Nest-Operationen) erfolgen. Die Bearbeiter-Instanz bewirkt für alle Operations-Aufrufe jeweils zugehörige Operations-Ausführungen, deren ausgelösten Effekte die Ausführung anderer Operationen beeinflussen können. Die Beeinflussung wird durch zwei grundlegende Modelle beschrieben:
linearize_global Durch Operations-Ausführung entsteht eine sequentielle Folge von Nest-Zuständen auf derselben Nest-Instanz. Es ist Aufgabe einer Implementierung von Nest-Operationen, für die Einhaltung dieser sogenannten globalen Operations-Linearisierungs-Eigenschaft37 (zur Grundidee vgl. [HW90]38) zu sorgen. Verschiedene Nest-Instanzen sind grundsätzlich voneinander unabhängig, soweit nicht durch Bausteine Abhängigkeiten eingeführt werden.
linearize_local Für alle Operations-Aufrufe, die sich auf eine gegenseitig überschneidende Teilmenge der logischen Adressen beziehen, wird eine sequentielle Folge von Zuständen definiert bzw. hergestellt; Operations-Ausführungen auf verschiedenen logischen Adressbereichen stehen nicht notwendigerweise in einer Ordnungsrelation zueinander (auch Kommutierbarkeit39 genannt). Damit wird i.A. nur eine Halbordnung zwischen den Operations-Ausführungen auf derselben Nest-Instanz garantiert (lokale Linearisierung40).
You can perform operations on a Nest instance, including basic elementary operations. In principle, operation calls can be made in parallel by caller instances (whoever this may be) or asynchronously to an agent instance (usually the implementation of the nest operations). The operator instance causes corresponding operation executions for all operation calls whose triggered effects can influence the execution of other operations. The influence is described by two basic models:
linearize_global Operation execution creates a sequential sequence of nest states on the same nest instance. It is the task of implementing nest operations to ensure compliance with this so-called global operation linearization property 37 (for the basic idea see [HW90] 38 ). Different nest instances are basically independent of each other, unless dependencies are introduced by building blocks.
linearize_local For all operation calls that refer to a mutually overlapping subset of the logical addresses, a sequential sequence of states is defined or established; Operations executions on different logical address areas are not necessarily in an order relation to each other (also called commutability 39 ). In general, this guarantees only a partial order between the operation executions on the same nest instance (local linearization 40 ).

Globale und lokale Linearisierung unterscheiden sich demnach nur in der Granularität, mit der die Zustände bezeichnet werden; weitere Modelle werden in Kapitel 7 behandelt. Nur wenn lokal linerarisierte Operationen mit unterschiedlich großen Adressbereichen auftreten, bei denen ein größerer Adressbereich mehrere kleinere überlappt, entstehen zwangsläufig halbordnungsartige Querbezüge zwischen ansonsten unabhängigen Strängen von „Objekt"-Zuständen. Eine weitere Verfeinerung der Semantik von Nestern mittels Zusätzen wie z.B. Bausteine zur Implementierung verschiedener Arten von Serialisierbarkeit [Vid87] ist möglich und gehört zu den Strategien, die mittels Bausteinen implementiert werden können. Das Modell der lokalen Linearisierung ist ziemlich allgemein gehalten, um verschiedene Konsistenz- oder Korrektheitsbegriffe als Spezialisierung ableiten zu können.global and local linearization differ only in the granularity, with the states be designated; other models are covered in Chapter 7. Only if locally linearized operations with different sized address ranges occur where a larger address range overlaps multiple smaller ones, inevitably arise Semi-circular cross-references between otherwise independent strands of "object" states further refinement of the semantics of nests using additions such as e.g. Building blocks for implementing various types of serializability [Vid87] is possible and heard to the strategies that can be implemented using building blocks. The Model of local linearization is fairly general, to different consistency or correctness terms as specialization to derive.

Die Forderung nach (irgend)einer sequentiellen Folge von Nest- oder Adressbereichs-Zuständen (unabhängig von der Granularität) läßt sich durch eine operationale Semantik beschreiben. Diese legt nur fest, welche Operation welche Effekte auf einem Nest bzw. Adressbereich bewirkt, d.h. wie aus einem Zustand vi ein Zustand vj wird. Die Zustände vi und vj werden auch als Versionen bezeichnet. Eine Operations-Ausführung impliziert zwischen den Versionen vi und vj die Relation der direkten funktionalen Abhängigkeit. Im Allgemeinen gilt j > i, d.h. die direkte funktionale Abhängigkeit ist eine Halbordnung (siehe 4).The requirement for (any) sequential order of nest or address range states (regardless of granularity) can be described by operational semantics. This only determines which operation causes which effects on a nest or address range, ie how a state v i becomes a state v j . The states v i and v j are also called versions. An operation execution implies the relation of the direct functional dependency between the versions v i and v j . In general, j> i, ie the direct functional dependence is a partial order (see 4 ).

Die (oft wünschenswerte) Eigenschaft der Determinanz41 ist dann gegeben, wenn stets j = i + 1 gilt, d.h. die funktionale Abhängigkeit stellt eine Totalordnung dar (5)The (often desirable) property of the determinant 41 is given if j = i + 1 holds, ie the functional dependence represents a total order ( 5 )

Die Folge der (globalen oder lokalen) Operations-Ausführungen hängt per Konvention mit der Folge der Nest-Zustände in einer 1:1-Beziehung zusammen (d.h. jede Operation bewirkt genau eine Version des Nest-Zustands, die ggf. gleich zu einer früheren Version ausfallen kann), auch wenn die Determinanz nicht gegeben sein sollte.The Consequence of the (global or local) operation executions hangs per Convention with the sequence of nest states in a 1: 1 relationship together (i.e., each operation causes exactly one version of the nest state, which may be equal to an earlier one Version may fail), even if the determinant is not given should be.

Ein Zustand vi einer Nest-Instanz besteht aus einer Adressabbildungs-Funktion ai, die logische Adressen auf physische Adressen abbildet, und einer Datenabbildungs-Funktion di, die physische Adressen auf Bytes abbildet. Wir schreiben vi = (ai, di) und bringen damit zum Ausdruck, dass die Komposition der beiden Funktionen ai und di den Zustand vi vollständig charakterisiert. Die Operationen lassen sich in folgende Operations-Arten einteilen:
invariant Eine invariante Operation ändert nichts am Zustand des Nestes, d.h. es gilt vj = vi.
adressmodifizierend Es gilt dj = di und aj ≠ ai. Eine adressmodifizierende Operation bewirkt, dass immer noch die gleichen Inhalte (Werte) physischer Datenblöcke in der Nest-Instanz vorhanden sind, diese jedoch teilweise unter neuen logischen Adressen erreichbar sind. Adressmodifizierende Operationen setzen ein dynamisches Nest voraus.
datenmodifizierend Es gilt aj = ai und dj ≠ di. Eine datenmodifizierende Operation ersetzt den Inhalt physischer Datenblöcke durch einen anderen Inhalt in einem zusammenhängenden Bereich des logischen Adressraums, der Modifikations-Bereich genannt wird; ausserhalb des Modifikations-Bereiches ist der Effekt der Operation invariant. Datenmodifizierende Operationen können sowohl auf statische als auch auf dynamische Nester ausgeführt werden.
A state v i of a nest instance consists of an address mapping function a i , which maps logical addresses to physical addresses, and a data mapping function d i , which maps physical addresses to bytes. We write v i = (a i, d i) and thus express that the composition of the two functions a i and v i d i fully characterized the state. The operations can be divided into the following types of operations:
invariant An invariant operation does not change the state of the nest, ie v j = v i .
address-modifying We have d j = d i and a j ≠ a i . An address-modifying operation causes the same contents (values) of physical data blocks to still exist in the Nest instance, but they are partially reachable under new logical addresses. Address-modifying operations require a dynamic nest.
data-modifying We have a j = a i and d j ≠ d i . A data modifying operation replaces the contents of physical data blocks with another content in a contiguous area of the logical address space called a modification area; outside the modification range, the effect of the operation is invariant. Data modifying operations can be performed on both static and dynamic nests.

Was mit den Zuständen geschieht; bzw. wofür sie benutzt werden, ist eine eigenständige Frage, die sich auf verschiedene Weisen beantworten läßt. Ich propagiere folgende Modelle:
singleuser Es ist nur eine einzige Aufrufer-Instanz vorhanden, die Operations-Aufrufe auf der Nest-Instanz ausführen kann. Im allgemeinen kann diese Aufrufer-Instanz dennoch mehrere parallele, (asynchrone) Operations-Aufrufe tätigen. Die Nest-Instanz sichert dem Aufrufer die Determinanz zu. Der Aufrufer hat nur Zugriff auf die jeweils letzte Version vn der Zustände der Nest-Instanz, bzw. Änderungen erfolgen nur dort (Single-Copy-Eigenschaft). Bei mehreren parallelen Operations-Aufrufen durch denselben Aufrufer wird keine konkrete Reihenfolge der Operations-Ausführungen zugesichert. Falls der Aufrufer jedoch stets nur einen einzigen Operations-Aufruf in Auftrag gibt, wird ihm eine konkrete Reihenfolge zugesichert.
multiuser Es dürfen mehrere Aufrufer-Instanzen vorhanden sein. Diesen wird die Eigenschaft der Determinanz zugesichert. Im Vergleich zum Singleuser-Modell erhält eine einzelne Aufrufer-Instanz trotz Beauftragung mit einem einzigen Operations-Aufruf nicht mehr die Zusicherung, in welcher Reihenfolge die Ausführung gegenüber den Aufträgen anderer Instanzen geschieht.
multiversion Dieses Modell wird in Kapitel 7 behandelt und zerfällt in mehrere Untermodelle. Es dürfen mehrere Aufrufer-Instanzen vorhanden sein. Diese haben im allgemeinsten Untermodell potentiellen Zugriff auf alle Adress-Versionen ai und alle Daten-Versionen dj einer Nest-Instanz, womit ein Zugriff auf beliebige Pseudo-Zustände v'ij =(ai, dj) möglich ist, bei denen i = j nicht unbedingt gelten muß (was jedoch in einigen Untermodellen eventuell gefordert werden kann). Damit wird nur noch die Zusicherung gegeben, dass die Operations-Ausführung auf irgendeiner gültigen (also nicht auf einer undefinierten) Version der Adress- und Datenabbildung stattfindet, die jedoch auch älter sein kann.
What happens to the states; or what they are used for, is a separate question that can be answered in various ways. I propagate the following models:
singleuser There is only a single caller instance that can make operation calls on the Nest instance. In general, this caller instance can still make multiple parallel (asynchronous) operation calls. The Nest instance assures the caller the determinant. The caller only has access to the latest version v n of the states of the Nest instance, or changes are only made there (single-copy property). Multiple parallel operation calls by the same caller do not guarantee a specific order of operation executions. However, if the caller always orders only one operation call, it will be guaranteed a specific order.
multiuser There may be multiple caller instances. These are guaranteed the property of determinacy. Compared to the single-user model, a single caller instance, despite having been assigned a single operation call, no longer guarantees the order in which it is executed compared to the orders of other instances.
multiversion This model is discussed in Chapter 7 and breaks down into several submodels. There may be several caller instances. In the most general submodel, these have potential access to all address versions a i and all data versions d j of a nest instance, thus allowing access to any pseudo states v ' ij = (a i , d j ) in which i = j does not necessarily have to apply (which may be required in some submodels). Thus, only the assurance is given that the operation execution takes place on any valid (not on an undefined) version of the address and data mapping, but which may also be older.

Die Modelle singleuser und multiuser erfüllen per Konstruktion die Eigenschaft der Determinanz, haben also die Semantik von Halbleiter- oder Plattenspeichern, bei denen eine Schreiboperation die vorherige Version ersetzt und nicht mehr zugänglich macht. Im Folgenden werden wir uns auf diese beiden Modelle beschränken und multiversion in Kapitel 7 gesondert betrachten.The Models singleuser and multiuser fulfill by design the property the determinant, so have the semantics of semiconductor or disk storage, where a write operation replaces the previous version and no longer accessible power. In the following we will confine ourselves to these two models and View the multiversion in Chapter 7 separately.

Die Eigenschaft der Korrektheit wird durch die hier beschriebenen Nest-Modelle nicht betrachtet42; die damit verbundenen Probleme sind auf anderer Ebene zu lösen. Dies ermöglicht konkreten Baustein-Implementierungen, verschiedene Modelle von Korrektheit auf Basis der allgemeineren Abstraktion Nest zu erfüllen. Jede Aufrufer-Instanz hat daher die Verpflichtung, selbst43 für die Erfüllung weiterer von ihr selbst gegebenen Zusicherungen, insbesondere die Korrektheit (im von ihr selbst definierten Sinne) zu sorgen. Die Abstraktion der Nester stellt jedoch dafür eine (hoffentlich bequeme) Infrastruktur zur Verfügung.The property of correctness is not considered by the nest models described here 42 ; the problems involved have to be solved at a different level. This allows concrete building block implementations to meet different models of correctness based on the more general nest abstraction. Each caller instance therefore has the obligation to itself 43 to fulfill further assurances given by itself, in particular the correctness (in the sense defined by itself). However, the abstraction of the nests provides a (hopefully convenient) infrastructure for this.

Eine Nest-Implementierung braucht nicht unbedingt alle drei Modelle zu unterstützen. Welche Modelle im Einzelfall unterstützt werden, gehört zu den Kompetenzen (vgl. Abschnitt 2.5) der Nest-Implementierung. Wie bereits gesagt, müssen die Kompetenzen der Nest-Implementierung zum Verhalten einer Aufrufer-Instanz kompatibel sein.A Nest implementation does not necessarily need all three models too support. Which models are supported in the individual case, belongs to the Competencies (see Section 2.5) of the Nest implementation. As already said, must Compatibility of the nest implementation with the behavior of a caller instance be.

Die Tabelle 6 zeigt die möglichen Kompatibilitäten. Die Tripel bedeuten hierbei, wie viele verschiedene Aufrufer-Instanzen mit Verhalten singleuser, multiuser und multiversion jeweils an einer Konfiguration mit einer Nest-Implementierung der betreffenden Kompetenz teilnehmen dürfen. Während sich singleuser mit keinem anderen Aufrufer-Verhalten verträgt, sind multi* beliebig untereinander mischbar, sofern die Nest-Implementierung von ihren Kompetenzen her mitspielen kann.The Table 6 shows the possible Compatibilities. The triples here mean how many different caller instances with behavior of singleuser, multiuser and multiversion respectively a configuration with a nest implementation of those Competence to participate. While Singleuser is incompatible with any other caller behavior multi * arbitrarily miscible with each other, provided the nest implementation can play their competences.

3.3 Elementaroperationen auf statischen und dynamischen Nestern3.3 Elementary Operations on static and dynamic nests

Der hier vorgestellte Satz von Elementaroperationen auf Nestern ist als Beispiel zu verstehen, wie man die Schnittstelle zu Nestern gestalten kann. Die Beschreibung ist informell und soll die Kernidee erklären; es handelt sich nicht um eine vollständige Spezifikation aller Details.Of the is here presented set of elementary operations on nests as an example to understand how to nests the interface can shape. The description is informal and should be the core idea to explain; it is not a complete specification of all details.

Der Entwurf von IO-Schnittstellen wird in der Praxis durch diverse Umstände verkompliziert, die nach meinem Dafürhalten für einen Großteil der Implementierungs-Komplexität realer Betriebssysteme mitverantwortlich sind. Durch Berücksichtigung dieser Umstände bereits in den Schnittstellen und im gesamten System über alle Ebenen hinweg44, sowie durch die Unterstützung so genannter „fortgeschrittener IO-Konzepte" wie asychroner IO und Nonblocking-IO mittels universeller Generizität läßt sich diese Komplexität reduzieren45. Daher enthält bereits die Schnittstelle für statische Nester alle im System vorkommenden IO-Konzepte.The design of IO interfaces is complicated in practice by a variety of circumstances, which in my opinion are responsible for much of the implementation complexity of real-world operating systems. By taking these circumstances into account in the interfaces and throughout the system across all levels 44 , as well as by supporting so-called "advanced IO concepts" such as asynchronous IO and non-blocking IO using universal genericity, this complexity can be reduced 45. Therefore, it already contains the interface for static nests all IO concepts occurring in the system.

Ich habe versucht, im folgenden Entwurf auch die Anforderungen von Datenbanken so weit zu berücksichtigen, dass hoffentlich die Grundfunktionalität eines Datenbank-Systems abgedeckt werden kann46.In the following draft, I also tried to take into account the requirements of databases so far, hopefully, to cover the basic functionality of a database system 46 .

Sperrmechanismen dienen dazu, die möglichen Ausführungsfolgen von Operationen einzuschränken. Als Sperrmechanismen sind bei statischen und dynamischen Nestern die elementaren Grundoperationen lock und unlock vorgesehen, die die einzigen Sperrmechanismen sind, die im gesamten Betriebssystem benötigt werden47.Locking mechanisms serve to limit the possible execution sequences of operations. Locking mechanisms in static and dynamic nests are the basic lock and unlock operations, which are the only locking mechanisms required throughout the operating system 47 .

Ein statisches Nest läßt sich als Einschränkung eines dynamischen Nestes verstehen, bei dem die Verschiebe-Operation fehlt und keine Löcher im Definitionsbereich vorkommen, sowie in den meisten Fällen (etwa bei Festplatten-Partitionen) keine dynamische Änderung der Größe erfolgt. Allerdings wird diese abstrakte Sicht nicht vollkommen von der Realität aktueller Peripheriegeräte geteilt: die Granularität von Datentransfers ist bei aktueller Peripherie auf Blöcke fester Länge, etwa 512 Byte bei Festplatten oder 2048 Byte bei CD-Laufwerken, begrenzt. Darüber hinaus dürfen Datentransfers nur an solchen Adressen stattfinden, die durch die Granularität ohne Rest teilbar sind. Diese Einschränkungen werden durch ein Attribut transfer_size modelliert, das jeder Nest-Instanz zugeordnet ist, und das jeder Verwender eines Nestes abfragen und bei seinen IO-Aufträgen berücksichtigen muss.One static nest settles as a restriction understand a dynamic nest where the move operation missing and no holes in the domain of definition, and in most cases (eg with hard disk partitions) no dynamic change of the size takes place. However, this abstract view does not become fully up to date with reality peripherals divided: the granularity Data transfers are firmer on blocks at current peripherals Length, about 512 bytes for hard drives or 2048 bytes for CD drives, limited. About that allowed out Data transfers only take place at such addresses, through the granularity are divisible without residue. These restrictions are indicated by an attribute modeled transfer_size associated with each Nest instance, and that each user of a nest query and take into account in his IO jobs got to.

Bei statischen und dynamischen Nestern sorgen die Elementaroperation dafür, dass die logischen Adressen (die relativ zum jeweiligen Nest gelten) auf physische Adressen von transienten Datenblöcken übersetzt werden. Die Zuständigkeit für die Verwaltung der physischen Adressen kann unterschiedlich geregelt sein. Hierfür werden zwei Betriebsarten unterstützt, die prinzipiell auch gemischt nutzbar sind: logischer IO und physischer IO.at static and dynamic nests provide the EO for this, that the logical addresses (which are relative to the respective nest) be translated to physical addresses of transient blocks of data. The responsibility for the Management of physical addresses can be regulated differently. Therefor Two modes are supported, which are mixed in principle usable: logical IO and physical IO.

Beim logischen IO geschieht die Verwaltung (Platzreservierung und -Freigabe) der transienten Datenblöcke im physischen Hauptspeicher durch die Operation get, während beim physischen IO dafür der Aufrufer selbst verantwortlich ist. Physischer IO sollte Idealerweise nur auf den unteren Schichten von Gerätetreibern benutzt werden, das restliche System benutzt normalerweise logischen IO. Die Unterschiede zwischen beiden Betriebsarten sind gering und werden lediglich durch eine unterschiedliche Parameter-Versorgung von get ausgedrückt.At the logical IO happens the administration (seat reservation and release) the transient data blocks in physical memory through the operation get while while physical IO for that the caller himself is responsible. Physical IO should ideally only be used on the lower layers of device drivers, the rest of the system usually uses logical IO. The differences between both modes are low and are only by expressed a different parameter supply of get.

Die Elementaroperationen wickeln zusammen nicht nur sämtlichen asynchronen IO ab, sondern erlauben auch den transparenten Einsatz eines Buffer-Cache ohne Änderung der Schnittstelle. Wie wir später sehen werden, führen sie auch die Speicherverwaltungs-Funktionalität des Systems durch, sogar diejenige des Paging von virtuellen Benutzer-Speicherseiten. Aus der folgenden Beschreibung des asynchronen IO-Modelles ergibt sich die Realisierung von synchronem IO und Nonblocking-IO auf triviale Weise, so dass ich mir deren Ausführung sparen werde.The Elementary operations not only wrap all together Asynchronous IO, but also allow the transparent use a buffer cache without change the interface. As we will later see, lead They also go through the memory management functionality of the system, even that of paging virtual user memory pages. Out The following description of the asynchronous IO model results the realization of synchronous IO and nonblocking IO on trivial Way, so I will save their execution.

7 enthält eine Übersicht über die Elementarooperationen auf statischen Nestern: Wie zu sehen ist, werden die Elementaroperationen immer paarweise mit einer entgegengesetzten oder aufhebenden Operation kombiniert. Verschiedene Arten von IO oder sonstige Zugriffs-Arten auf Nester ergeben sich durch ein Schichtenmodell, das hier kurz von innen nach außen skizziert werden soll:
Im einfachsten Fall wird physischer IO durch die Operation transfer betrieben. Die Funktionalität synchronenen IOs entsteht durch anschließendes Warten auf die Beendigung mittels wait. Bei asynchronem IO kann auch auf den Aufruf von wait verzichtet werden. Bei logischem IO wird die Abbildung von logischen auf physische Adressen von der Operation get übernommen. Durch den paarweisen Aufruf von put wird die Ressourcen-Verwaltung auf ähnliche Weise wie bei einem konventionellen Buffer-Cache gelöst (interne Verwendung von Referenzzählern). Damit ein Ausgang eines Bausteins mit mehreren Eingängen anderer Bausteine parallel verdrahtet werden darf (multiuser-Kompetenz), wird der wechselseitige Ausschluss (vgl. [Lag78]) bei parallelem Zugriff durch die Operationen lock und unlock bereit gestellt. Zur Nachbildung von Pipes u.ä. sowie zur Speicherverwaltung existieren weitere Elementaroperationen get address und put_address, mit denen das Problem der atomaren Reservierung von Adressbereichen insbesondere im Falle mehrerer paralleler Zugreifer lösbar ist.
7 gives an overview of the elementary operations on static nests: As can be seen, the elementary operations are always pairwise combined with an opposite or nullifying operation. Different types of IO or other types of access to nests arise through a layer model, which is briefly outlined here from inside to outside:
In the simplest case, physical IO is operated by the operation transfer. The functionality of synchronous IOs is created by waiting for termination via wait. With asynchronous IO, the call to wait can also be dispensed with. With logical IO, the mapping from logical to physical addresses is taken over by the operation get. The pairwise call to put solves the resource management in a similar way to a conventional buffer cache (internal use of reference counters). In order for an output of a block to be wired in parallel with several inputs of other blocks (multiuser competence), the mutual exclusion (see [Lag78]) is provided in the case of parallel access by the lock and unlock operations. For the reproduction of pipes and the like as well as for memory management, there are further elementary operations get address and put_address with which the problem of the atomic reservation of address ranges can be solved, in particular in the case of several parallel accessors.

3.3.1 transfer3.3.1 transfer

Diese Elementaroperation sorgt dafür, dass eine Aktualisierungs-Operation in eine der beiden möglichen Richtungen zwischen logischer Adresse im Nest und physischem Datenblock beauftragt wird (ohne auf die Ausführung dieser Operation zu warten). Eine derartige Aktualisierungs-Operation wird synonym IO-Operation oder IO-Aufrrag genannt; anstelle des Begriffs IO-Operations-Ausführung wird synonym auch der Begriff Beendigung des IO-Auftrags verwendet. Verschiedene IO-Aufträge sind prinzipiell voneinander unabhängig. Die Schnittstelle sieht folgendermaßen aus:

Figure 00260001
This elementary operation causes an update operation to be ordered in one of the two possible directions between the logical address in the nest and the physical data block (without waiting for execution of this operation). Such an update operation is called synonymous IO-operation or IO-Aufrrag; Instead of the term IO operation execution, the term termination of the IO job is also used synonymously. Different IO jobs are basically independent of each other. The interface looks like this:
Figure 00260001

Der Parameter direction kann einen der folgenden Werte annehmen:
read Die Aktualisierung erfolgt von der logischen Adresse im Nest in Richtung zum physischen Datenblock. Nach erfolgreicher Beendigung des IO-Auftrages wird zugesichert, dass sich die neueste Version an der physischen Adresse befindet.
write Die Aktualisierung erfolgt in Richtung von der physischen Datenblock-Adresse an die logische Adresse auf dem Hintergrund-Medium. Mit Durchführung des IO-Auftrages entsteht eine geänderte neueste Version des Nest-Zustandes.
stop Ein eventuell bereits wartender IO-Auftrag wird wieder aus der Warteschlange der wartenden Aufträge entfernt, sofern dies möglich ist; bei bereits in Ausführung befindlichen IO-Aufträgen ist dies im Regelfall nicht mehr möglich. Die Folge ist, dass die von den anderen direction-Arten gegebenen Zusicherungen nicht mehr eingehalten werden müssen. Falls ein read-Auftrag abgebrochen wurde, steht anschließend max_version auf undefined.
The direction parameter can take one of the following values:
read Updated from the logical address in the nest to the physical data block. Upon successful completion of the IO job, it is assured that the latest version is at the physical address.
write The update takes place in the direction from the physical data block address to the logical address on the background medium. When the IO job is executed, an amended latest version of the nest state is created.
stop A possibly already waiting IO job is removed from the queue of waiting jobs, if possible; This is usually no longer possible with IO jobs already running. The consequence is that the assurances given by the other direction types no longer have to be respected. If a read job was aborted, then max_version is undefined.

Der IO-Auftrag erfolgt mit der Prioritätsangabe io_prio, die in Abschnitt 2.8.3 ausführlicher erklärt wird. Im Regelfall werden Aufträge mit einer höheren IO-Priorität vor solchen mit geringerer Priorität ausgeführt; Ausnahmen sind möglich, wenn dadurch der Gesamtdurchsatz des IO-Systems gesteigert wird. Der Parameter depend erlaubt die Spezifikation einer Halbordnung zwischen IO-Aufträgen, was insbesondere zur Implementierung absturzsicherer atomarer Operationen bzw. Transaktionen benötigt wird. Es wird eine Liste derjenigen logischen Adressen angegeben, deren zugehörige IO-Aufträge (sofern sie existieren) auf jeden Fall beendet sein müssen, bevor der aktuelle IO-Auftrag ausgeführt (physikalisch gestartet) werden darf.Of the IO job takes place with the io_prio priority specified in section 2.8.3 in more detail explained becomes. As a rule, orders with a higher one IO priority before those with lower priority; Exceptions are possible if this increases the overall throughput of the IO system. Of the Parameter depend allows the specification of a partial order between IO jobs especially for the implementation of crash-proof atomic operations or transactions needed becomes. A list of those logical addresses is given, their associated IO jobs (if they exist) definitely have to be finished before the current IO job is executed (physically started) may be.

Falls transfer auf einen bereits vorhandenen IO-Auftrag trifft, sollte ein doppelter Eintrag von gleichlautenden Aufträgen vermieden werden; statt dessen wird lediglich ein intern zugeordneter Referenzzähler erhöht (dieser muss erst ab multiuser-Kompetenz vorhanden sein): Dadurch wird eine Überflutung des IO-Systems durch unnötige IO-Aufträge selbst bei massenhaftem Einsatz von Background-IO (vgl. Abschnitt 2.8.3) verhindert. Ggf. wird die IO-Priorität eines bereits wartenden Auftrages auf das neue Niveau erhöht, so dass in Zukunft mit einer zügigeren Bearbeitung zu rechnen sein wird.If transfer to an existing IO job should a double entry of identical orders should be avoided; instead of of which only an internally assigned reference counter is increased (this must first be available from multiuser competence): This is a flooding of the IO system by unnecessary IO jobs even with mass use of background IO (see section 2.8.3) prevented. Possibly. becomes the IO priority of an already waiting job raised to the new level, so that in the future with a more timely Processing will be expected.

Im boolschen Ergebnis-Parameter success wird zurückgemeldet, ob ein erfolgreiches Erzeugen des IO-Auftrages möglich war.in the boolean result parameter success is returned if a successful Generating the IO job possible was.

3.3.2 wait3.3.2 wait

Diese Elementaroperation implementiert mittelfristiges Warten. Die Schnittstelle sieht folgendermaßen aus:

Figure 00270001
This elementary operation implements medium term maintenance. The interface looks like this:
Figure 00270001

Falls der boolesche Parameter pause gesetzt wurde und (noch) ein IO-Auftrag existiert, der noch nicht ausgeführt (physikalisch beendet) wurde, wird auf die Beendigung gewartet. Der boolesche Parameter keep legt fest, ob der interne Referenzzähler eines vorhandenen Auftrages (selbst nach erfolgreicher Beendigung) belassen werden oder dekrementiert werden soll; beim Belassen ist eine Statusabfrage durch nachfolgende wait-Operationen derselben Aufrufer-Instanz weiterhin möglich. Durch entsprechende Kombinationen der pause- und keep-Parameter ist Polling möglich. Aufträge, deren Referenzzähler zu 0 geworden ist, dürfen bzw sollen entfernt werden.If the Boolean parameter pause was set and (still) an IO request does not exist yet (physically terminated) is waited for the termination. The Boolean parameter keep determines whether the internal reference counter of a existing order (even after successful completion) be or should be decremented; when leaving is a status query by subsequent wait operations of the same caller instance possible. By appropriate combinations of pause and keep parameters Polling is possible. Assignments, their reference counter to 0 may or should be removed.

Die Ergebnis-Parameter min_version und max_version melden die Aktualität nach der folgenden Systematik:
undefined Der Inhalt des Datenblocks an der zurückgelieferten physischen Adresse ist undefiniert.
newest Die Nest-Implementierung sichert zu, dass die neueste Version des Nest-Zustandes im Datenblock ausgeliefert wurde, die zum Zeitpunkt der Operations-Ausführung gültig war. Sofern keine Sperrmechanismen die Ausführung weiterer Operationen verhindern, wird nicht garantiert, dass in der Zwischenzeit zwischen der Operations-Ausführung und der Inspektion durch die Aufrufer-Instanz keine weiteren Operations-Ausführungen stattgefunden haben, die den Nest-Zustand inzwischen verändert haben.
The result parameters min_version and max_version report the actuality according to the following classification:
undefined The content of the data block at the returned physical address is undefined.
newest The Nest implementation assures that the latest version of the Nest state was delivered in the data block that was valid at the time the operation was executed. Unless blocking mechanisms prevent the execution of further operations, there is no guarantee that in the meantime between Operation execution and the inspection by the caller instance no further operations executions have taken place, which have changed the nest state in the meantime.

Zwischen diesen Werten gilt die Relation undefined < newest. Weiterhin gilt min_version ≤ max_version. Der Wert von min_version bedeutet, dass sich die Nest-Implementierung dessen sicher ist, dass der Datenblock mindestens die angegebene Aktualität besitzt. Umgekehrt bedeutet max_version, dass die Nest-Implementierung sicher ist, dass die Version den angegebenen Aktualitätsgrad nicht überschreitet. Wenn die Nest-Implementierung beispielsweise überhaupt nichts über die Aktualität weiß, dann ist min_version = undefined und max_version = newest. Nur wenn min_version = max_version = newest gilt, ist der Datenblock aktuell. Aus min_version = max_version = undefined kann gefolgert werden, dass entweder kein IO-Auftrag (mehr) vorhanden ist, oder dass sein Effekt durch transfer im stop-Modus wieder aufgehoben wurde, oder dass die transfer-Operation technisch nicht erfolgreich war (Schreib- oder Lesefehler).Between These values are based on the relation undefined <newest. Furthermore, min_version ≤ max_version applies. The value of min_version means that the nest implementation of which it is certain that the data block is at least the specified one topicality has. Conversely, max_version means that the nest implementation It is certain that the version does not exceed the specified actuality level. For example, if the nest implementation does not do anything about the topicality White, then min_version = undefined and max_version = newest. Only if min_version = max_version = newest, the data block is up to date. From min_version = max_version = undefined it can be concluded that either no IO job (anymore) exists, or that its Effect has been canceled by transfer in stop mode, or that the transfer operation was technically unsuccessful (write or reading errors).

3.3.3 get3.3.3 get

Ein Buffer-Cache verwaltet eine transiente interne Zuordnung zwischen logischen und physischen Adressen. Diese Zuordnung ist transient, d.h. sie gilt längstens für den Zeitraum, in dem das Betriebssystem läuft, und kann wieder aufgelöst werden, sobald keine dynamischen Referenzen mehr auf den physischen Datenblock bestehen. Trotzdem sollte die Zuordnung nach Möglichkeit längere Zeit bestehen, als der Aufrufer unbedingt verlangt. Ohne die Möglichkeit zur Aufbewahrung einer zeitlich länger dauernden Zuordnung zwischen logischen und physischen Adressen wäre eine Caching-Funktionalität nicht oder nur schlecht erfüllbar.One Buffer cache manages a transient internal mapping between logical and physical addresses. This assignment is transient, i.e. It is valid for the longest for the Period in which the operating system is running, and can be resolved again, as soon as there are no more dynamic references to the physical data block consist. Nevertheless, the assignment should possibly exist for a longer time than the Caller necessarily required. Without the possibility of storage one time longer permanent association between logical and physical addresses would be one Caching functionality not or only difficult to fulfill.

Die Elementaroperation get verwaltet daher eine transiente interne Zuordnung zwischen logischen und physischen Adressen. Die Schnittstelle umfasst folgende Parameter:

Figure 00280001
The elementary operation get therefore manages a transient internal mapping between logical and physical addresses. The interface includes the following parameters:
Figure 00280001

Die übergebenen Adressen müssen zur erfolgreichen Durchführung durch transfer_size teilbar sein, die Länge muss ebenfalls ein Vielfaches davon darstellen. Als Ergebnis wird die physische Adresse zurückgeliefert, sofern die Operation erfolgreich war, ansonsten eine NULL-Adresse. Die zurückgelieferte Länge darf kürzer als die angeforderte Länge sein (beispielsweise wenn das unterliegende IO-System keine Transfers mit der gewünschten Länge am Stück ausführen kann), sie muss aber durch transfer_size teilbar sein.The handed over Addresses need for successful implementation be divisible by transfer_size, the length must also be a multiple represent it. As a result, the physical address is returned, if the operation was successful, otherwise a NULL address. The returned Length may be shorter than the requested length (for example, if the underlying IO system has no transfers with the desired Length at Can perform piece), but it must be divisible by transfer_size.

Die Nest-Instanz sucht auf atomare Weise in ihren internen Zuordnungs-Strukturen (z.B. schnelle Hash-Tabellen), ob bereits eine Zuordnung mit einem physischen Datenblock an der gewünschten logischen Adresse besteht. Falls ja, dann wird diese Adresse und die ggf. gekürzte Länge zurückgeliefert.The Nest Instance searches atomically for its internal allocation structures (for example, fast hash tables), whether already assigned to a physical data block at the desired logical address exists. If so, then this address and the possibly shortened Length returned.

Falls noch keine Zuordnung besteht, wird Platz für einen neuen zusammenhängenden Datenblock der Länge len allokiert, oder falls dies nicht möglich ist, ein möglichst großer Datenblock bis zur Länge len (in Vielfachen von transfer_size). Schließlich werden die Adresse und Länge in die Zuordnungs-Strukturen eingetragen und zurückgeliefert. Die Ergebnis-Parameter min_version und max_version sind wie bei wait definiert.If there is no room for a new coherent one Data block of length len or, if this is not possible, as far as possible greater Data block up to the length len (in multiples of transfer_size). Finally, the address and Length in the assignment structures are entered and returned. The result parameters min_version and max_version are defined as in wait.

Physische Adressen von Datenblöcken stellen Aliase dar, die ab multiuser-Kompetenz von mehreren Aufrufern gemeinsam benutzt werden können. Es wird allerdings nicht garantiert48, dass verschiedene Aufrufer-Instanzen beim get an der gleichen logischen Adresse dieselbe physische Adresse zurück erhalten49. Die Benutzung physischer Adressen geschieht durch Maschinenbefehle, die von den Operationen der Nest-Implementierung unabhängig sind und wegen der Aliase prinzipiell zu einer Interferenz führen können, wenn nicht bestimmte Regeln eingehalten werden. Das Reglement sieht folgendermaßen aus:
Jedem zurückgelieferten physischen Datenblock ist ab multiuser-Kompetenz ein Referenzzähler zugeordnet, der die Anzahl der auf ihn existierenden Referenzen verwaltet. Ein Aufruf von get, der einen bereits vorhandenen Datenblock auffindet, inkrementiert diesen Referenzzähler. Falls ein neuer Datenblock allokiert wurde, dann steht der Referenzzähler regelmäßig auf 1. Die logische Freigabe des physischen Datenblocks erfolgt durch die später beschriebene Operation put, die den Referenzzähler wieder dekrementiert und daher immer paarweise zu get aufgerufen werden muss (gleiche Anzahl von Aufrufen). Der mandate-Parameter wird erst ab dem multiversion-Modell benötigt (siehe Kapitel 7).
Physical addresses of data blocks represent aliases that can be shared by multiple callers as of multiuser competence. However, it is not guaranteed 48 that different caller instances will get the same physical address back at the same logical address 49 . The use of physical addresses is done by machine instructions, which are independent of the operations of the nest implementation and can in principle lead to interference due to the aliases, if certain rules are not observed. The rules are as follows:
Each returned physical data block is assigned a reference counter from multiuser competence, which manages the number of references existing on it. A call to get, which finds an existing data block, increments this reference counter. If a new data block has been allocated, the reference counter is regularly at 1. The physical data block is logically released by the later-described operation put, which decrements the reference counter again and must therefore always be called pairwise (equal number of calls). The mandate parameter is only needed from the multiversion model (see chapter 7).

Der boolsche Parameter mode gibt an, ob der Aufrufer den Datenblock anschließend zu Schreibzwecken benutzen darf. Bei einigen Implementierungs-Paradigmen (vgl. Abschnitt 2.7) wird diese Information genutzt, um Verstöße gegen das Reglement zu erkennen und ggf. zu sanktionieren. Ab multiuser-Kompetenz wird durch einen weiteren internen Referenzzähler gemerkt, wieviele Aufrufer den mode-Parameter gesetzt hatten.The boolean parameter mode specifies whether the caller may then use the data block for write purposes. Some implementation paradigms (see Section 2.7) use this information to detect and sanction violations of the regulations. From multiuser competence is noted by another internal reference counter, how many callers had set the mode parameter.

Falls mehrere Aufrufer den mode-Parameter gesetzt haben, dürfen diese prinzipiell unabhängig voneinander eigene Änderungsoperationen auf dem physischen Datenblock ausführen, was zu Interferenzen führen kann50, wenn sie keine weiteren Maßnahmen ergreifen (z.B. durch Setzen von Locks51).If several callers have set the mode parameter, they can in principle execute their own modification operations on the physical data block independently of one another, which can lead to interference 50 if they do not take further action (eg by setting Locks 51 ).

3.3.4 put3.3.4 put

Diese Operation dekrementiert den internen Referenzzähler, der jedem physischen Datenblock zugeordnet wird, auf atomare Weise. Die Schnittstelle lautet:
put(nest,mandate,phys_addr,mode)
This operation atomically decrements the internal reference counter associated with each physical data block. The interface is:
put (nest, mandate, phys_addr, mode)

Falls der Referenzzähler durch diese Operation zu 0 wird, dann darf die ursprünglich durch get hergestellte Zuordnung zwischen logischen und physischen Adressen wieder auf atomare Weise aufgelöst werden und der Speicherplatz für den Datenblock freigegeben werden. Dies soll jedoch möglichst nur bei Speichermangel geschehen. Nach dem letzten put haben Zugriffe auf die physische Adresse keine Bedeutung mehr für die Aufrufer-Instanz.If the reference counter by this operation becomes 0, then may originally by get mapped between logical and physical addresses again resolved in an atomic way and the storage space for the data block are released. However, this should be possible only happen when there is no memory. After the last put have requests to the physical address no longer relevant to the caller instance.

Falls irgendeine Instanz Zugriffe auf eine physische Adresse macht, die keine Bedeutung (mehr) für sie hat, dann gilt dies als Fehler. Falls Fehler nicht abgefangen und verhindert werden konnten (vgl. Abschnitt 2.7), dann kann sich als Folge daraus das gesamte System in einem undefinierten Zustand befinden. Jegliche Instanzen haben daher die Pflicht, Fehler zu vermeiden.If any instance makes accesses to a physical address that no meaning (anymore) for her has, then this is considered a mistake. If errors are not intercepted and could be prevented (see Section 2.7), then can be considered As a result, the entire system is in an undefined state. All instances therefore have a duty to avoid mistakes.

Durch den Parameter mode wird der interne Referenzzähler für die Anzahl der Schreiber verwaltet; Aufrufer haben die Pflicht, diesen Parameter paarweise übereinstimmend zum mode-Parameter von get zu verwenden (Zuwiderhandlungen gelten als Fehler).By the parameter mode becomes the internal reference counter for the number of recorders managed; Callers have a duty to match this parameter in pairs to use get's mode parameter (violations apply as a mistake).

3.3.5 lock und unlock3.3.5 lock and unlock

Sperren bewirken, dass die möglichen Ausführungs-Folgen von Operationen eingeschränkt werden. Die in unserem Modell verwendeten Sperren wirken nicht nur gegenüber anderen Sperren, sondern auch gegenüber einigen52 anderen Elementaroperationen. Implementierungen von Bausteinen müssen für die Realisierung irgendwelcher Korrektheits-Begriffe grundsätzlich selbst Sorge tragen, indem sie die möglichen Ausführungsfolgen einer Nest-Instanz mit den zulässigen Ausführungsfolgen ihres jeweiligen Korrektheits-Begriffes verträglich machen. Dies belastet zwar die Baustein-Implementierungen mit der Pflicht, für diese Verträglichkeit selbst zu sorgen, ermöglicht dafür jedoch wesentlich flexiblere Korrektheits-Modelle. Ist eine Sperre erst einmal erfolgreich gesetzt worden, dann garantiert die jeweils beauftragte Ausführungs-Instanz (Nest-Implementierung) ihre Einhaltung gegenüber der Aufrufer-Instanz. Die hier vorgeschlagenen Sperren sollen neben der Grundfunktionalität eines Betriebssystems auch wichtige Bereiche der Funktionalität von Datenbanken und Transaktionen (siehe z.B. [Dat95, EN95]) abdecken. Das hier vorgestellte Modell ist als Vorschlag zu verstehen, der an manchen Stellen verbessert werden kann (beispielsweise durch Einführung intentionaler Locking-Arten).Locks limit the possible execution sequences of operations. The locks used in our model not only work against other locks, but also against some 52 other elemental operations. In principle, implementations of building blocks must take care of the realization of any correctness terms themselves by making the possible execution sequences of a nest instance compatible with the permissible execution sequences of their respective correctness term. Although this burdens the module implementations with the obligation to provide for this compatibility itself, but allows for much more flexible correctness models. Once a lock has been successfully set, the respective execution instance (nest implementation) guarantees its compliance with the caller instance. In addition to the basic functionality of an operating system, the locks proposed here should also cover important areas of the functionality of databases and transactions (see eg [Dat95, EN95]). The model presented here should be understood as a suggestion that can be improved in some places (for example by introducing intentional locking types).

Die Elementaroperationen lock und unlock sperren bzw entsperren Bereiche des logischen Adressraums gegenüber anderen Aufrufer-Instanzen der lock-Operation bzw. gegenüber anderen Mandats-Inhabern und gegenüber get; gehaltene Sperren gelten grundsätzlich als der aufrufenden Instanz bzw den in Abschnitt 2.7 beschriebenen Mandaten zugeordnet. Die gesperrten Bereiche müssen nicht notwendigerweise im Definitionsbereich von dynamischen Nestern aktuell vorkommen („Phantom-Locks"); es findet also keine Synchronisation auf Daten-Objekten statt, sondern eine auf logischen Adressbereichen. lock-Operationen, die auf gegenseitig nicht überlappenden Adressbereichen ausgeführt werden, sind voneinander unabhängig und kommutieren miteinander. Locks sind nicht rekursiv, sondern akkumulierend innerhalb derselben Lock-Art. Es schadet nicht, wenn bereits erhaltene Lock-Bereiche von derselben Instanz bzw unter dem gleichen Mandat nochmals angefordert werden, bewirkt aber auch nichts. Die Rückgabe mittels unlock braucht nicht den gleichen Adressbereich zu betreffen als der vorherige lock. Damit ist es möglich, einen ursprünglich am Stück liegenden gesperrten Bereich in kleinere Teilstücke mit zwischenliegenden freigegebenen Bereichen umzuwandeln. Umgekehrt darf ohne Schaden ein größerer Bereich mittels unlock freigegeben werden als vorher mittels lock gesperrt wurde; falls man z.B. unlock mit dem gesamten Adressraum als Parameter aufruft, dann werden sämtliche von der aufrufenden Instanz bzw dem Mandat gehaltenen Locks atomar auf einen Schlag freigegeben (strikter Zweiphasen-Commit). Die Parameter lauten:

Figure 00310001
The lock and unlock elementary operations lock or unlock areas of the logical address space from other caller instances of the lock operation or to other mandate owners and to get; held locks are always assigned as the calling entity or the mandates described in Section 2.7. The locked areas do not necessarily have to be present in the definition area of dynamic nests ("phantom locks"), so there is no synchronization on data objects, but one on logical address areas: lock operations that are executed on mutually non-overlapping address areas Locks are not recursive, but accumulating within the same lock-type. It does not hurt if lock-in areas already obtained are requested again from the same instance or under the same mandate, but it will not do anything The unlock does not need to have the same address range as the previous lock, which means that it is possible to turn a locked original area into smaller sections with intermediate shared areas, and conversely, unlock a larger area using unlock s was previously locked using lock; For example, if you call unlock with the entire address space as a parameter, all locks held by the calling instance or the mandate are released atomically at one go (strict two-phase commit). The parameters are:
Figure 00310001

Der Sperr-Adressbereich wird durch die Parameter log_address und len vorgegeben. Die Parameter try_address und try_len beschreiben einen Versuchs-Adressbereich, der einen Oberbereich des Sperr-Adressbereichs darstellen muss. Falls der Versuchs-Adressbereich echt größer als der Sperrbereich ist, dann braucht er von der Nest-Implementierung nur soweit im Ergebnis-Sperrbereich locked_address und locked_len berücksichtigt zu werden, wie dies ohne zusätzliches Warten möglich ist. Nähere Erklärungen für das damit mögliche spekulative Locking finden sich in Abschnitt 5.3. Der Ergebnis-Sperrbereich umfasst entweder mindestens den Sperr-Adressbereich (d.h. er liegt zwischen dem Sperr- und dem Versuchs-Bereich), oder er hat die Länge 0. Im letzteren Fall war ein Setzen des Locks nicht möglich (s.u.). Durch den Parameter kind werden neben den bekannten Arten Read-Lock und Write-Lock53 noch weiter verfeinerte Lock-Arten unterschieden. Er hat einen der folgenden Werte:
read Der Ergebnis-Sperrbereich ist anschließend vor Überschreiben der di-Komponente durch andere Aufrufer-Instanzen von lock und von get jeweils im write-Modus geschützt54.
write Der Ergebnis-Sperrbereich ist anschließend zum Überschreiben der di-Komponente für den Aufrufer exklusiv reserviert.
upgrade Wie write, jedoch wird ein bereits gesetzter Read-Lock zu einem Write-Lock atomar aufgewertet (sofern es möglich ist); dieser Modus wird bei einigen Transaktions-Modellen (insbesondere pessimistische Modelle) benötigt und sollte ausserhalb dieser Anwendung nur mit Vorsicht eingesetzt werden55.
fix Der Ergebnis-Sperrbereich ist anschliessend gegen Änderungen der ai-Komponente durch andere Aufrufer-Instanzen geschützt.
reorg Der Ergebnis-Sperrbereich ist anschliessend zum Ändern der ai-Komponente für den Aufrufer exklusiv reserviert.
The blocked address range is specified by the parameters log_address and len. The try_address and try_len parameters describe a trial address range that must represent an upper portion of the lock address range. If the trial address range is really larger than the blackout range, then the nest implementation only needs to take it into account in the result lockout area locked_address and locked_len, as is possible without additional waiting. Further explanations for the possible speculative locking can be found in Section 5.3. The result blocking area either comprises at least the blocking address range (ie it lies between the blocking and the trial range), or it has the length 0. In the latter case, it was not possible to set the lock (see below). The parameter kind distinguishes between the well-known types Read-Lock and Write-Lock 53 and further refined Lock types. It has one of the following values:
read The result-inhibited area is then protected against overwriting of the d i component by other caller instances of lock and get in write mode 54 .
write The result lock area is then reserved exclusively for the caller to override the d i component.
upgrade Like write, however, an already set read-lock is atomized to a write-lock (if possible); this mode is required on some transaction models (especially pessimistic models) and should be used with caution outside of this application 55 .
fix The result cut area is then protected against changes in a component i by other callers instances.
reorg The result lockup area is then reserved exclusively for changing a i component of the caller.

Die Arten fix und reorg entsprechen in ihrer Semantik den konventionellen Arten read und write, sie beziehen sich jedoch auf Modifikationen der Adressbereiche (z.B. durch move).The Types of fix and reorg correspond in their semantics to conventional ones Types read and write, but they refer to modifications the address ranges (e.g., by move).

Der Parameter action beschreibt, wie die lock-Operation mit dem gewünschten Lock umgehen soll. Er hat einen der folgenden Werte:
ask Es wird lediglich nachgesehen, ob das Setzen eines entsprechendes Locks ohne zu blockieren möglich gewesen wäre. Der zurückgelieferte Ergebnis-Sperrbereich kann an Wettrennen mit anderen Aufrufern von Lock teilnehmen und ist entsprechend vorsichtig zu behandeln.
try Der Lock wird atomar gesetzt, wenn es sofort ohne zu blockieren möglich ist. Ansonsten wird die Länge 0 zurückgeliefert.
wait Der Lock wird gesetzt, auch wenn dazu erst auf die Freigabe durch eine andere Instanz gewartet werden muss. Die Rücklieferung von locked_len = 0 ist trotzdem möglich, insbesondere wenn ein Deadlock vorliegt. Das Ergebnis muss daher in jedem Fall vom Aufrufer überprüft werden.
The action parameter describes how the lock operation should handle the desired lock. He has one of the following values:
ask It will only be checked if it would have been possible to set a corresponding lock without blocking. The returned result exclusion area may participate in races with other callers of Lock and should be treated accordingly with caution.
try The lock is set atomically if it is immediately possible without blocking. Otherwise, the length 0 is returned.
wait The lock is set, even if it only needs to wait for release by another instance. The return delivery of locked_len = 0 is still possible, especially if there is a deadlock. The result must therefore be checked by the caller in any case.

Die Einschränkung der möglichen Ausführungsfolgen hängt von den Kompetenzen der Nest-Implementierung ab. Bei singleuser brauchen keine Locks implementiert zu werden; multiversion wird in Kapitel 7 behandelt. Bei multiuser sieht die Kompatibilitätstabelleder Operationen wie in 8 dargestellt aus. Der erste Buchstabe der Überschrifts-Bezeichnung bezeichnet die Operation g = get oder l = lock. Der zweite Buchstabe bezeichnet die Lock-An r = read, w = write oder u = upgrade. Im Falle von get bezieht sich der zweite Buchstabe auf den mode-Parameter. Es sind die logischen Adress-Zuordnungen sämtlicher gehaltenen Datenblöcke in Betracht zu ziehen, die sich mit dem angeforderten lock-Bereich überschneiden.Limiting the possible execution sequences depends on the competencies of the Nest implementation. Singleuser does not need to implement locks; multiversion is covered in Chapter 7. For multiuser, the compatibility table looks like the operations in 8th shown off. The first letter of the header name denotes the operation g = get or l = lock. The second letter denotes the lock-on r = read, w = write or u = upgrade. In the case of get, the second letter refers to the mode parameter. Consider the logical address assignments of all held data blocks that overlap the requested lock range.

In der Tabelle bedeutet +, dass die Operation ohne zu warten durchläuft, wenn sie auf die jeweils andere stößt, und – bedeutet, dass gewartet werden muss, bis die andere Operation aufgehoben wurde (d.h. es findet eine Einschränkung der möglichen Ausführungsfolge statt). Das Zeichen * bedeutet, dass es davon abhängt, ob die andere Operation von der gleichen Aufrufer-Instanz initiiert wurde; falls ja, dann wird nicht gewartet (andernfalls würde ja sofort ein Deadlock entstehen); falls nein, dann muss gewartet werden. An denjenigen Stellen der Tabelle, wo ein – steht, darf die andere Operation, wenn sie von der aktuellen verschieden ist, nicht von der selben Aufrufer-Instanz ausgeführt worden sein, sondern nur von einer anderen56.In the table, + means that the operation goes through without waiting if it encounters the other one, and - means waiting for the other operation to be canceled (ie, a restriction on the possible execution sequence takes place). The * signifies that it depends on whether the other operation was initiated by the same caller instance; if so, then you do not wait (otherwise a deadlock would occur immediately); if not, then you have to wait. At those positions of the table where one stands, the other operation, if different from the current one, may not have been executed by the same caller instance, but only by another 56 .

Die Lock-Arten fix und reorg sollen gegen die Effekte der später beschriebenen adressmodifizierenden Operationen move, clear und delete schützen, daher sind diese in der Tabelle in 9 berücksichtigt. In der Überschrift bedeutet m = move oder clear oder delete (irgendeine adressmodifizierende Operation). Der Endbuchstabe f bedeutet fix, g bedeutet reorg. Wie man sieht, funktionieren die Adressänderungs-Sperren analog zu den klassischen Read-Write-Locks, nur beziehen sie sich ausschliesslich auf die ai-Komponenten der Zustände.The lock types fix and reorg are intended to protect against the effects of the address-modifying operations move, clear and delete described later, so these are given in the table in 9 considered. In the Heading means m = move or clear or delete (any address-modifying operation). The final letter f means fixed, g means reorg. As you can see, the address change locks work in a similar way to the classic read-write locks, except that they only refer to the a i components of the states.

Die Realisierung von lock und unlock ist intern so zu gestalten, dass auf eine Trennung in Spinlocks und Kontrollfluss wechselnde Locks verzichtet wird (vgl. [K+91, LA93]), und fernerhin eine Benutzung durch Unterbrechungen (interrupts) möglich ist (vgl. [KE95]).The implementation of lock and unlock must be designed internally in such a way that no locks are required for a separation into spinlocks and control flow (see [K + 91, LA93]), and furthermore a use through interrupts is possible (cf. [KE95]).

3.3.6 Freiwillige Selbstkontrolle des Verhaltens3.3.6 Voluntary self-control Of the behavior

Eine Nest-Implementierung garantiert durch die hier propagierten Lock-Mechanismen wettrenn-freies Verhalten und Schutz gegen Eingriffe anderer Instanzen, und zwar auch dann, wenn andere sich nicht an Locking-Konventionen halten. Diese Garantie nützt jedoch einer Aufrufer-Instanz mit multi*-Verhalten nur dann etwas, wenn sie die Locks auch tatsächlich benutzt – wer das „vergisst", der ist selbst an möglichen Folgen schuld. Bei einem komplexeren System sind jedoch Fehler, die von fehlenden oder falsch gesetzten Locks verursacht werden, extrem schwer reproduzierbar und zu finden. Jede Baustein-Implementierung sollte daher ihr Verhalten durch eine freiwillige Selbstkontrolle mittels der Tabelle in 10 prüfen. Hierbei bedeutet g = get und l = lock. Der letzte Buchstabe hat die gleiche Bedeutung wie bei den Kompatibilitäts-Tabellen. Die Zeilen bezeichnen die erste Operation, die Spalten die zweite Operation. Beide Operationen beziehen sich auf dieselbe Instanz, die sie aufrufen. Die Tabelle ist daher nicht symmetrisch wie die vorherigen Tabellen, sondern zeigt die Wichtigkeit der Reihenfolge der Operationen. In der Tabelle bedeutet !, daß die zweite Operation nur dann aufgerufen werden darf, wenn die erste bereits ausgeführt wurde (und noch nicht durch eine Gegenoperation aufgehoben wurde). Wenn in einer Spalte mehrere ! auftauchen, dann reicht es, wenn eine der ersten Operationen vorher ausgeführt wurde. Das Zeichen & bedeutet, dass die betreffende erste Operation zusätzlich ausgeführt worden sein muss, wobei eine der mit & markierten Operationen ausreichend ist. Das Zeichen ¬ bedeutet, dass die erste Operation auf gar keinen Fall vorher aufgerufen worden sein darf, bzw. dass sie inzwischen wieder aufgehoben worden sein muss.A Nest implementation guarantees lock-free behavior and protection against interventions by other instances, even if others do not comply with locking conventions. However, this guarantee only benefits a caller instance with multi * behaviors when it actually uses the locks - those who "forget" are themselves responsible for possible consequences, but in a more complex system there are errors that are missing or incorrectly set locks can be extremely difficult to reproduce and find. Therefore, each building block implementation should be self-controlled by means of the table in its behavior 10 check. Here g = get and l = lock. The last letter has the same meaning as the compatibility tables. The rows indicate the first operation, the columns the second operation. Both operations refer to the same instance that invokes them. The table is therefore not symmetrical as the previous tables, but shows the importance of the order of operations. In the table! Means that the second operation may only be called if the first one has already been executed (and has not yet been canceled by a counteroperation). If more than one! emerge, then it is enough, if one of the first operations was executed before. The & signifies that the first operation in question must have been executed additionally, one of the operations marked with & being sufficient. The sign ¬ means that the first operation may under no circumstances have been previously called, or that it must have been canceled in the meantime.

Obwohl diese Verhaltens-Selbstkontrolle freiwillig ist, wird sie de facto als Standard für das Verhalten aller Bausteine betrachtet; Ausnahmen sind z.B. zur Inspektion irgendwelcher Zustände oder zu Statistik-Zwecken zulässig, sollten aber begründet werden (z.B. damit, dass der betreffende Vorgang sowieso inhärent wettrenn-gefährdet ist). Die Selbstkontrolle kann z.B. durch interne Verwendung eines Prüf-Bausteins erfolgen, der alle Operations-Aufrufe mitliest und bei Verletzung der Tabelle Warnungen oder Fehlermeldungen ausgibt, ggf. auch zu härteren Sanktionen greift. Da die Information über gehaltene Locks auf jeden Fall in der Bearbeiter-Instanz der Locks geführt werden muss, bietet sich diese ebenfalls als Ort zur performanten Durchführung der an sie delegierten Kontrolle an. Falls die Aufgabenstellung extreme Anforderungen an die Performanz stellt, kann die Selbstkontrolle zu Lasten erhöhter Fehleranfälligkeit auch ausgeschaltet werden.Even though This behavioral self-control is voluntary, it becomes de facto as standard for considers the behavior of all building blocks; Exceptions are e.g. to Inspection of any conditions or permitted for statistical purposes, but should be justified (for example, that the process in question is inherently wet-endangered anyway). The self-control can e.g. through internal use of a test module done, which reads all operation calls and in case of injury the table outputs warnings or error messages, if necessary also tougher Sanctions applies. Because the information about Locks kept on each Case in the agent instance of the Locks must be led, offers itself these also as a place for the high-performance implementation of delegated to them Control. If the task is extremely demanding the performance provides, the self-control at the expense of increased error rate also be turned off.

3.3.7 get_maxlen und set_maxlen3.3.7 get_maxlen and set_maxlen

  • get_maxlen(nest) → lenget_maxlen (nest) → len
  • set_maxlen(nest,len) → successset_maxlen (nest, len) → success

Damit läßt sich die maximale Länge (maximale benutzbare Adresse plus 1) eines Nestes abfragen bzw. setzen. Bei einigen (eher selten vorkommenden) Geräten läßt sich diese Länge verändern (z.B. bei Bandlaufwerken durch Schreiben einer EOF-Marke oder dergleichen); bei den meisten Geräten liegt die Länge jedoch physikalisch fest.In order to let yourself the maximum length query (maximum usable address plus 1) of a nest or put. With some (rather rare) devices can be this length change (e.g., tape drives by writing an EOF mark or the like); on most devices lies the length however, physically.

Größere Bedeutung hat set_maxlen bei dynamischen Nestern, wobei sowohl Verkleinerungen als auch Vergrößerungen die Semantik von delete in den betroffenen Bereichen ergeben (siehe Abschnitt 3.4.3).Greater importance has set_maxlen in dynamic nests, where both reductions as well as enlargements give the semantics of delete in the affected areas (see Section 3.4.3).

3.3.8 Stream-IO, Pipes, Sockets und Speicherverwaltung3.3.8 Stream IO, pipes, Sockets and memory management

Die bisher beschriebenen Elementaroperationen lösen die Probleme des portionsweisen Zugriffs, des asynchronen IO über Speicherhierarchien hinweg, und der damit verbundenen Speicherverwaltung. Dies funktioniert jedoch nur dann, wenn die logischen Adressen bekannt sind, an denen IO geschehen soll. Bei rein sequentiellem IO, wie er z.B. bei sequentiellen Streams, Pipes oder Sockets auftritt, benutzen konventionelle Schnittstellen keine Adressen in der Schnittstelle.The Elementary operations described so far solve the problems of portionwise Access, asynchronous IO over Memory hierarchies, and the associated memory management. However, this only works if the logical addresses are known are where IO is supposed to happen. For purely sequential IO, like he e.g. occurs on sequential streams, pipes or sockets, conventional interfaces do not use addresses in the interface.

Nester lassen sich zur Nachbildung von Pipes und Sockets als Ringpuffer57 (mit durch get_maxlen beschriebener Länge) auszuführen. Logische Adressen werden in der Schnittstelle verwendet, die jedoch nicht vom Aufrufer, sondern von der Implementierungs-Instanz der Nest-Operationen vergeben und verwaltet werden. Damit werden weitere Nutzungsarten und Kombinationen möglich58, insbesondere der Lookahead auf noch nicht endgültig konsumierte Daten.Nests can be executed to simulate pipes and sockets as ring buffer 57 (with length described by get_maxlen). Logical addresses are used in the interface, but they are assigned and managed not by the caller but by the implementation instance of the nest operations. Thus, other uses and combinations are possible 58 , especially the lookahead on not yet finally consumed data.

Das Problem der Atomarität der Reservierung ist eine besondere Eigenschaft von Pipes, Sockets und regulären Dateien im Append-Modus. Parallele Write-Operationen stören sich nicht gegenseitig und überschreiben sich nicht, sondern führen letztlich stets zu irgendeiner serialisierten Folge von Schreiboperationen (auch wenn die konkrete Reihenfolge i.a. nicht determiniert ist). Ebenso ist beim parallelem Lesen aus Pipes und Sockets garantiert, dass ein und dieselben Daten bei irgendeinem der Leser genau einmal ankommen werden (auch wenn der konkrete Empfänger wiederum nicht determiniert ist). Auf Nester übertragen, bedeutet dies, dass keine Wettrennen zwischen verschiedenen Aufrufer-Instanzen (z.B. Prozessen) bei der Inspektion von Änderungen in der Addressabbildung stattfinden dürfen. Wenn man andererseits den Lookahead auf noch nicht endgültig konsumierte Daten ermöglichen will, dann muss man solche Wettrennen wiederum ermöglichen (es ist dann Aufgabe der Konsumenten, mit den damit verbundenen Effekten korrekt umzugehen).The Problem of atomicity The reservation is a special property of pipes, sockets and regular Files in append mode. Parallel write operations interfere not each other and overwrite not, but lead ultimately always to any serialized sequence of write operations (also if the specific order i.a. is not determined). As well when reading from pipes and sockets is guaranteed that one and the same data will arrive at one of the readers just once (even if the specific recipient again not determined). When transferred to nests, it means that no races between different caller instances (e.g. Processes) in the inspection of changes in the address mapping may take place. On the other hand, if you did not finally consume the lookahead Allow data wants, then you have to make such races again (It is then the task of the consumer, with the associated To handle effects correctly).

Zur Lösung der Atomarität des Reservierungs-Problems schlage ich vor, die Operatiorien get address und put_address einzuführen. Die Schnittstelle sieht folgendermaßen aus:

Figure 00340001
To solve the atomicity of the reservation problem, I propose to introduce the operators get address and put_address. The interface looks like this:
Figure 00340001

Die beiden Längen-Parameter kennzeichnen das Minimum und das Maximum eines Reservierungs-Wunsches. Der boolsche Parameter where gibt an, ob die Reservierung im bisher undefinierten Bereich der Adressabbildung stattfinden soll (Write-Funktionalität) oder im definierten Bereich (Read-Funktionalität). Falls action = wait ist und eine Reservierung der Minimallänge nicht möglich ist, blockiert der Aufruf so lange, bis zumindest die Minimal-Reservierung möglich ist (langfristiges Warten). Der boolsche Parameter lock bestimmt, ob mehrere Aufrufer parallel jeweils einen reservierten Adressbereich erhalten dürfen, oder ob weitere Bewerber bis zum nachfolgenden put_address warten müssen.The both length parameters indicate the minimum and the maximum of a reservation request. The boolean parameter where indicates whether the reservation is currently Undefined range of address mapping should take place (write functionality) or in the defined area (read functionality). If action = wait and reservation of the minimum length is not possible, the call blocks until at least the minimum reservation is possible (long-term waiting). The Boolean parameter lock determines whether several callers in parallel each have a reserved address range allowed to receive or if more applicants wait until the next put_address have to.

Als Ergebnis wird die Adresse des nunmehr reservierten Bereiches zurückgeliefert sowie seine tatsächliche Länge, die zwischen der Minimal- und Maximal-Anforderung liegen kann (in Vielfachen der transfer_size); bei Fehlschlagen wird 0 zurückgeliefert. Die Nest-Implementierung sichert jeder Aufrufer-Instanz die Atomarität der Reservierung zu, indem parallele Aufrufe von get_address in jedem Falle disjunkte Adressbereiche ausliefern. Der Aufrufer besitzt anschließend Kenntnis über einen nur für ihn exklusiv reservierten Adressbereich, mit deren Hilfe er Datenblöcke lesen oder schreiben, und/oder Änderungen an der Addressabbildung mittels clear oder delete (siehe Abschnitte 3:4.2 ff.) ausführen kann59.
put_address(nest,len)
As a result, the address of the now reserved area is returned and its actual length, which may be between the minimum and maximum requirements (in multiples of the transfer_size); 0 will be returned if failed. The Nest implementation assures atomicity of the reservation to each caller instance by always dispatching disjoint address ranges in parallel calls to get_address. The caller then has knowledge of an exclusively reserved for him address range, with the help of which he can read or write blocks of data, and / or make changes to the address mapping using clear or delete (see sections 3: 4.2 ff.) 59 .
put_address (nest, len)

Hebt die Reservierung wieder auf. Jeder Aufrufer von get_address hat die Pflicht, einen einmal erhaltenen Adressbereich irgendwann wieder mittels put_address freizugeben; der Zeitpunkt und die Reihenfolge bleibt dabei prinzipiell offen.lifts the reservation back on. Every caller of get_address has the duty, once a received address range again release using put_address; the timing and the order remains basically open.

Die Standard-Pipe-Funktionalität wird durch folgenden Ablauf erzielt:
Leser: der Aufrufer führt als erstes get_address aus, dann get im erhaltenen Adressbereich; falls die Aktualität der Daten noch nicht gegeben sein sollte, folgt transfer im read-Modus und wait. Nach der Verarbeitung der Daten folgen delete, put und put_address.
Schreiber: der Aufrufer führt als erstes get_address, dann clear und get aus. Nach der Ablage der Daten folgen transfer imwrite-Modus, put und put_address.
The standard pipe functionality is achieved by the following procedure:
Reader: the caller first executes get_address, then get in the received address range; if the actuality of the data is not yet available, transfer follows in read mode and wait. After processing the data, delete, put and put_address follow.
Schreiber: the caller first executes get_address, then clear and get. After filing the data will follow transfer imwrite mode, put and put_address.

Falls ein Schreiber oder Leser die Daten nicht endgültig konsumieren oder bereitstellen will, kann er auf delete bzw clear auch verzichten, bzw. die jeweilige Adressraum-Operation durch eine Kompensations-Operation vor dem put_address wieder aufheben. Ob und wie viele Daten tatsächlich konsumiert oder bereitgestellt wurden, wird ausschließlich durch Änderungs-Operationen des Definitionsbereiches angezeigt, die von der Reservierung auch nach unten abweichen dürfen. Der Standard-Fall einer vollen Ausnutzung sollte sich durch das Konzept der systematischen Rekombination von Elementaroperationen (vgl. Abschnitt 2.4) effizient lösen lassen.If a writer or reader does not consume or provide the data for good If he wants, he can do without delete or clear, respectively Address space operation by a compensation operation before pick_address pick up again. Whether and how much data is actually consumed or are provided by change operations only of the definition area indicated by the reservation as well may deviate downwards. The standard case of a full exploit should be through the Concept of systematic recombination of elementary operations efficiently (see section 2.4) to let.

Wenn der Parameter lock nicht gesetzt ist, dann kann die tatsächliche Belegung des Adressraums durch clear bzw die Freigabe durch delete auch in einer anderen Reihenfolge stattfinden, als die Reihenfolge der Adress-Reservierung vorgab. Es kann sogar passieren, dass gar kein lückenlos zusammenhängender definierter Adressbereich entsteht, wenn einige der Aufrufer nach get_address auf die entsprechende Manipulation des Adressraums verzichten oder sie wieder rückgängig machen. Dadurch geht u.U. die Reihenfolge-Beziehung der Datenpakete verloren, die bei der Pipe-Funktionalität notwendig ist, anderen Anwendungen aber die Möglichkeit einer out-of-order-Behandlung bietet60. Wenn man die transfer-Operationen weglässt, erhält man eine nichtpersistente Semantik. Damit kann man die Funktionalität eines Speicher-Heaps nachbilden. Daher eignet sich diese Schnittstelle auch für jegliche Speicherverwaltung, sogar für interne Objekte fester Größe61.If the parameter lock is not set, the actual assignment of the address space by clear or the clearance by delete can also take place in a different order than the order of the address reservation specified. It can even happen that no completely contiguous defined address range arises if some of the callers for get_address forego or reverse the corresponding manipulation of the address space. This may result in losing the ordering relationship of the data packets, which is necessary in pipe functionality, but offers the possibility of out-of-order treatment for other applications 60 . Leaving out the transfer operations gives you non-persistent semantics. This can be used to emulate the functionality of a memory heap. Therefore, this interface is also suitable for any memory management, even for fixed size internal objects 61 .

3.4 Elementaroperationen auf dynamischen Nestern3.4 Elementary Operations on dynamic nests

Dynamische Nester enthalten alle Operationen eines statischen Nestes sowie zusätzlich die folgenden adressmodifizierenden Operationen. Sie haben mit der Lückenhaftigkeit des Definitionsbereich der Speicherabbildung und mit der Verschiebeoperation zu tun.dynamic Nests contain all the operations of a static nest as well additionally the following address-modifying operations. You have with the scrappiness the domain of the memory map and with the shift operation to do.

Falls versucht wird, auf Löchern im Definitionsbereich eines Nestes zu lesen oder zu schreiben, werden Fehlercodes zurückgeliefert. Dies unterscheidet Nester von der Semantik von Sparse Files unter Unix. Falls letztere Semantik gewünscht wird, ist diese relativ einfach durch einen entsprechenden Anpassungsbaustein implementierbar.If is trying on holes to read or write in the domain of a nest Error codes returned. This distinguishes nests from the semantics of sparse files below Unix. If the latter semantics is desired, this is relative easily implementable by an appropriate adaptation module.

3.4.1 get_map3.4.1 get_map

Diese Operation liefert Informationen über die definierten Bereiche eines dynamischen Nestes. Konzeptionell ist dies eine Liste von Paaren, wobei jedes Paar die logische Startadresse eines definierten Bereichs und seine Länge repräsentiert. Repräsentiert wird diese Liste durch ein Array von Paaren, das nach den Startadressen aufsteigend sortiert gehalten wird. Zur effizienten Suche nach Adressen kann daher beispielsweise binäre Suche verwendet werden.These Operation provides information about the defined areas of a dynamic nest. conceptional this is a list of pairs, where each pair is the logical start address of a defined area and its length. represents This list is preceded by an array of pairs, following the starting addresses sorted in ascending order. For the efficient search for addresses can therefore, for example, binary Search to be used.

Da ein solches Array in Extremfällen sehr lang werden kann, wird es von get_map nicht direkt zurück geliefert, sondern statt dessen wird ein Verweis auf eine weitere Nest-Instanz zurück geliefert, die dieses Array enthält, und von der nur gelesen werden darf.
get_map(nest) → nest
Because such an array can become very long in extreme cases, get_map does not return it directly, but instead returns a reference to another Nest instance that contains that array and is read-only.
get_map (nest) → nest

Die von get_map zurückgelieferte Nest-Instanz wird adjungiertes Nest genannt. Sie enthält den Definitionsbereich des Original-Nestes in der oben beschriebenen Repräsentation. Adjungierte Nester haben ihrerseits auf jeden Fall keine Löcher, d.h. ihr adjungiertes Nest hat nur noch eine triviale Struktur mit einem einzigen Eintrag62 The nest instance returned by get_map is called an adjoint nest. It contains the domain of definition of the original nest in the representation described above. Adjacent nests, in turn, have no holes, ie their adjoint nest has only one trivial structure with a single entry 62

Diese Lösung hat den Vorteil, dass die interne Verwaltung des Definitionsbereiches durch lokale Baustein-Instanzen geschehen kann, die das adjungierte Nest direkt verwalten. Erweiterungen und Löschungen im Definitionsbereich lassen sich in diesem Fall direkt durch move-Operationen auf dem adjungierten Nest realisieren. Ansonsten dürfen Implementierungen von Nestern ihren Definitionsbereich auch auf beliebige andere Weise intern realisieren, sofern sie ein virtuelles adjungiertes Nest zur Verfügung stellen, das seinen Inhalt auf Anforderung dynamisch generiert.These solution has the advantage that the internal administration of the domain can be done by local building block instances that adjoint Manage Nest directly. Extensions and deletions in the definition area in this case, can be directly by move operations on the realize adjoint nest. Otherwise, implementations of Nests their domain of definition in any other way realize internally, provided they are a virtual adjoint nest to disposal that dynamically generates its content on demand.

Die im adjungierten Nest enthaltene Liste hat eine besondere Bedeutung im Falle von Geräten mit dynamischen Block- oder Sektorgrößen (insbesondere Bandlaufwerke, bei denen jeder Datenblock eine individuelle Größe haben kann, oder sonstige zeichenorientierte Geräte, bei denen es auf die Länge von einzelnen Transfers ankommt), bei Pipes und bei Netzwerk-Sockets, bei denen die Paketgröße eines einzelnen Original-Eintrags vom Empfänger ermittelbar sein muss63. In all diesen Fällen repräsentiert das adjungierte Nest dicht aneinander liegende Adressbereiche (ohne dazwischenliegende Lücken). Damit kann jeder Verwender selbst entscheiden, ob er einen Unix-typischen Zugriff auf das Nest unter Missachtung der ursprünglichen Paket- bzw. Datensatzgrenzen machen will, oder ob er zuvor die Paket- bzw. Datensatzgrenzen im adjungierten Nest nachsehen und entsprechend berücksichtigen will.The list contained in the adjoint nest is of particular importance in the case of devices with dynamic block or sector sizes (in particular, tape drives where each data block can be of individual size, or other character-oriented devices that require the length of individual transfers). , for pipes and network sockets, where the packet size of a single original entry must be determinable by the receiver 63 . In all these cases, the adjoint nest represents densely spaced address areas (with no gaps in between). Thus, each user can decide for himself whether he wants to make a Unix-typical access to the nest in disregard of the original packet or data record limits, or whether he wants to first look at the packet or record boundaries in the adjoint nest and take into account accordingly.

Ein dichtes Aneinanderliegen von definierten Bereichen ist auch bei persistenten Nestern möglich. Die Benutzer werden jedoch gebeten, derlei in der Praxis möglichst zu meiden, da es zu Verständigungsproblemen mit den Datei-Paradigmen anderer aktueller Betriebssysteme kommen könnte64. Konzeptuell gesehen ist ein Nest somit weit mehr als ein File unter Unix, da es untrennbar mit seinem Definitionsbereich verknüpft ist, der bei der hier vorgestellten Architektur in einem adjungierten Nest repräsentiert wird.A dense juxtaposition of defined areas is also possible with persistent nests. However, users are encouraged to avoid this in the field as much as possible, since it could lead to communication problems with the file paradigms of other current operating systems 64 . Conceptually, one is Nest is therefore much more than a file under Unix, because it is inextricably linked to its domain of definition, which is represented in the presented architecture in an adjoint nest.

Bei der Repräsentation eines Unix- oder Windows-Files in einem Nest enthält das zugehörige adjungierte Nest nur einen einzigen Eintrag mit der Startadresse 0 und der Länge des Files65. Die mittels get_maxlen und set_maxlen zugreifbare Maximaladresse hat hierbei nur die Funktion einer Sicherheitsschranke ähnlich einer Quota, die nichts über den tatsächlichen Platzbedarf aussagt und ohne weiteres auch Werte wie z.B. 263 – 1 annehmen kann.When representing a Unix or Windows file in a nest, the associated adjoint nest contains only a single entry with the starting address 0 and the length of the file 65 . The maximum address accessible by means of get_maxlen and set_maxlen has only the function of a safety barrier similar to a quota, which says nothing about the actual space requirement and can easily assume values such as 2 63 -1.

3.4.2 clear

Figure 00360001
3.4.2 clear
Figure 00360001

Damit wird der Definitionsbereich eines Nestes an der angegebenen Stelle und Länge erweitert, soweit sich vorher dort eine Lücke befand. Falls anschließend in diesem Bereich des Adressraumes gelesen wird, erscheinen Null-Byte-Datenblöcke.In order to becomes the domain of a nest at the specified location and length expanded, as far as there was previously a gap. If subsequently in In this area of the address space, zero-byte data blocks appear.

Dies gilt auch dann, wenn vorher bereits Datenblöcke dem betroffenen Bereich ganz oder teilweise zugeordnet waren. In diesem Fall bleiben bereits mittels get ausgelieferte Datenblöcke weiterhin verwendbar, allerdings werden später abgesetzte oder bereits gepufferte transfer-Operationen auf diesen Blöcken nicht mehr tatsächlich ausgeführt. Nach endgültiger Freigabe durch put werden derartige verwaiste (orphane) Datenblöcke sofort zum Speicher-Recycling verwendet.This applies even if previously blocks of data in the affected area were assigned in whole or in part. In this case already stay still usable by means of get delivered data blocks, however will be later remote or already buffered transfer operations on these blocks not really anymore executed. After final Release by put such orphaned (orphane) data blocks immediately used for storage recycling.

Da ein get auch Blöcke mit Vielfachen der transfer_size ausliefern kann, die von einem nachfolgenden clear eventuell nur zu einem Teil betroffen sind, muss die interne Logik der Nest-Implementierung sicherstellen, dass bei nachfolgenden Operationen (insbesondere put und transfer) der nicht betroffene Teil eines solchen Blocks wie ein normaler Block, der betroffene Teil dagegen als verwaist behandelt wird.There a get too blocks with multiples of transfer_size that can be delivered by one subsequent clear may only be partially affected, the internal logic of the nest implementation must ensure that in subsequent operations (especially put and transfer) the unaffected part of such a block as a normal block, the affected part is treated as orphaned.

Falls clear einen bereits definierten Bereich berührt oder mit ihm ganz oder teilweise überlappt, dann findet standardmäßig eine Erweiterung bzw. Verschmelzung der Definitionsbereiche im adjungierten Nest statt. Ggf. werden Löcher auch vollständig aufgefüllt und benachbarte Bereiche miteinander zu einem größeren Bereich verschmolzen.If clear touches an already defined area or with it whole or partially overlapped, then by default one finds Extension or merging of the definition areas in the adjoint Nest instead. Possibly. be holes also completely filled and adjacent areas merged together to form a larger area.

Durch Setzen des boolschen Parameters mode läßt sich dieses Standard-Verhalten so abändern, dass genau an den Grenzen des clear-Bereiches Einträge im adjungierten Nest so erzeugt bzw. verändert werden, dass der Bereich als ein einziges Datenpaket mit ggf. lückenlosem Anschluss an (ggf. erst dadurch entstandene) benachbarte Bereiche erscheint. Falls vorher im clear-Bereich mehrere kleinere definierte. Bereiche gelegen waren, dann werden sie durch diese clear-Variante ebenfalls „platt gemacht".By Setting the Boolean mode parameter allows this standard behavior so modify that just at the borders of the clear-field entries in the adjoint nest so created or changed be that the area as a single data packet with possibly complete Connection to neighboring areas (possibly resulting from this) appears. If previously defined in the clear area several smaller. Areas were located, then they will go through this clear variant also "flat made".

3.4.3 delete3.4.3 delete

  • delete(nest,log_address,len) → successdelete (nest, log_address, len) → success

Diese Operation bewirkt, dass an der angegebenen Stelle und Länge ein Loch im Definitionsbereich entsteht bzw. bereits vorhandene Löcher ggf. erweitert werden. Falls betroffene Datenblöcke bereits vorher mittels get ganz oder teilweise in Verwendung genommen worden waren; dann werden diese bei den IO-Operationen und beim Speicher-Recycling analog zu clear als verwaist behandelt.These Operation causes at the specified location and length Hole in the definition area or existing holes be extended. If affected data blocks previously by means of were used in whole or in part; then These are used in IO operations and memory recycling analogous to clear treated as orphaned.

3.4.4 move

Figure 00370001
3.4.4 move
Figure 00370001

Ein durch die angegebene Adresse und Länge bezeichneter Bereich des Adressraums wird um den Offset (positiv oder negativ) verschoben. Der Inhalt der verschobenen Datenblöcke wird hierbei nicht verändert, lediglich die Zuordnung von logischen zu physischen Adressen wird verändert. Bereits mittels get ausgelieferte Blöcke, die vollständig im Quellbereich der Verschiebung liegen, bleiben samt ihren physischen Adressen weiterhin gültig, jedoch wird ihre interne transiente Zuordnung gemäß der Verschiebung angepasst. Beim späteren put werden sie so behandelt, als hätten sie schon immer an der neuen Adresse gelegen. Quell- und Zielbereich der Verschiebung dürfen sich unabhängig von der Verschieberichtung überlappen66; gegenüber fix- und reorg-Locks sind grundsätzlich beide Bereiche als relevant zu betrachten, auch wenn sie sich nicht überlappen. Im freigewordenen Quellbereich erscheint ein Loch. Falls sich im Zielbereich bereits definierte Bereiche befinden, werden diese „verdeckt"; bereits durch get ausgelieferte Datenblöcke werden analog zu delete als verwaist behandelt. Eventuelle im Quellbereich vorhandene Löcher werden mitverschoben; die Freigabe von bereits vorhandenen Datenblöcken im Zielgebiet erfolgt selbst dann, wenn ausschließlich ein Loch dorthin verschoben wurde67. Falls vor dem move bereits Blöcke mittels get angefordert worden waren, die vollständig im Quellbereich lagen, dann werden sie anschließend so behandelt, als hätten sie schon bei der Anforderung im Zielbereich gelegen. Bei Blöcken mit einer vielfachen Länge der transfer_size, die von der Verschiebung nur teilweise betroffen sind, muss die interne Verwaltungslogik die interne transiente Zuordnung aufspalten und getrennt behandeln, so dass die einzelnen Teile bei folgenden Operationen wie z.B. put oder transfer so behandelt werden, als wären sie ursprünglich nicht am Stück angefordert worden.An area of the address space designated by the given address and length is shifted by the offset (positive or negative). The content of the moved data blocks is not changed, only the assignment of logical to physical addresses is changed. Blocks already delivered by get, which lie completely in the source area of the shift, remain valid with their physical addresses, but their internal transient assignment is adjusted according to the shift. At the Later, they are treated as if they have always been at the new address. The source and target areas of the shift may overlap independently of the shift direction 66 ; In contrast to fixed and reorg locks, both areas should be regarded as relevant, even if they do not overlap. In the freed source area a hole appears. If there are already defined areas in the target area, these are "hidden", and data blocks already delivered by get are treated as orphaned in the same way as delete Any existing holes in the source area are also moved, the release of existing data blocks in the target area takes place even if only a hole was moved there 67. If blocks were already requested by means of get before the move, which were completely in the source area, then they are then treated as if they had already been in the target area at the request Transfer_size, which are only partially affected by the move, must have the internal management logic split and handle the internal transient assignment separately, so that the following parts of operations, such as put or transfer, are treated as if they were not originally requested in one go n.

Eine effiziente Realisierung von move ist möglich und wird in Abschnitt 4.1.3 (Baustein map_simple) näher detailliert.A efficient realization of move is possible and will be described in section 4.1.3 (module map_simple) closer detail.

3.4.5 get_meta3.4.5 get_meta

  • get_meta(nest) → nestget_meta (nest) → nest

Zur Verwaltung von Meta-Information über den Zustand einer Nest-Instanz kann dieser eine Hilfs-Nest-Instanz zugeordnet sein, die Meta-Nest genannt wird. Falls das Meta-Nest nicht existiert, wird ein NULL-Kennzeichen zurückgeliefert.to Management of meta-information about The state of a Nest instance may be that of an auxiliary Nest instance be assigned, which is called meta-nest. If the meta-nest does not exist, a NULL flag is returned.

Meta-Nester sind dazu gedacht, um Informationen über ein Nest bereitzustellen, analog zu Datei-Attributen oder Inode-Informationen (siehe [Bac86]), jedoch nicht ausschließlich auf diese Verwendungszwecke beschränkt. Meta-Nester werden später in Abschnitt 6.1 eine herausragende Rolle bei der Einführung von Typsystemen spielen, ebenso in Abschnitt 4.2 bei der Auto-InstantIIerung von Bausteinen und in Abschnitt 4.1.5 bei den Lokalitätseigenschaften von Zugriffen auf Verzeichnis-Hierarchien.Meta nests are meant to provide information about a nest, analogous to file attributes or inode information (see [Bac86]), but not exclusively limited to these uses. Meta-nests will be in section later 6.1 play a prominent role in the introduction of type systems, also in Section 4.2 in the auto-instantiation of building blocks and in Section 4.1.5 on the locality properties of accesses on directory hierarchies.

Ein Meta-Nest enthält nur einen einzigen definierten Bereich ohne Löcher, der Idealerweise nur relativ wenig Platz beanspruchen sollte (d.h. er sollte nicht zur Speicherung großer Datenmengen missbraucht werden), um ein performantes Zugriffsverhalten sicherzustellen. Wegen der beabsichtigten Kleinheit sollte ein Meta-Nest eine transfer_size von 1 unterstützen.One Contains meta-nest only a single defined area without holes, ideally only should take up relatively little space (i.e., it should not Storing big Amounts of data are misused) in order to achieve a high-performance access behavior sure. Because of the intended smallness should be a meta-nest support a transfer_size of 1.

Bei einem persistent gehaltenen Original-Nest muss das zugehörige Meta-Nest, sofern es existiert, ebenfalls persistent gehalten werden. Falls absturzsichere atomare Transaktionen implementiert werden, muß das Meta-Nest bezüglich dieser Semantik wie ein Teil des Original-Nestes behandelt werden. Meta-Nester lassen sich grundsätzlich weiterhin zur Repräsentation statischer und dynamischer Attribute benutzen; dies führt zu einer Vereinfachung der zu implementierenden Konzepte, macht die Anwesenheit (virtueller) Meta-Nester jedoch zur Pflicht.at a persistent original nest must have the associated meta-nest, if it exists, also be kept persistent. If crash-proof atomic transactions must be implemented, the meta-nest in terms of this semantics are treated as part of the original nest. Meta-nests can be basically continue to represent use static and dynamic attributes; this leads to a Simplifying the concepts to be implemented makes the presence (virtual) meta-nests but mandatory.

4 Bausteine4 blocks

Eine Baustein-Instanz (siehe 11) ist ein Objekt, das eine beliebige, eventuell auch zur Laufzeit sich ändernde Anzahl von Ein- und Ausgängen besitzt, die wiederum jeweils Instanzen von Nestern darstellen. Bausteine werden ähnlich wie in der Elektro- und Digitaltechnik als Kästchen mit linksseitigen Eingängen und rechtsseitigen Ausgängen gezeichnet. Als Verdrahtungsregel gilt, dass Eingänge nur mit den Ausgängen anderer Bausteine verknüpft werden dürfen und umgekehrt, wobei ein Eingang nur mit einem einzigen Ausgang, ein Ausgang hingegen i.A. mit mehreren Eingängen verknüpft werden darf.A block instance (see 11 ) is an object that has any, possibly even at runtime, changing number of inputs and outputs, which in turn each represent instances of nests. Blocks are drawn as boxes with left-side inputs and right-side outputs, similar to the electrical and digital technology. A wiring rule is that inputs can only be linked to the outputs of other blocks and vice versa, whereby an input may only be linked to a single output, whereas an output may be linked to several inputs.

Ausgänge stellen damit Nester anderen Bausteinen zur Verfügung, wobei deren Eingänge als Konsumenten der von den Ausgängen angebotenen Dienstleistungen anzusehen sind; wir haben also ein System von Produzenten und von Konsumenten im logischen Sinne. Eine Verdrahtungs-Leitung repräsentiert eine Hierarchie-Beziehung68 zwischen einem vorgeschalteten Baustein (Produzent der Dienstleistung) und einem nachgeschalteten (Konsument der Dienstleistung). Per Konvention definieren wir als „Stromrichtung" einer Verdrahtungs-Leitung die Richtung vom Produzenten zum Konsumenten; dies hat jedoch nichts mit möglichen Datenfluss-Richtungen zu tun, denn die Stromrichtung ist zwar gleichzeitig die logische Datenfluss-Richtung beim Lesen, doch die logische Schreib-Datenflussrichtung läuft dem entgegen (was am Anfang zu Verwirrung führen kann, ebenso die baustein-interne Weitergabe von Operations-Aufrufen, die intern meistens von den Ausgängen her zu den Eingängen verläuft). Eine Leitung stellt alle Operationen, die am Ausgang eines Bausteins zur Verfügung gestellt werden, einem oder mehreren Konsumenten zur Verfügung. Da dies auch die Operationen get_map und get_meta umfasst, wird auf diese Weise das zugehörige adjungierte Nest und das Meta-Nest verfügbar gemacht.Outputs thus provide nests to other devices, the inputs of which are to be considered as consumers of the services offered by the outputs; So we have a system of producers and consumers in the logical sense. A wireline represents a hierarchy relationship 68 between an upstream building block (producer of the service) and a downstream one (consumer of the service). By convention, we define the direction from the producer to the consumer as the "current direction" of a wiring line, but this has nothing to do with potential Data flow directions to do, because the current direction is at the same time the logical data flow direction in reading, but the logical write data flow direction counteracts (which at the beginning can lead to confusion, as well as the in-house transfer of operation calls, the internally mostly from the outputs to the inputs runs). A line provides all operations that are provided at the output of a block to one or more consumers. Since this also includes the get_map and get_meta operations, this makes the associated adjoint nest and meta-nest available.

Sinn der Bausteine ist, verschiedene Transformationen sowohl des Adressbereiches als auch eventuell des Inhaltes von Nestern, gelegentlich auch des zugehörigen Meta-Nestes oder von Nest-Attributen wie transfer_size oder von Zugriffs-Modellen durchzuführen. Durch Kombination der Bausteine zu komplexen Netzwerken ergeben sich Transformationsmöglichkeiten, die mit herkömmlichen Betriebssystem-Architekturen nur sehr schwer realisierbar sind.sense The building block is different transformations of both the address area as well as possibly the content of nests, occasionally also of the associated Meta-Nest or Nest attributes such as transfer_size or Perform access models. By combining the building blocks to form complex networks transformation possibilities, the with conventional Operating system architectures are very difficult to implement.

Bausteine besitzen mindestens eine Instantiierungs- und Konstruktor-Operation, mit der sich neue Instanzen des jeweiligen Baustein-Typs erzeugen lassen, wobei die Parameter von Konstruktor-Operationen i.d.R. baustein-spezifisch sind. Die Destruktor-Operation hat hingegen eine einheitliche Schnittstelle. Einige Baustein-Typen haben darüber hinaus weitere spezifische Operationen, mit denen sich ihr Verhalten (etwa die Anzahl der Ein- und Ausgänge) zur Laufzeit steuern läßt.building blocks have at least one instantiation and constructor operation, with which new instances of the respective block type can be created with the parameters of constructor operations i.d.R. Block-specific are. The destructor operation, on the other hand, has a uniform interface. Some building block types have it In addition, more specific operations that affect their behavior (about the number of inputs and outputs) can be controlled at runtime.

Eine automatisierte Überprüfung der Kompatibilität der Kompetenzen von Ausgängen mit dem Verhalten von Eingängen findet bei der Verdrahtungs-Operation statt; beispielsweise wird das Zusammenpassen des transfer_size-Attributs überprüft. Weitere Details dazu in Abschnitt 4.2. Viele der nachfolgend vorgestellten Bausteine lassen sich in verschiedenen Ausbaustufen69 und mit verschiedenen Kompetenzen und Verhalten implementieren.An automated verification of the compatibility of the outputs of the outputs with the behavior of inputs takes place in the wiring operation; For example, the matching of the transfer_size attribute is checked. More details in section 4.2. Many of the modules presented below can be implemented in different stages of development 69 and with different competences and behavior.

4.1 Beispiel-Baustein-Arten4.1 example block types

Beim Entwurf von Bausteinen sollte darauf geachtet werden, dass möglichst wenig Redundanz zur Funktionalität bereits vorhandener Baustein-Arten auftritt. Sinn der Zerlegung in Bausteine ist, die in einem Betriebssystem insgesamt zu lösenden Aufgaben in möglichst viele, kleine, voneinander möglichst unabhängige (orthogonale) Teile und Zuständigkeiten aufzuspalten.At the Design of building blocks should be taken to be as possible little redundancy to the functionality already existing block types occur. Sense of decomposition Building Blocks is the total tasks to be solved in an operating system in as possible many, small, of each other as possible independent (orthogonal) Parts and responsibilities split.

Ich habe mich bemüht, bei der hier als beispielhaft zu verstehenden Zerlegung möglichst nur solche Aufgaben zu stellen, die auch in anderen aktuellen Betriebssystem-Entwürfen (einschließlich Netzwerk-Betriebssysteme) oder in Datenbanken irgendwo auftauchen und dort mit teils hohem Aufwand ad hoc gelöst werden. Damit möchte ich zeigen, dass eine Komponenten-Zerlegung auf Basis der Abstraktionen Nest und Baustein den Gesamtaufwand der zu implementierenden Aufgaben mindert, da bereits die Kombination von wenigen wiederverwendbaren Baustein-Arten eine mächtige Funktionalität erzeugt.I I tried at the here to be understood as an example decomposition as possible only to provide such tasks as in other current operating system designs (including network operating systems) or appear somewhere in databases and there with some high Costs ad hoc solved become. With that would like I show that a component decomposition based on the abstractions Nest and building block the total effort of the tasks to be implemented reduces, since already the combination of few reusable Building block types a mighty functionality generated.

4.1.1 device_*4.1.1 device_ *

Diese Bausteine (siehe 12) haben im Regelfall keinen Eingang70 und genau einen Ausgang, womit sie den Inhalt eines Gerätes (beispielsweise device_ide für IDE-Festplatten) als statisches Nest den etwaigen Konsumenten zur Verfügung stellen. Im Sinne der Verdrahtungslogik der Bausteine stellen sie Produzenten oder auch „Datenquellen" dar.These building blocks (see 12 ) usually have no input 70 and exactly one output, with which they provide the content of a device (for example, device IDE for IDE hard drives) as a static nest to any consumers available. In terms of the wiring logic of the blocks, they represent producers or "data sources".

Eine prinzipielle Unterscheidung zwischen Block- und Character-Devices wie bei Unix ist nicht notwendig, da der Entwurf der Nest-Operationen beide Paradigmen und die darin vorkommenden Betriebsarten auf uniforme Weise unterstützt; der Unterschied wird lediglich im Wert des transfer_size-Attributs angezeigt.A principal distinction between block and character devices as with Unix is not necessary because of the design of the nest operations both paradigms and the operating modes occurring in them uniform Way supported; the difference only becomes the value of the transfer_size attribute displayed.

Normalerweise dienen Geräte-Treiber zum Transfer von Datenblöcken auf Peripheriegeräte und brauchen daher nur die Operationen statischer Nester und nur singleuser-Kompetenzen71 zu implementieren. Eine mindestens multiuser-fähige Sonderform ist device_mem, die transienten Speicher ohne transfer-Operationen zur Verfügung stellt, indem sie die Operationen get_address- und put_address implementiert. Um Speicher mit verschiedenen transfer_size-Werten verwalten zu können, bilden mehrere Instanzen von device_mem eine miteinander verdrahtete Hierarchie, bei der sich Verwalter kleiner Granularität den Speicher über einen Eingang bei Verwaltern mit größerer Granularität „ausleihen" (vgl. Abschnitt 5.1). Der „Urverwalter" des physischen Hauptspeichers besitzt den gesamten Speicher beim Start des Betriebssystems und hat daher keinen Eingang72.Typically, device drivers are used to transfer data blocks to peripherals, and thus only need to implement the static nests operations and single user competencies 71 only. An at least multiuser-capable special form is device_mem, which provides transient memory without transfer operations by implementing the get_address- and put_address operations. To manage storage with different transfer_size values, multiple instances of device_mem form a wired hierarchy where small granularity managers "borrow" storage from an ingress with more granular managers (see Section 5.1) "of physical memory has all the memory at startup of the operating system and therefore has no input 72 .

Eine weitere multiuser-fähige Sonderform ist device_ramdisk, die eine limitierte Persistenz implementiert, die sich nicht über Stromausfälle hinweg erstrecken muss73.Another multi-user-capable special form is device_ramdisk that implements a limited persistence that is not about power outages across extend must 73rd

4.1.2 buffer4.1.2 buffer

Ein buffer-Baustein (siehe 13) sorgt für die Entkoppelung von Aktivitäten zwischen Eingang und Ausgang (in beide Richtungen). Er eignet sich zur Adaption des zeitlichen Zugriffsverhaltens zwischen langsamen und schnellen Baustein-Instanzen; im Idealfall sollte er die einzige Stelle im Gesamtsystem darstellen, die die Probleme der sogenannten „Speicherlücke" zu lösen hat.A buffer block (see 13 ) decouples activities between input and output (in both directions). It is suitable for adapting the temporal access behavior between slow and fast block instances; Ideally, it should be the only place in the system as a whole to solve the problems of the so-called "memory gap".

Ein häufiger Anwendungsfall ist die Nachschaltung hinter ein device_*. Dazu sind oft nur die Operationen statischer Nester erforderlich, und der Eingang braucht nur singleuser-Verhalten zu zeigen; auch der Ausgang braucht nur singleuser-Kompetenz bereitzustellen, da im häufigsten Anwendungsfall nur eine einzige map_*-Instanz nachgeschaltet wird. Es gibt aber auch Anwendungen, bei denen mindestens multiuser-Verhalten und -Kompetenz benötigt wird, insbesondere die Nachschaltung hinter einen remote-Baustein (siehe Abschnitt 4.1.12).One frequently Use case is the follow-up behind a device_ *. These are often required only the operations of static nests, and the Input only needs to show singleuser behavior; also the exit just needs to provide single-user competence as most common Use case, only a single map_ * instance is followed. But there are also applications where at least multiuser behavior and competence needed especially the downstream connection behind a remote device (see section 4.1.12).

Bei der Implementierung des multiuser-Verhaltens tritt das in der Literatur bekannte Problem der Cache-Kohärenz (vgl. [AB86, LH89, HP95] mit einer vorgeschalteten Instanz auf. Durch die in der Nest-Schnittstelle vorgesehenen notify_*-Operationen (vgl. Kapitel 5) ist dies vergleichsweise leicht lösbar.at the implementation of multiuser behavior occurs in the literature known problem of cache coherence (see [AB86, LH89, HP95] with an upstream instance. Through the notify_ * operations provided in the nest interface (see Chapter 5) this is relatively easy to solve.

Wenn man buffer-Bausteine als die einzige Stelle im Gesamtsystem ansieht, die die Entkoppelungs-Problematik des zeitlichen Zugriffsverhaltens löst, und zwar sehr effizient löst, dann kann man auch noch einen Schritt weitergehen: man kann fast alle anderen Bausteine intern statuslos implementieren, oder zumindest weitgehend statuslos. Ein Baustein ist statuslos, wenn er zu jedem Zeitpunkt, in dem sich kein logischer Kontrollfluss in ihm aufhält, destruiert und anschließend erneut konstruiert werden kann, ohne daß dadurch ein geändertes Verhalten von außen sichtbar wird. Statuslosigkeit ermöglicht eine deutliche Reduktion der inneren Komplexität vieler Bausteine im Vergleich zu konventionellen Implementierungen, weil die Verantwortung zur korrekten Aufbewahrung der internen Zustandsinformation an einen untergeordneten Baustein delegiert wird; daher ist Statuslosigkeit hochgradig erstrebenswert. Sie setzt allerdings voraus, dass Zugriffe über eine dermaßen entkoppelte Schnittstelle fast nichts kosten. Durch standardmäßige Benutzung von Prozeduraufrufen als Schnittstellen-Mechanismus und durch die Zero-Copy-Architektur (vgl. Abschnitt 2.8.2) wird dies ermöglicht.If considering buffer building blocks as the only place in the whole system, the decoupling problem of temporal access behavior triggers, and Although it dissolves very efficiently, then you can go one step further: you can almost implement all other blocks internally stateless, or at least largely stateless. A building block is stateless when it belongs to each Time in which there is no logical control flow in it, destroyed and subsequently can be reconstructed without this being a changed Behavior from the outside becomes visible. Statelessness allows a significant reduction the inner complexity many building blocks compared to conventional implementations, because the responsibility for the correct preservation of the internal state information delegated to a child building block; therefore is statelessness highly desirable. It assumes, however, that accesses via a so decoupled interface cost almost nothing. By default use of procedure calls as an interface mechanism and through the Zero-copy architecture (see Section 2.8.2) makes this possible.

Zum Caching von Datenblöcken wird der Hauptspeicher genutzt; dieser muss von mehreren buffer-Instanzen geteilt werden. Die damit verbundene Problematik könnte außerhalb des Verdrahtungs-Systems der Bausteine gelöst werden (erstes Bild). Die folgende Lösung hat jedoch Vorteile:
Der mit slow bezeichnete Eingang soll wie bei der ersten Variante zur Entkoppelung der Zugriffs-Häufigkeiten und -Anzahlen dienen. Das mit fast bezeichnete Eingangs-Nest enthält den gesamten Status des Puffers; dazu gehört neben den Inhalten der zu pufternden Datenblöcke auch die transiente Zuordnung zwischen logischen und physischen Adressen und der Aktualitäts-Status. Der buffer-Baustein wird dadurch selbst vollkommen statuslos.
For the caching of data blocks the main memory is used; this must be shared by multiple buffer instances. The problem involved could be solved outside of the wiring system of the building blocks (first picture). However, the following solution has advantages:
The input designated with slow is intended to decouple the access frequencies and counts as in the first variant. The near-named input nest contains the entire state of the buffer; In addition to the contents of the data blocks to be buffered, this also includes the transient assignment between logical and physical addresses and the status of actuality. The buffer module itself becomes completely stateless.

Damit dies zu guter Performanz führt, muss fast sehr schnellen Zugriff bieten. Die Idee besteht darin, an diesem Eingang wahlweise ein device_ramdisk anzuschließen, oder irgendein anderes relativ schnelles Gerät; bei der Pufferung von Zugriffen auf extrem langsame Bandlaufwerke74 kann dies beispielsweise auch ein Nest sein, das auf Festplatte vorgehalten wird. Letztlich macht buffer nichts anderes, als das zeitliche Zugriffsverhalten des fast-Eingangs an den Ausgang weiter zu reichen. Die am fast-Eingang angeschlossene Instanz wird mit geringeren Datenmengen belastet als beim slow-Eingang vorhanden sind; bei Speichermangel darf sie Speicher-Rückforderungs-Anträge (vgl. Kapitel 5) stellen.For this to lead to good performance, it must provide almost very fast access. The idea is to optionally connect a device_ramdisk to this input, or any other relatively fast device; For example, when buffering accesses to extremely slow tape drives 74 , this may also be a nest held on disk. Ultimately, buffer does nothing more than pass the temporal access behavior of the fast input to the output. The instance connected to the fast input is loaded with smaller amounts of data than the slow input; in the event of a shortage of storage, it may file storage recovery applications (see Chapter 5).

Die explizite Benutzung von device_ramdisk als fast-Eingang hat den weiteren Vorteil, dass die Probleme der Speicher-Rückforderung, sowie der im Gesamtsystem gemischt verwendeten unterschiedlichen transfer_size-Blockgrößen ausschließlich dort zu lösen sind.The explicit use of device_ramdisk as fast input has the further advantage that the problems of memory recovery, as well as the different transfer_size block sizes mixedly used in the overall system exclusively there to solve are.

Aufgrund von absehbaren Fortschritten in der Hardware-Entwicklung ist zu erwarten, dass zukünftige Rechner ganz andere interne Speicher-Hierarchien besitzen werden, als sie heute üblich sind. Das Baustein-Konzept ermöglicht eine flexible Anpassung an geänderte Rahmenbedingungen.by virtue of of foreseeable advances in hardware development is too expect future calculators have very different internal storage hierarchies than they usual today are. The building block concept allows a flexible adaptation to changed Conditions.

4.1.3 map_*4.1.3 map_ *

Aufgabe dieses Baustein-Typs (siehe 14) ist, ein statisches Nest in ein dynamisches umzuwandeln. Es gibt daher nur einen Eingang (der meist nur singleuser-Verhalten75 zu implementieren braucht) und einen Ausgang, der im Falle von Netzwerk-Betriebssystemen mindestens multiuser-Kompetenz bereitstellen sollte; die Herstellung dieser Kompetenz kann aber auch an eine nachgeschaltete oder interne adaptor_*-Instanz (siehe Abschnitt 4.1.8) delegiert werden.Task of this type of block (see 14 ) is to transform a static nest into a dynamic one. There is therefore only one input (which usually only needs to implement single-user behavior 75 ) and one output that should provide at least multi-user competence in the case of network operating systems; However, the creation of this competence can also be delegated to a downstream or internal adaptor _ * instance (see Section 4.1.8).

Es lassen sich verschiedene Arten von map_*-Bausteinen realisieren, die ihre Aufgabe mit jeweils anderen internen Realisierungsverfahren lösen und an spezielle Last- und Benutzungsmodelle angepasst sind. Als Beispiele werden nun zwei mögliche Realisierungen beschrieben, map_simple und map_simple_delta.It Different types of map _ * blocks can be realized Doing their job with each other's internal implementation procedures solve and adapted to special load and usage models. As examples are now two possible Implementations described, map_simple and map_simple_delta.

Die Umwandlungs-Aufgabe wird speziell bei map_simple folgendermaßen erledigt: es wird angenommen, dass die Maximalgrößen des Eingangs- und Ausgangs-Nestes annähernd gleich sind, und dass der Konsument am Ausgang nur Anforderungen in Blockgrößen stellt, wie sie von der MMU für die virtuelle Speicherverwaltung gestellt werden (typischerweise 4KByte oder 8KByte). Das transfer_size-Attribut des Ausgangs-Nestes wird also auf eine derartige Blockgröße gesetzt. Dies bedeutet, dass alle Operationen, insbesondere auch die move-Operation, nur in Vielfachen dieser Transfergröße erfolgen dürfen. Damit liegt eine effiziente Realisierung bereits auf der Hand: man benutze eine Tabelle, die eine Abbildung der Blocknummern bzw -Adressen des Ausgangs-Nestes auf diejenigen des Eingangs-Nestes realisiert. Diese Tabelle ist größenordnungsmäßig etwa um den Faktor 1000 kleiner als die Größe des umzuwandelnden Nestes, verursacht also einen Platz-Overhead von etwa einem Promille, der sinnvollerweise am Anfang des Eingangs-Nestes vorreserviert wird. Alle Operations-Aufrufe, die etwas mit den virtuellen Adressen zu tun haben (get und ggf. lock/unlock) und die vom Ausgang her ankommen, werden nach Übersetzung durch diese Tabelle an den Eingang durch gereicht. Die move-Operation wird durch eine Verschiebung innerhalb der Tabelle realisiert, die aus den bereits dargestellten Gründen etwa um den Faktor 1000 weniger kostet, als wenn man move durch Unmengen von Block-transfer- und Kopieroperationen im statischen Eingangs-Nest realisiert hätte (was z.B. ein Baustein mit dem Namen map_braindead besorgen könnte). Diese Eigenschaft läßt sich dazu ausnutzen, um den Aufwand weiter zu senken: wenn man die Tabelle wiederum in einem eigenen privaten Nest realisiert, kann dieses wiederum mit Hilfe einer beliebigen anderen map_*-Instanz verwaltet werden, die lediglich die transfer_size-Granularität der Tabellenelemente unterstützen sollte (beispielsweise map_simple_delta, map_braindead, oder eine Kombination aus map_simple mit einem nachgeschalteten adaptor_*, der in Abschnitt 4.1.8 beschrieben wird). Bei günstiger Wahl und Kombination der Bausteine zu mehrstufigen Kaskaden lassen sich damit die Kosten insbesondere bei sehr großen Nestern nochmals um einige Zehnerpotenzen senken.The Transformation task is done specifically at map_simple as follows: it is assumed that the maximum sizes of the entrance and exit nest nearly are the same, and that the consumer at the output only requirements in block sizes, as stated by the MMU for the virtual memory management will be put (typically 4Kbyte or 8Kbyte). The transfer_size attribute of the starting nest is therefore set to such a block size. This means, that all operations, especially the move operation, only in multiples of this transfer size allowed to. Thus an efficient realization is already obvious: one use a table containing an illustration of the block numbers or addresses of initial nest on those of entrance nest realized. This table is of the order of magnitude by a factor of 1000 smaller than the size of the nest to be transformed, causes a space overhead of about one per thousand, the meaningfully pre-reserved at the beginning of the entrance nest. All operations calls to something with the virtual addresses too have to do (get and possibly lock / unlock) and arrive from the exit, be after translation passed through this table to the entrance through. The move operation is realized by a shift within the table, the for the reasons already described It costs about a factor of 1000 less than if you move through Lots of block transfer and copy operations in the static Entrance nest would have realized (which might, for example, get a building block named map_braindead). These Property can be to exploit to further reduce the effort: if you look at the table Once again realized in its own private nest, this in turn can managed using any other map _ * instance, which should only support the transfer_size granularity of the table elements (For example, map_simple_delta, map_braindead, or a combination from map_simple with a downstream adaptor_ *, which is in section 4.1.8 is described). At cheaper Choice and combination of building blocks to multi-stage cascades The costs, especially for very large nests again by a few Decrease powers of ten.

Eine Adressübersetzung verursacht nach längerem Betrieb mit vielen move-, clear- und delete-Operationen ein Phänomen, das in der Literatur über Dateisysteme als Fragmentierung (vgl. z.B. [MJLF84, McK96]) bekannt ist. Dieses Phänomen beschreibt die Tatsache, dass eine hohe Lokalität von Zugriffen auf der Ausgangsseite des map-Bausteins nicht unbedingt in eine hohe Lokalität der Zugriffe auf der Eingangsseite übersetzt wird, da die Tabelle die Adressen ähnlich wie bei Hash-Verfahren kräftig durcheinander würfeln kann. Ein Konsument erwartet jedoch, dass Schreib- oder Leseaufträge, die in zusammenhängender und aufsteigender Adress-Reihenfolge gegeben werden, mit deutlich besserer Performanz ausgeführt werden als zufällig verteilte Zugriffe76. Zur Lösung dieses Problems stehen mehrere bekannte Verfahren zur Verfügung, die aus der Literatur über Dateisysteme analog übertragbar sind, beispielsweise intelligente Allkations-Strategien und Defragmentierungs-Läufe. Durch das Background-IO-Konzept (Abschnitt 2.8.3) wird insbesondere eine Defragmentierung im Hintergrund des laufenden Betriebes stark erleichtert, ohne die Abarbeitung der Benutzeraktivitäten merklich zu stören. Ich erwarte, dass die Anwendung ganz einfacher und primitiver Verfahren wie die beständig angestrebte Herstellung einer Identitäts-Abbildung oder „Beinahe-Identitäts-Abbildung77" sehr gute Resultate liefern wird, sofern dies im Hintergrund mittels Background-IO geschieht.An address translation causes after prolonged operation with many move, clear and delete operations a phenomenon that is known in the literature on file systems as fragmentation (see eg [MJLF84, McK96]). This phenomenon describes the fact that a high locality of accesses on the output side of the map module is not necessarily translated into a high locality of accesses on the input side, since the table can throw the addresses together, much like hashed methods. However, a consumer expects read or write jobs given in contiguous and ascending address order to perform significantly better than random access 76 . To solve this problem, several known methods are available which are analogously transferable from the literature via file systems, for example intelligent all-cation strategies and defragmentation runs. The background IO concept (Section 2.8.3) greatly facilitates in particular a defragmentation in the background of the ongoing operation, without noticeably disturbing the processing of the user activities. I expect that the application of very simple and primitive methods, such as the consistent creation of an Identity Map or "Near Identity Map 77 ", will yield very good results if done background-IO in the background.

Wenn man davon ausgehen kann, dass eine Defragmentierung im Hintergrund dafür sorgt, dass die Adress-Übersetzung „nur wenig" von einer Identitäts-Abbildung abweicht, dann läßt sie sich auch auf folgende Weise realisieren, die ich map_simple_delta nenne:
Statt einer Tabelle fester Größe wird eine Liste (bzw. ein als Ringpuffer ausgeführtes Array oder dergleichen) der bisher ausgeführten Operationen benutzt, die etwas an den Adress-Zuordnungen ändern. Dadurch geht die Durchführung von move, clear und delete rasend schnell, weil nur ein Eintrag in die Liste gemacht werden muss, so dass sich im Endeffekt ein Log der durchzuführenden Operationen ergibt (falls im Log auch alle IO-Operationen aufgezeichnet werden, entsteht ein ähnlicher Effekt wie in Log-strukturierten Dateisystemen, vgl. [R091]). Die Übersetzung einer Adresse kann nun grundsätzlich dadurch erfolgen, dass in dieser Log-Liste nachgesehen wird, ob irgendwelche Operationen eingetragen wurden, die etwas an einer gegebenen Adresse ändern; diese Änderungen werden dann in der richtigen Reihenfolge quasi virtuell nachvollzogen. Dieses einfache Verfahren führt natürlich nur dann zu akzeptabler Performanz, wenn die Liste möglichst kurz gehalten wird. Eine Möglichkeit zur Kürzung der Liste besteht darin, dass solche Operationen, die sich gegenseitig ganz oder teilweise ausheben bzw. die sich durch eine einzige Ersatz-Operation mit gleicher Semantik ersetzen lassen, aus der Liste entfernt und ggf. durch die Ersatz-Operation ersetzt werden (Prinzip der Kompensation von Operationen). Eine andere, in der Praxis auf Dauer unumgängliche Möglichkeit besteht darin, dass im Hintergrund Verschiebungen und Umordnungen durch Background-IO stattfinden, durch die Einträge in der Liste überflüssig werden78. Zu erwähnen ist weiterhin, dass map_simple_delta nicht nur Blöcke mit relativ großer Granularität wie bei Platten-Devices oder MMU-Seiten verwalten kann, sondern auch kleinere transfer_size-Werte bis hinunter zu 1 unterstützt. Der Ausgang unterstützt automatisch die gleiche Granularität, wie sie vom Eingang vorgegeben wird, allerdings kann es vorkommen, dass eine get-Anforderung mit einem hohen Vielfachen der transfer_size nur mit einem geringeren Vielfachen möglich ist. Dies ist in der Schnittstelle für Nester ausdrücklich so vorgesehen, und es ist die Aufgabe eines jeden Konsumenten, mit diesem Fall umgehen zu können (wobei er sich das Problem auch durch Vorschalten eines adaptor_* vom Hals schaffen kann).
If one can assume that a defragmentation in the background ensures that the address translation deviates "only slightly" from an identity map, then it can also be realized in the following way, which I call map_simple_delta:
Instead of a fixed-size table, a list (or an array executed as a ring buffer or the like) of the previously executed operations that change something in the address assignments is used. As a result, the execution of move, clear and delete is extremely fast, because only one entry has to be made in the list, so that the result is a log of the operations to be performed (if all IO operations are also recorded in the log, a similar result is created) Effect as in log-structured file systems, see [R091]). The translation of an address can now basically be done in that in this log list to see if any operations have been entered that change something at a given address; These changes are then virtually virtualized in the correct order. Of course, this simple procedure only leads to acceptable performance if the list is kept as short as possible. One possibility for shortening the list is that those operations that cancel each other out in whole or in part or that can be replaced by a single replacement operation with the same semantics are removed from the list and possibly replaced by the replacement operation (Principle of compensation of operations). Another possibility, which is indispensable in practice in the long run, is the background shift and rearrangement by Background-IO, which makes entries in the list superfluous 78 . It should also be noted that not only can map_simple_delta manage blocks with relatively high granularity as with disk devices or MMU pages, but also support smaller transfer_size values down to 1. The output automatically supports the same granularity as specified by the input, but it can happen that a get request with a high multiple of the transfer_size is only possible with a smaller multiple. This is explicitly provided for in the nests interface, and it is the responsibility of every consumer to deal with this case (although he can solve the problem by putting an adapter in front of him).

Ein map_*-Baustein muss auch die Operation get_meta sowie die Operationen auf dem Meta-Nest implementieren. Ein Meta-Nest sollte im Regelfall eine transfer_size von 1 unterstützen, was sich durch interne Verwendung eines adaptor_*-Bausteins (Abschnitt 4.1.8) erzielen läßt.One map_ * - The building block must also have the operation get_meta as well as the operations implement on the meta-nest. A meta-nest should normally support a transfer_size of 1, which can be explained by internal use of an adaptor _ * block (Section 4.1.8).

Wichtig ist ferner, dass map_*-Bausteine unbedingt die Eigenschaft der Absturzfestigkeit besitzen sollten. Mit diesem Begriff soll umschrieben werden, dass eine jederzeitige Trennung des Bausteins von seinem Eingang bzw. ein Verlorengehen von transfer-Operationen (z.B. bei einem plötzlichen Stromausfall, der zum Verlust der vorgeschalteten flüchtigen buffer-Informationen führt) nicht die Integrität der Adressübersetzung zerstören darf. Wenn man nicht auf die Performanz-Vorteile von Pufferung in flüchtigem Speicher verzichten will, muss man damit leben, dass der Zustand auf dem persistenten Hintergrundmedium ständig dem Zustand im flüchtigen Speicher hinterherhinkt, so dass bei unerwartet auftretenden Störungen Daten und damit Informationen verloren gehen. Bekannte Lösungen dieses Problems79 stellen Log-basierte Schreibverfahren dar; entweder in Form separater Logs oder in Form sogenannter Log-strukturierter Speicher. Zur Unterstützung dieser Verfahren wurde in Abschnitt 3.3.1 der Parameter depend eingeführt, mit dem sich die Reihenfolge von Schreiboperationen teilweise vorgeben lässt. Absturzfestigkeit läßt sich fernerhin als Teil von ACID-Transaktionen implementieren, falls man diese bereits in einer entsprechenden map_*-Variante bereitstellen möchte. Eine weitere Möglichkeit stellt die Vorschaltung eines eigenen powersafe-Bausteins analog zu [dJ93] dar, der in isolierter Weise nur die Absturzfestigkeit als Strategie implementiert und auf die Erweiterung statischer Nester auf dynamische verzichtet.It is also important that map_ * blocks should have the property of fall resistance. This term is intended to describe that any time separation of the block from its input or a loss of transfer operations (eg in the event of a sudden power failure, which leads to the loss of upstream volatile buffer information) must not destroy the integrity of the address translation. If you do not want to sacrifice the performance benefits of buffering in volatile memory, you have to live with the state on the persistent background medium constantly lagging behind the state in volatile memory, causing data and information to be lost on unexpected glitches. Known solutions to this problem 79 are log-based writing methods; either in the form of separate logs or in the form of so-called log-structured memory. In order to support these procedures, the parameter depend was introduced in section 3.3.1, with which the sequence of write operations can be partially predefined. Crash resistance can also be implemented as part of ACID transactions if you already want to deploy them in a corresponding map_ * variant. Another possibility is the preconnection of a separate powersafe block analogous to [dJ93], which implements in isolated manner only the fall-resistance as a strategy and dispenses with the extension of static nests to dynamic ones.

Die Funktionalität von map_* läßt sich sicher auch mit Dutzenden weiterer Verfahren zur Adress-Übersetzung herstellen, die eventuell Vorteile bei bestimmten Last-Charakteristiken bringen können. Zu nennen sind hier beispielsweise Tries, balancierte Bäume, B-Bäume, Fuzzy Hashing, und andere. Meine Ausführungen sollten plausibel gemacht haben, dass effiziente Realisierungen des Konzeptes der dynamischen Nester möglich sind.The functionality from map_ * can be certainly with dozens of other methods for address translation which may have advantages with certain load characteristics can bring. These include, for example, trikes, balanced trees, B trees, fuzzy Hashing, and others. My remarks should have made it plausible that efficient realizations the concept of dynamic nests are possible.

4.1.4 selector4.1.4 selector

Dieser Anpassungs-Baustein (siehe 15) schneidet einen zusammenhängenden Teil-Adressraum aus seinem Eingangs-Adressraum aus und stellt ihn unverändert am Ausgang zur Verfügung, wobei die Adressen standardmäßig wieder bei 0 neu beginnen. Wird der ausgeschnittene Adressraum als Ganzes verschoben, dann wirkt sich das nicht auf den Gastgeber-Adressraum aus, ebenso umgekehrt bei Überstreichung einer move-Operation im Gastgeber-Adressraum über den gesamten ausgeschnittenen Bereich (Transparenz).This adaptation module (see 15 ) cuts out a contiguous sub-address space from its input address space and makes it available at the output unchanged, with the addresses re-starting at 0 by default. If the cut-out address space is moved as a whole, then this does not affect the host address space, as well as the reverse of a move operation in the host address space over the entire cut-out area (transparency).

Die Implementierung ist relativ einfach, da außer einer uniformen Adressübersetzung und -Überprüfung nichts zu machen ist und alle Operationen vom Ausgang an den Eingang durch gereicht werden können. Es sind zwei grundlegende Varianten von Selektoren möglich, selector_persistent und selector_tmp, die sich darin unterscheiden, ob die Ausschnitts-Adressen und -Längen sowie deren Änderungen persistent festgehalten werden sollen oder nicht. Im ersteren Fall wird Hilfsinformation im Meta-Nest des Eingangs gehalten, mit der die Startadresse und die Länge relativ zum Gast-Adressraum auf Dauer festgehalten wird, so dass eine Destruktion des selector mit anschließender Reinstantüerung wieder den alten Zustand ergibt.The Implementation is relatively simple, as well as a uniform address translation and check nothing and to do all the operations from the exit to the entrance can be served. It Two basic variants of selectors are possible, selector_persistent and selector_tmp, which differ in whether the clipping addresses are different and lengths as well as their changes persistently or not. In the former case Aid information is kept in the meta-nest of the entrance, with the the start address and the length relative to the guest address space is permanently held, so that a destruction of the selector with subsequent ultrapowering again gives the old state.

4.1.5 dir_*4.1.5 dir_ *

Ein Baustein dieser Art (siehe 16) benutzt das Eingangs-Nest als eine Art Sammel-Container, um mehrere von einander unabhängige Ausgangs-Nester daraus zu bilden. Die Ausgangs-Nester werden bei Bedarf durch die baustein-spezifische Zugriffsoperation create neu erstellt; bereits früher erstellte werden durch lookup erneut instantiiert, sofern sie nicht bereits instantiiert sind. Unterschieden werden die verschiedenen möglichen Ausgangs-Instanzen durch einen Suchschlüssel, der als ein zusammenhängender Datenblock übergeben wird. Zur Abfrage aller vorhandenen persistent gespeicherten Schlüsselwerte dient ein spezieller Ausgang, der Verzeichnis-Nestgenannt wird, der im Regelfall eine transfer_size von 1 unterstützt, und von dem nur gelesen werden darf. Ein Verzeichnis-Nest stellt ein Nest mit lückenlos liegenden Datenpaketen dar, wobei jedes Paket genau einen der vorhandenen Suchschlüssel enthält. Die Schlüsselwerte können, müssen aber nicht nach irgendeinem internen Kriterium sortiert gehalten werden. Löschungen von Schlüsselwerten und der zugehörigen Ausgangs-Nest-Instanzen lassen sich als baustein-spezifische Operation und/oder durch eine delete-Operation auf dem Verzeichnis-Nest realisieren. Hierbei ist die aus Unix bekannte Methodik zu bevorzugen, dass zwischen statischen und dynamischen Referenzen unterschieden werden sollte, und dass ein Ausgang und sein Speicherplatz erst dann tatsächlich freigegeben werden sollen, wenn keine dynamischen Referenzen mehr vorhanden sind.A building block of this kind (see 16 ) uses the entrance nest as a sort of collection container to form several independent exit nests. The output nests are recreated as needed by the building block-specific access operation create; previously created are re-instantiated by lookup, unless they are already instantiated. The different possible outgoing instances are distinguished by a search key, which is transferred as a contiguous data block. To query all existing persistently stored key values, there is a special exit called directory nest, which usually supports a transfer_size of 1, and of which read only. A directory nest represents a nest of seamless data packages, with each package containing exactly one of the existing search keys. The key values may or may not be sorted by any internal criterion. Deletion of key-values and their associated seed-nest instances can be accomplished as a building-block-specific operation and / or through a delete operation on the directory nest. Here, the methodology known from Unix is to be preferred, that a distinction should be made between static and dynamic references, and that an output and its memory space should not actually be released until there are no more dynamic references.

Aus dieser Beschreibung dürfte klar geworden sein, dass damit ein Verzeichnis realisierbar ist, wie es in konventionellen Betriebssystem-Architekturen von Dateisystemen zur Verfügung gestellt wird. Ein dir_* stellt jedoch keine Verzeichnisbaum-Hierarchie zur Verfügung, sondern ähnelt eher dem flachen Index einer Datenbank. Dennoch lassen sich Verzeichnisbaum-Hierarchien sehr leicht herstellen: am Ausgang einer dir_*-Instanz braucht lediglich eine weitere dir_*-Instanz angeschlossen zu werden und so weiter. Auf diese Weise kann der Dateisystem-Baum (bzw. ein momentan instantiierter Teilbaum davon) direkt als Baumstruktur von Baustein-Instanzen mit der zugehörigen Verdrahtung dargestellt werden. Wenn man die in Abschnitt 4.2 vorgestellte Auto-Instantiierung von Bausteinen benutzt, dann braucht man sich als Benutzer nicht um die dynamische Herstellung dieser Baumstruktur zu kümmern, da dies automatisch geschieht.Out this description is likely have become clear that with it a directory can be realized, as in conventional operating system architectures of file systems to disposal is provided. However, a dir_ * does not provide a directory tree hierarchy to disposal, but resembles rather the flat index of a database. Nevertheless, directory tree hierarchies can be used very easy to make: at the output of a dir _ * instance just needs another you _ * instance to be connected and so on. In this way, the file system tree (or a currently instantiated Subtree of it) directly as a tree structure of block instances with the associated Wiring are shown. If one introduces the in section 4.2 Auto-instantiation of building blocks used, then you need As a user, it is not about the dynamic production of this tree structure take care of, because this happens automatically.

Im Vergleich zur Funktionalität klassischer Dateisysteme ermöglicht dieses Konzept eine wesentlich flexiblere Instantiierung und Verdrahtung, da man beispielsweise

  • • für jedes Verzeichnis individuell verschiedene Baustein-Typen einsetzen kann, beispielsweise dir_simple für kleine Verzeichnisse, dir_hash für solche mit besonders schneller lookup-Funktionalität, oder dir_btree für solche mit besonders guten Lokalitätseigenschaften trotz riesiger Ausdehnung
  • • Datenkomprimierungs-, Datenverschlüsselungs- und sonstige Anpassungs-Bausteine wie adaptor_* und andere auf beliebigen Hierarchieebenen (automatisch) dazwischen schalten kann
  • • auf Konzepte wie Mounts und Mount-Tabellen verzichten kann, da dies von einem redirect-Baustein übernommen werden kann
  • • ebenso auf Konzepte wie Loopback-Devices verzichten kann, indem lediglich ein map_* zwischengeschaltet wird
  • • nahtlose Integration mit der Funktionalität von Datenbanken möglich ist: dazu zählt nicht nur der später vorgestellte transaction-Baustein, sondern auch die Möglichkeit, spezialisierte Bausteine wie beispielsweise dir_fixed_keysize einzusetzen, bei denen eine Uniformität der Schlüssellängen zugunsten besserer Platzausnutzung erzwungen wird
  • • eine virtuelle Herstellung von Verzeichnisinhalten durchführen kann, beispielsweise mit einem Baustein dir_proc für die Funktionalität von /proc-Dateisystemen, oder dir_join zur Herstellung der Funktionalität der aus der Datenbank-Welt bekannten Join-Operation aus dem Daten-Inhalt mehrerer anderer Nester. In diesem Fall können dir_*-Varianten entstehen, die gar keinen oder mehrere Eingänge besitzen, was sich u.U. mit dem althergebrachten Konzept eines Dateisystem-Baums nicht auf intuitive Weise modellieren läßt.
Compared to the functionality of classic file systems, this concept allows a much more flexible instantiation and wiring, because, for example
  • • can use individually different block types for each directory, for example dir_simple for small directories, dir_hash for those with particularly fast lookup functionality, or dir_btree for those with particularly good locality properties despite their huge size
  • • Automatically interpose data compression, data encryption, and other customization building blocks such as adaptor_ * and others at any hierarchy level
  • • Can dispense with concepts such as mounts and mount tables, since this can be taken over by a redirect module
  • • can also do without concepts such as loopback devices by just interposing a map_ *
  • • Seamless integration with the functionality of databases is possible: this includes not only the transaction module presented later, but also the possibility of using specialized components such as dir_fixed_keysize, which enforce uniformity of key lengths in favor of better space utilization
  • • make a virtual directory content creation, for example with a dir_proc building block for the / proc file system functionality, or dir_join to get the functionality of the database world known join operation from the data content of several other nests. In this case you can create _ * - variants that have no or more inputs, which may not be modeled in an intuitive way with the traditional concept of a file system tree.

Die grundlegende Funktionsweise von dir_*-Bausteinen möchte ich am Beispiel einer Realisierung von dir_simple erläutern. Es werden insgesamt drei verschiedene Regionen von zusammenhängenden Adressbereichen benutzt, um die Container-Funktionalität zu realisieren. Dies sind

  • • die Index-Region,
  • • die Meta-Region,
  • • die Daten-Region.
I would like to explain the basic functionality of you _ * - building blocks using the example of a realization of dir_simple. A total of three different regions of contiguous address ranges are used to realize the container functionality. these are
  • • the index region,
  • • the meta region,
  • • the data region.

Diese Regionen werden innerhalb des Eingangs-Nestes und des Eingangs-Meta-Nestes angelegt, wobei die Daten-Region auf jeden Fall im Eingangs-Nest, die Meta-Region auf jeden Fall im Eingangs-Meta-Nest, und die Index-Region wahlweise in einem der beiden Nester liegen kann (sinnvollerweise sollte die Zuordnung von der Größe des Index abhängig gemacht werden).These Regions become within the entrance nest and the entrance meta nest created, with the data region in any case in the entrance nest, the meta-region definitely in the input meta-nest, and the index region optionally in one of the two nests can (meaningfully should be the assignment of the size of the index dependent be made).

dir_simple betrachtet diese Regionen jeweils als kompakt zusammenhängende Teil-Nester und benutzt die am Eingang zur Verfügung stehenden move-Operationen, um Einfügungen und Löschungen von Index-Werten durchzuführen, sowie die an den Ausgängen ankommenden move-Operationen u.a. an den Eingang weiter zu reichen. Dies bedeutet für die ge_ maxlen-Werte der Ausgänge, dass ihre Summe kleiner-gleich des get_maxlen-Wertes des Eingangs sein muss80. Die interne Realisierung von dir_simple braucht sich nicht um die Bereitstellung und Verschiebung von Platz zu kümmern, da diese Funktionalität bereits am Eingang verfügbar ist. Um die Funktionalität eines instantiierten Ausgangs zu erfüllen (mit Ausnahme von set_maxlen, das abgefangen werden muss), können interne Instanzen von selector verwendet werden.dir_simple considers each of these regions to be compactly contiguous subnodes, and uses the move operations available at the input to perform insertions and deletions of index values, as well as passing the move operations arriving at the outputs to, among others, the input. For the ge_ maxlen values of the outputs, this means that their sum must be less than or equal to the input's get_maxlen value 80 . The internal implementation of dir_simple does not need to worry about the provisioning and moving of space, as this functionality is already available at the entrance. To fulfill the functionality of an instantiated output (with the exception of set_maxlen, which must be intercepted), internal instances of selector can be used.

Die Reihenfolge von Einträgen ist bei dir_simple in allen Regionen gleich: wenn beispielsweise ein Eintrag in der Index-Region ganz am Anfang bei der ersten Position eingefügt wird, dann wird in der Meta-Region und in der Daten-Region ebenso verfahren und dort jeweils Platz im Adressraum geschaffen. In diesem Fall, oder wenn sich beispielsweise die Größe eines Ausgangs-Nestes durch set_maxlen so stark ändert, dass Überschneidungen drohen, wird der gesamte restliche Adressraum in einem Rutsch verschoben; wegen der Transparenz-Eigenschaft der intern verwendeten selector-Bausteine merken die bereits instantiierten Ausgänge nichts davon.The Order of entries is the same for dir_simple in all regions: for example an entry in the index region at the very beginning at the first position added becomes, then becomes in the Meta region and in the data region likewise procedure and there created each place in the address space. In this Fall, or if, for example, the size of a starting nest through set_maxlen changes so much that overlaps threaten, the entire remaining address space is moved in one go; because of the transparency property of internally used selector building blocks the already instantiated outputs do not notice this.

Der Index-Bereich wird bei dir_simple direkt im gleichen Format abgespeichert, wie sie der Verzeichnis-Nest-Ausgang verlangt. Andere dir_*-Arten können selbstverständlich davon abweichen. Die Ausgänge eines dir_*-Bausteins sollten mindestens multiuser-Kompetenz bereitstellen. Hierfür gibt es mehrere Möglichkeiten: die interne Realisierung könnte z.B. nur durch singleuser-Verhalten erfolgen (was den Entwurf ein klein wenig vereinfacht) und die multiuser-Kompetenz an den Ausgängen durch eine adaptor_*-Instanz zur Verfügung stellen. Für die Einsatzgebiete von Netzwerk-Betriebssystemen ist jedoch durchgehendes multiuser-Verhalten vorteilhaft. Dies ist bei dir_simple relativ einfach zu erfüllen, da die oben beschriebene Realisierung weitgehend statuslos erfolgen kann. Bei statuslosen Realisierungen ist die Hinzunahme von multiuser- oder multiversion-Verhalten einfach, da lediglich alle potentiell konfliktträchtigen Operationen durch lock/unlock-Paare zu klammern sind. Die einzige konfliktträchtige Operation bei den Ausgangs-Nestern ist set_maxlen, die bei vernünftigem Entwurf nur selten aufgerufen werden sollte; alle anderen Operationen außer Modifikationen in der Index-Region brauchen keine zusätzlichen Klammern und laufen unverändert oder nur wenig verändert durch.Of the Index area is stored directly in dir_simple in the same format, as requested by the directory nest exit. Other you _ * types can Of course deviate from it. The exits a _ _ _ building block should at least provide multiuser competence. Therefor There are several possibilities: the internal realization could e.g. only by single-user behavior done (what the draft small little simplified) and the multiuser competence at the outputs through an adaptor _ * instance is available put. For However, the application areas of network operating systems is continuous multiuser behavior advantageous. This is relative to dir_simple easy to fulfill, because the implementation described above is largely stateless can. For stateless implementations, the addition of multiuser or multiversion behavior simply because only all of them potentially conflictual Operations are to be clung by lock / unlock pairs. The only conflictual Operation at the exit nests is set_maxlen, which is reasonable Design should rarely be called; all other operations except Modifications in the index region do not need additional Braces and run unchanged or only slightly changed by.

Diese recht einfache Realisierung hat sehr gute Lokalitätseigenschaften: das Lokalitäts-Verhalten eines Ausgangs wird direkt an den Container beim Eingang weitergereicht. Falls kleine Verzeichnisse so realisiert sind, dass die Index-Region im Meta-Nest des Eingangs liegt, dann enthält das Meta-Nest im Falle von rekursiv verschachtelten Verzeichnissen an der Wurzel die gesamte Baumstruktur aller Indizes, die im Vergleich zur Summe aller Dateigrößen um einige Größenordnungen kleiner ausfällt (zumindest bei üblichen durch menschliche Nutzer verursachten Dateigrößen) und allein wegen dieser geringen Lokalität der Ausdehnung einen schnellen Zugriff erlaubt (wobei das Caching des transitiv vorgeschalteten buffer-Bausteins separate Konzepte wie Inode- oder Namens-Caches überflüssig macht).These quite simple realization has very good locality characteristics: the locality behavior an exit is passed on directly to the container at the entrance. If small directories are so implemented that the index region lies in the meta-nest of the entrance, then contains the meta-nest in the case of recursive nested directories at the root of the entire tree of all the indices, which are some of them compared to the sum of all file sizes orders of magnitude smaller fails (at least at usual through human users caused file sizes) and solely because of this low locality the extension allows quick access (where caching the transitive upstream buffer module separate concepts how inode or name caches make superfluous).

Die Zuordnung der Index-Region zu einem der beiden Eingangs-Nester ist eine Strategie-Entscheidung, die in jedem Einzelfall anders getroffen werden kann; sehr große Index-Regionen lassen sich auch in das reguläre Eingangs-Nest verlagern, so dass die Lokalität des Meta-Nestes möglichst wenig verschlechtert wird.The Assignment of the index region to one of the two input nests is a strategy decision that is made differently in each individual case can be; very big Index Regions can also be moved to the regular Inbox Nest, so the locality the meta-nest as possible little is worsened.

Eine weitere strategische Entscheidungsmöglichkeit für das Lokalitäts-Verhalten besteht darin, einige oder alle der Regionen miteinander zu verschmelzen. Dies kann insbesondere bei der Verquickung der Index- mit der Meta-Region Vorteile bringen, sofern die Meta-Daten der Ausgänge nur wenig Platz beanspruchen. Der von Hans Reiser in reiserfs propagierte effiziente Zugriff auf sehr kleine Datei-Größen (wie z.B. bei der Modellierung einzelner Felder von Datensätzen einer Datenbank mit Hilfe von „Mini-Dateien") läßt sich ggf. durch eine Verschmelzung von Index- und Daten-Region erreichen, bzw durch eine fallweise dynamische heuristische Zuordnung zu einer der Regionen. Ferner kann man bei der Repräsentation der Felder von Datensätzen einer Datenbank einen funktionalitäts-mäßig stark eingeschränkten Baustein-Typ dir_record einsetzen, der die immer gleiche Index-Struktur von Records gleichen Aufbaus und die ebenfalls immer gleichen Metadaten (in denen die Feldnamen und Feldlängen und weitere Attribute gespeichert werden) nicht in der Index-Region jeder einzelner Instanz abspeichert, sondern per Referenz aus einer gemeinsamen externen Quelle bezieht und damit nur einen vernachlässigbaren Platz-Overhead bei jeder einzelnen Instanz verursacht.A further strategic decision-making possibility for the locality behavior is to merge some or all of the regions together. This can be especially true in the amalgamation of the index with the meta-region Benefit provided that the metadata of the outputs take up very little space. The efficient access to the propagated by Hans Reiser in reiserfs very small file sizes (like e.g. when modeling individual fields of data records Database with the help of "mini-files") can be possibly by merging index and data region, or by a case by case dynamic heuristic assignment to a of the regions. Furthermore one can use the representation of the fields of data records Database a functionality-strong restricted Block type dir_record, which always has the same index structure Records of the same structure and the same metadata (in which the field names and field lengths and other attributes stored) not in the index region of each instance stores, but by reference from a common external Source, and thus only a negligible overhead overhead every single instance causes.

Durch diese Beispiele sollte plausibel geworden sein, dass spezielle Anforderungen, die bisher oftmals als Anreiz zur Entwicklung aufwendiger und umfangreicher Dateisysteme mit trickreichen internen Implementierungen dienten, durch ein Baustein-Konzept mindestens ebenso gut abgedeckt werden können. Die hier vorgestellte Baustein-Zerlegung verteilt die in Dateisystemen vorkommenden Problematiken und Funktionalitäten auf mehrere Baustein-Arten, isoliert sie voneinander, und ermöglicht vorher unbekannte Kombinationen. Einige der Möglichkeiten werden auf einfachere Weise als mit stapelbaren Dateisystemen (vgl. [HP94, HP95]) gelöst, da nicht mehr zwischen verschiedenen Ebenen wie „Dateien" versus „Dateisystem-Bäume" unterschieden wird.These examples should have made it plausible that special requirements that were previously often an incentive to develop complex and extensive file systems with tricky internal implemen served by a building block concept can be at least as well covered. The block decomposition presented here distributes the problems and functionalities occurring in file systems over several types of blocks, isolating them from each other and enabling previously unknown combinations. Some of the possibilities are solved in a simpler way than with stackable file systems (see [HP94, HP95]), since no distinction is made between different levels such as "files" versus "file system trees".

4.1.6 union4.1.6 union

Dieser Baustein (siehe 17) stellt in gewisser Hinsicht eine inverse Operation zu selector bzw dir_* dar: mehrere Eingangs-Nester erscheinen in einem Ausgangs-Nest und werden dabei adressmäßig nebeneinander aufgereiht. Über Parameter bzw. Meta-Informationen wird festgelegt, ob sich ein Eingangs-Adressraum lückenlos an seinen Vorgänger anschließen soll (so dass eventuelle Lücken am Ende des Vorgängers und am Anfang des eigenen Nestes zusammen geschoben werden und move-Operationen des Vorgängers mit vollzogen werden), ob der Anschluss über get_maxlen erfolgen soll, oder ob er ggf. unter Lückenbildung an festen Adressen „festgenagelt" erscheinen soll (analog zu selector). Weitere Spielarten sind denkbar.This module (see 17 ) is in some ways an inverse operation to selector or dir_ *: multiple input nests appear in a seed nest and are lined up side by side in terms of addresses. Parameter or meta-information is used to determine whether an input address space is to be completely connected to its predecessor (so that any gaps at the end of the predecessor and at the beginning of one's nest are pushed together and move operations of the predecessor are performed). Whether the connection should be made via get_maxlen, or whether it should possibly be "pinned" at fixed addresses (similar to selector).

Über den später besprochenen Mechanismus der generischen Operationen lassen sich Eingänge zur Laufzeit hinzufügen und entfernen.On the later discussed mechanism of generic operations can be inputs at runtime and remove.

Ein wichtiges Anwendungsgebiet von union ist die Zusammenstellung verschiedener Regionen bzw. „Segmente" in virtuellen Adressräumen oder. Schutzbereichen, beispielsweise die Einteilung in Code-, Stack- und Datensegmente, sowie in Mappings anderer Nester. Verschiedene Mapping-Arten lassen sich durch Vorschalten von Anpassungsbausteinen wie cow (Abschnitt 4.1.10) realisieren.One important application of union is the compilation of different Regions or "segments" in virtual address spaces or. Protection areas, such as the classification into code, stack and Data segments, as well as in mappings of other nests. Different mapping types can be achieved by preceding adaptation modules such as cow (Section 4.1.10).

4.1.7 mmu_*4.1.7 mmu_ *

Dieser Baustein (siehe 18) besitzt genau einen Eingang und keinen Ausgang81, ist also im Sinne der Verdrahtungslogik ein reiner Konsument. Er stellt die Schnittstelle zur Memory-Management-Unit (MMU) der Rechner-Hardware dar. Das Nest wird hierbei 1:182 in einen virtuellen Adressraum umgewandelt, der sich über Kontrollflüsse direkt durch Maschinenbefehle des Prozessors adressieren lässt.This module (see 18 ) has exactly one input and no output 81 , so in terms of the wiring logic is a pure consumer. It represents the interface to the memory management unit (MMU) of the computer hardware. The nest is in this case 1: 1 82 converted into a virtual address space, which can be addressed via control flows directly by machine commands of the processor.

Die Realisierung dieses Bausteins ist im Vergleich zu konventionellen Implementierungen relativ einfach:
wenn ein Seitenfehler auftritt, wird der betroffene Datenblock mittels get und nachfolgendem transfer im read-Modus vom Eingangs-Nest angefordert und in die Seiten-Tabellen83 der MMU eingetragen. Beim Austragen wird put, im Falle geänderter Seiten davor auch noch transfer im write-Modus mit geringer Hintergrund-IO-Priorität aufgerufen.
The realization of this module is relatively simple compared to conventional implementations:
if a page fault occurs, the affected data block is requested by get and subsequent transfer in read mode from the input nest and entered into the page tables 83 of the MMU. In the case of an ejection, put is called, in the case of changed pages before that, also transfer is called in write mode with a low background IO priority.

Über die später besprochene notify_*-Schnittstelle erhält mmu_* Kenntnis von durch die Speicherverwaltung zur Freigabe vorgesehenen physischen Datenblöcken, sowie von beispielsweise durch move-Operationen invalide gewordenen Adressbereichen und trägt sie wie soeben besprochen aus84. Hierauf können sie evtl. beim nächsten Seitenfehler gleich wieder angefordert werden, was aber relativ geringe Verzögerungen zur Folge hat, sofern sich die Seite in Wirklichkeit noch im zentralen LRU-Cache der transitiv vorgeschalteten buffer-Instanz befindet. Solche Rückforderungen können daher auf Verdacht und jederzeit von der Speicherverwaltung an zentraler Stelle85 ausgelöst werden, ohne die Aktivitäten eines Benutzerprozesses merklich zu stören. Dadurch ergibt sich eine fortlaufende Altersbestimmung innerhalb der Working-Sets (vgl. [Den68, Den71]) aller vorhandenen virtuellen Adressräume, was dem Effekt des bekannten Second-Chance-Algorithmus zur Seitenersetzung ähnelt. Als Nebeneffekt werden geänderte Seiten frühzeitig auf Verdacht mit Hintergrund-Priorität ausgelagert86, so dass bei einer später tatsächlich eintretenden Speicherknappheit eine Chance besteht; dass die Seite inzwischen nicht wieder modifiziert wurde und daher sofort recycelt werden kann, ohne auf die Beendigung von IO warten zu müssen.Through the notify_ * interface discussed later, mmu_ * receives knowledge of physical data blocks intended for clearance by the memory management, as well as of address areas which have become invalid, for example by means of move operations, and carries them out as just discussed 84 . On this they can possibly be requested again at the next page error, but this has relatively low delays result, if the page is in fact still in the central LRU cache of the transitive upstream buffer instance. Such recoveries can therefore be triggered on suspicion and at any time by the storage manager at a central location 85 without significantly disturbing the activities of a user process. This results in a continuous age determination within the working sets (compare [Den68, Den71]) of all existing virtual address spaces, which is similar to the effect of the known second-chance algorithm for page replacement. As a side effect, changed pages are swapped early on suspicion with background priority 86 , so that there is a chance for a later actually occurring memory shortage; meanwhile the site has not been modified again and therefore can be recycled immediately, without having to wait for the completion of IO.

In einem mmu_*-Baustein braucht keine wie auch immer geartete spezielle Paging-Strategie mit verschiedenen Modi und Abhängigkeiten von Mapping-Arten implementiert zu werden, was bei konventionellen Implementierungen den Löwenanteil an Komplexität ausmacht. Diese Aufgaben einschließlich der Persistenthaltung privater Mapping-Segmente werden von vorgeschalteten Bausteinen übernommen87.In a mmu_ * building block, no special paging strategy of any kind with different modes and dependencies of mapping types is needed, which is the lion's share of complexity in conventional implementations. These tasks, including the persistence of private mapping segments, are handled by upstream building blocks 87 .

Damit ein mmu_*-Baustein am Ende einer Baustein-Hierarchie stehen darf, muss die übliche Trennung in Spinlocks und schedulende Locks aufgehoben werden (siehe [K+91, LA93] sowie Abschnitt 3.3.5). Dies ist in SMP-Rechnern (Symmetric MultiProcessing) notwendig, um mehrere mmu_*-Instanzen auf verschiedene Prozessoren verteilen zu können oder mehrere auf verschiedene Prozessoren verteilte Kontrollflüsse auf der gleichen mmu_*-Instanz laufen zu lassen. Weiterhin ist erforderlich, dass Seitenfehler-Unterbrechungen die Nest-Operationen aufrufen dürfen (siehe [KE95] sowie Abschnitt 3.3.5). Die Realisierung von Schutzbereichen ist ebenfalls Aufgabe von mmu_*. Dazu ist eine Verknüpfung mit der Kontrollfluss-Implementierung nötig, die am besten ausserhalb der regulären Baustein-Verdrahtung gelöst wird, da sie davon unabhängig ist (dies gilt ebenfalls für die Anbindung an die Unterbrechungen)88. Verschiedene Schutzbereiche lassen sich am einfachsten durch Zuordnen verschiedener Mandate (vgl. Abschnitt 2.7) und unterschiedlicher Behandlung in untergeordneten check_*-Instanzen implementieren. Damit werden mmu_*-Instanzen zu Verwaltern derjenigen Mandate, die mit den Schutzbereichen zu tun haben.For a mmu_ * block to be at the end of a block hierarchy, the usual separation into spinlocks and scheduling locks must be removed (see [K + 91, LA93] and section 3.3.5). This is necessary in Symmetric MultiProcessing (SMP) machines to distribute multiple mmu_ * instances to different processors or to run multiple control streams distributed to different processors on the same mmu_ * instance. It is also required that page fault interrupts may call the nest operations (see [KE95] and section 3.3.5). The realization of protection areas is also the task of mmu_ *. This requires a link to the control flow implementation, which is best solved outside of the regular device wiring, since it is independent of it (this also applies to the connection to the interruptions) 88 . Different protection areas can be implemented most easily by assigning different mandates (see section 2.7) and different treatment in lower check _ * instances. With this, mmu_ * instances become administrators of those mandates that have to do with the protection areas.

4.1.8 adaptor_*4.1.8 adapter_ *

Siehe 19. Es handelt sich um einen Anpassungs-Baustein mit nur einem Eingang und einem Ausgang, der zwischen Nestern mit verschiedenen Kompetenzen und Verhalten wie beispielsweise verschiedenen transfer_size-Attributwerten vermittelt und übersetzt. Please refer 19 , It is an adaptation building block with only one input and one output, which mediates and translates between nests with different competencies and behaviors such as different transfer_size attribute values.

Adaption zwischen verschiedenen Zugriffs-Modellen Wie der Tabelle 6 auf Seite 133 zu entnehmen ist, gibt es folgende Fälle, in denen kein Anschluß von Eingängen an die Ausgänge anderer Bausteine möglich ist:

  • 1. Der Ausgang hat zu geringe Kompetenzen, um die Anforderungen durch das Verhalten der Eingänge abdecken zu können.
  • 2. Ein Eingang unterstützt nur singleuser-Verhalten und verträgt sich daher nicht mit anderen Eingängen.
Adaptation between different access models As can be seen from Table 6 on page 133, there are the following cases in which it is not possible to connect inputs to the outputs of other blocks:
  • 1. The output has too little competence to cover the requirements by the behavior of the inputs.
  • 2. An input only supports single-user behavior and is therefore incompatible with other inputs.

Für jeden dieser Fälle schlage ich vor, eine adaptor-Art einzuführen, die das jeweilige Problem löst. Fall 1 lässt sich beispielsweise durch adaptor_multi lösen, der die am Eingang nicht vorhandenen Lock-Operationen nachimplementiert. Zur Herstellung dermultiuser-Kompetenz brauchen die restlichen Operationen nur durchgereicht zu werden. Etwas aufwendiger ist die Herstellung der multiversion-Kompetenz, da in diesem Modus von jedem physischen Datenblock potentiell mehrere Versionen ins Spiel gebracht werden müssen und verwaltet werden müssen. In diesem Fall ist es sinnvoll, einen weiteren tmp- oder fast-Eingang analog zu buffer bzw zu cow (siehe Abschnitt 4.1.10) einzuführen, der die zusätzlichen Versionen und die damit verbundene Statusinformation enthält.For each of these cases I suggest to introduce an adapter type that addresses the particular problem solves. case 1 leaves For example, by adaptor_multi solve that at the entrance not implemented after existing lock operations. For the production dermultiuser competence need only pass the rest of the operations to become. Somewhat more elaborate is the production of multiversion competence, because in this mode of each physical data block potentially several Versions need to be brought into play and managed. In In this case, it makes sense to have another tmp or fast input analogous to buffer or cow (see section 4.1.10) the additional Contains versions and related status information.

Zur Lösung des Falls 2 schlage ich vor, einen Baustein adaptor_synchronize einzuführen. Dieser kann einen Eingang mit multiuser- oder multiversion-Verhalten voraussetzen, da diese Funktionalität notfalls durch adaptor_multi bereitgestellt werden kann. Da an jedem Ausgang immer nur ein einziger Konsument mit singleuser-Verhalten angeschlossen werden darf, muß adaptor_synchronize entsprechend viele Ausgänge haben, die ggf. zur Laufzeit nachträglich instantiiert oder gelöscht werden müssen.to solution In case 2, I propose a module adaptor_synchronize introduce. This can be an input with multiuser or multiversion behavior assuming that this functionality is provided by adaptor_multi can be provided. Because at each exit always only one Consumers with singleuser behavior may be connected, must adaptor_synchronize correspondingly many outputs have to be subsequently instantiated or deleted at runtime have to.

Die Problematik von adaptor_synchronize besteht darin, daß jeder Ausgang die Illusion erhalten muß, er sei der einzige Konsument einer Nest-Instanz, der Änderungen durchführt. Eine solche Illusion wird auch von klassischen Datenbank-Transaktionen erzeugt. Zur Herstellung dieser Illusion ist daher prinzipiell auch der Baustein transaction (Abschnitt 4.1.11) geeignet. Aus der Transaktionstheorie ist bekannt, dass eine vollständige Isolation der Teilnehmer bei beliebigen, nicht vorhersagbaren und echt parallelen Aktionen verschiedener singleuser-Teilnehmer nicht möglich ist, ohne die Gefahr von Deadlocks oder Rollbacks in Kauf zu nehmen. Daher schlage ich eine Aufteilung der Funktionalität vor: echte Parallelität soll durch transaction ermöglicht werden; eine eingeschränkte und leichter zu implementierende Form der Illusion von singleuser-Verhalten wird durch adaptor_synchronize hergestellt. Dies geschieht folgendermassen:
Wir nehmen an, daß die Konsumenten an den Ausgängen statuslos arbeiten, d.h. sie fordern Datenblöcke mittels get nur für einen relativ begrenzten Zeitraum an und geben sie möglichst bald wieder mittels put frei. Bei völliger Statuslosigkeit kann man damit rechnen, dass jeder Konsument recht bald alle seine Blöcke wieder freigeben wird, oder dass zumindest eine vollständige Rückforderung mittels notify_*-Operationen (siehe Kapitel 5) möglich ist. Unter dieser Voraussetzung läßt sich eine einfache Strategie durch Locks implementieren, indem zu einem Zeitpunkt jeweils nur ein einziger Ausgang Zugriff auf den Status des Eingangs erhält; die anderen müssen solange warten, bis dieser sämtlichen Status zurückgegeben hat. Sobald irgendwelche Anforderungen durch einen anderen Ausgang ankommen, während irgendein Status bereits vergeben ist, dann versucht die adaptor_synchronize-Implementierung, den anderweitig vergebenen Status mittels notify_* wieder baldmöglichst zurückzubekommen89. Dies schränkt die Parallelität leider sehr stark ein, ist aber einfach zu implementieren, vermeidet Deadlocks und kommt ohne Rollback-Operationen aus, die bei echt parallelen Transaktionen und vorher nicht bekanntem Zugriffsverhalten nicht vermeidbar90 sind.
The problem with adaptor_synchronize is that every output has the illusion that it is the only consumer of a Nest instance that makes changes. Such an illusion is also generated by classical database transactions. In principle, the block transaction (Section 4.1.11) is also suitable for producing this illusion. From the transaction theory is known that a complete isolation of the participants in any unpredictable and really parallel actions of different single user participants is not possible without the risk of deadlocks or rollbacks in purchasing. Therefore, I propose a distribution of functionality: true parallelism is to be enabled by transaction; a limited and easier-to-implement form of the illusion of single-user behavior is provided by adaptor_synchronize. This happens as follows:
We assume that consumers work stateless at the exits, ie they request data blocks using get only for a relatively limited period of time and release them as soon as possible using put. In complete statelessness one can count on the fact that each consumer will soon release all its blocks again, or that at least a complete recovery through notify _ * - operations (see chapter 5) is possible. Under this condition, a simple strategy can be implemented by locks by having only one output at a time accessing the status of the input; the others have to wait until they have returned all their status. As soon as any requests arrive through another exit while any status is already taken, then the adaptor_synchronize implementation tries to get the otherwise assigned status back as soon as possible using notify_ * 89 . This unfortunately limits the parallelism very strong one, but it is easy to implement, avoids deadlock and does not need a rollback operations parallel in real transactions and not previously known access behavior are unavoidable 90th

Die Konsequenz aus dieser Misere ist meines Erachtens, dass man das singleuser-Programmiermodell vermeiden sollte und Konsumenten mit explizitem multiuser- oder multiversion-Verhalten91 (Kapitel 7) ausstatten sollte, wann immer es möglich ist (sofern man Wert auf Parallelität, Skalierbarkeit und Performanz legt)92. In diesem Sinne ist adaptor_synchronize nur als Notbehelf zu verstehen und einzusetzen.The implication of this misery is, in my opinion, that one should avoid the single-user programming model and provide consumers with explicit multiuser or multiversion behavior 91 (Chapter 7) whenever possible (assuming parallelism, scalability, and performance puts) 92 . In this sense, adaptor_synchronize should only be understood and used as a makeshift solution.

Adaption zwischen verschiedenen transfer_size-Werten Im Idealfall sollten sich Baustein-Implementierungen nicht um das Problem kümmern müssen, dass die transfer_size eines Ausgangs mit derjenigen eines Eingangs zusammenpassen muss. Diese Umwandlungs-Aufgabe sollte an adaptor_* delegiert werden können.adaptation between different transfer_size values ideally should Building block implementations do not have to worry about the problem that the transfer_size of an output match that of an input got to. This conversion task should be delegable to adaptor_ *.

Im Allgemeinen kann es vorkommen, dass die beteiligte Transfergrößen keine Teiler voneinander bilden. Dieser Fall taucht in der Praxis kaum auf, weil aus guten Gründen nur Zweierpotenzen93 als feste Transfergrößen benutzt werden. Falls er dennoch auftreten sollte94, kann man sich auf folgende Weise behelfen: man bestimme den ggT (größter gemeinsamer Teiler) der beiden vorkommenden Transfergrößen. Dann schalte man zwei adaptor_*-Instanzen hintereinander, wovon die erste von der Eingangs-Transfergröße auf den ggT hinunter transformiert, die zweite vom ggT wieder auf die Ausgangsgröße hoch transformiert. Im Folgenden beschränke ich mich daher auf die Annahme, dass eine der beiden Transfergrößen ein Vielfaches der anderen darstellt. Es sind zwei Fälle zu unterscheiden:

  • 1. Hochtransformation von einer kleinen transfer_size am Eingang zu einer größeren am Ausgang
  • 2. Hinuntertransformation von einer großen transfer_size am Eingang zu einer kleineren am Ausgang
In general, it may happen that the involved transfer sizes do not form divisors of each other. This case hardly appears in practice because, for good reasons, only powers of two 93 are used as fixed transfer quantities. If it should nevertheless occur 94 , one can manage in the following way: one determines the gcd (largest common divisor) of the two occurring transfer sizes. Then switch two adaptor_ * instances in succession, the first of which transforms from the input transfer size down to the gcd, the second from the gcd to the output size. In the following, I restrict myself to the assumption that one of the two transfer quantities represents a multiple of the others. There are two cases:
  • 1. Up-transform from a small transfer_size at the entrance to a larger one at the exit
  • 2. Down transformation from a large transfer_size at the entrance to a smaller one at the exit

Bei der Hochtransformation besteht das Problem, dass der Konsument an seinem Eingang und damit auch am Ausgang des adaptor_* erwartet, dass eine get-Operation einen physisch zusammenhängenden Datenblock mit mindestens seiner Transfergröße liefert. Da am Eingang des adaptor_* eine kleinere Transfergröße eingestellt ist, braucht der dort angeschlossene Produzent nicht unbedingt Datenblöcke mit dieser Größe und/oder nicht unbedingt an entsprechend ausgerichteten Adressgrenzen im physischen Hauptspeicher zu liefern (allerdings wird jedem Produzenten geraten, dies dennoch zu erfüllen, wenn es im Einzelfall ohne größere Kosten möglich ist).at The transformation is the problem that the consumer is facing its input and thus also at the output of the adaptor_ * expected that a get operation is a physically contiguous block of data with at least its transfer size. Because at the entrance of the adaptor_ * set a smaller transfer size is, the attached producer does not necessarily need data blocks this size and / or not necessarily at appropriately aligned address limits in to supply physical memory (however, every producer advised to fulfill this if it is in an individual case without major costs possible is).

Im Allgemeinen ist es wünschenswert, dass der Eingang an multiuser- oder multiversion-Verhalten teilnehmen kann und damit weitere parallel arbeitende Konsumenten zuläßt, die unabhängig voneinander Blöcke mittels get anfordern und halten können. In diesem Fall kommt ein Verschieben von Blöcken im Hauptspeicher an „günstigere" physische Adressen im allgemeinen nicht in Frage95. Wenn man den Eingang nicht im singleuser-Modus betreiben möchte, dann bleibt wohl oder übel nichts anderes übrig, als physische Kopien von Datenblöcken herzustellen.In general, it is desirable for the input to be able to participate in multiuser or multiversion behavior, allowing more concurrent consumers to independently request and hold blocks using get. In this case, shifting blocks in main memory to "cheaper" physical addresses is generally out of the question 95. If you do not want to operate the input in single-user mode, then there is nothing left but to make physical copies of data blocks ,

Eine von einem adaptor_* hergestellte physische Kopie muss auch von diesem Baustein bezüglich der Referenzzähler, Speicherfreigabe usw. verwaltet werden; beim letzten put auf einer zum Schreiben freigegebenen Kopie müssen die Änderungen auf das Original bzw auf die kleineren Original-Teile rückübertragen werden.A A physical copy made by an adapter_ * must also be from this Module with respect the reference counter, Memory release, etc. are managed; at the last put on one For copying shared copy the changes must be made to the original or be transferred back to the smaller original parts.

Bei genauerer Betrachtung des Problems fällt auf, dass die Herstellung von physischen Kopien eventuell die Chance birgt, die mögliche Parallelität von Operationen dadurch zu erhöhen, dass die verschiedenen Versionen ausdrücklich für ein multiversion-Modell am Ausgang genutzt werden, auch wenn der Eingang nur multiuser-Verhalten weiterreicht. Eventuell bietet es sich an, die Funktionalität von adaptor_multi gleich hier mit zu integrieren, bzw. adaptor multi_gleich mit der Hochtransformations-Fähigkeit auszustatten, so daß ein einziger Baustein-Typ beide Aufgaben erledigt. Zur Hinuntertransformation: hier besteht das Problem der Transfergrößenunterschiede nicht, da eine kleinere teilbare Transfergröße die Bedingungen der größeren bereits von selbst erfüllt. Bei der Weitergabe physischer Adressen an den Ausgang ist lediglich zu beachten, dass diese innerhalb eines Blocks liegen können, der vom Eingang geliefert wurde. Bei der Rückgabe mittels put muss eine solche physische Adresse wieder auf die transfer_size des Eingangs normiert werden, was durch Divisionen und Multiplikationen, bei Zweierpotenzen auch durch Ausmaskieren von Adressbits erfolgen kann.at closer consideration of the problem is striking that the production of physical copies may hold the chance of possible parallelism of operations thereby increasing that the different versions are expressly for a multiversion model on Output can be used even if the input only multiuser behavior passes. It may be appropriate to use the functionality of adaptor_multi right here to integrate, or adapter multi_gleich with the High transformation capability equip so that a single block type does both tasks. For the down transformation: here is the problem of transfer size differences not, as a smaller divisible transfer size the conditions the larger one already from self fulfilled. When passing physical addresses to the output is only to note that these may be within a block, the delivered from the entrance. When returning by means of put a must such physical address back to the transfer_size of the input to be normalized, what by division and multiplication, at Power of two can also be done by masking out address bits.

Die Hinuntertransformation hat jedoch mit einem Problem zu kämpfen, das bei der Hochtransformation nicht existiert, weil es dort aus Symmetriegründen bereits von selbst erfüllt ist: die move-, clear- und delete-Operationen können vom Konsumenten am Ausgang in kleineren Portionen angefordert werden, als sie vom Produzenten am Eingang zur Verfügung gestellt werden. Daher ist eine einfache Durchreichung dieser Operationen an den Produzenten im Allgemeinfall leider nicht möglich.The Downward transformation, however, has to contend with a problem that does not exist in the high transformation, because it already there for symmetry reasons fulfilled by itself is: the move, clear and delete operations can be done by the consumer at the exit to be requested in smaller portions than they are from the producer available at the entrance be put. Therefore, a simple submission of these operations unfortunately not possible to the producer in the general case.

Zur Lösung dieses Problems könnte ein adaptor_* die move-Operation komplett neu implementieren, ohne davon Gebrauch zu machen, dass der Eingang bereits ein dynamisches Nest bereitstellt. Dies widerspräche jedoch dem Ziel, die Bausteine zur „möglichst orthogonalen" Zerlegung der in Betriebssystemen vorkommenden Aufgaben einzusetzen. Was bedeutet jedoch „möglichst orthogonal"? Für die Beurteilung der Orthogonalität und Homogenität eines Baustein-Verhaltens sehe ich als wichtiges Kriterium, ob eine Transformation wieder durch eine rückläufige Transformation aufgehoben werden kann, oder zumindest bis auf einen konstanten Rest aufgehoben werden kann (Prinzip der Kompensierbarkeit). Dies würde bedeuten, dass eine Hinuntertransformation mit nachgeschalteter Hochtransformation auf die ursprüngliche transfer_size nichts am Inhalt eines Nestes ändern sollte, also insgesamt eine idempotente Abbildung darstellen sollte.To solve this problem, an adaptor_ * could completely redeploy the move operation, without making use of the fact that the entrance already provides a dynamic nest. However, this would contradict the goal of using the building blocks for the "most orthogonal" decomposition of tasks occurring in operating systems, but what does "orthogonal" mean? For the evaluation of the orthogonality and homogeneity of a building block behavior, I see as an important criterion whether a transformation can be reversed again by a retrograde transformation, or at least can be reversed to a constant remainder (principle of compensability). This would mean that a down transformation with a downstream high transformation to the original transfer_size should not change the content of a nest, so overall it should represent an idempotent mapping.

Leider ist dies aus informationstheoretischen Gründen in vollkommener Reinform nicht möglich: Um die Aufteilung einer gegebenen festen Anzahl von Nutzbytes auf einen ebenfalls festen größeren Adressraum mit Löchern zu verwalten, muss irgendwo Platz für die Darstellung dieser Zustandsinformation aufgewandt werden. Wenn man den Nutzinhalt auf den größeren Adressraum irgendwie (z.B. zufällig in einer Art Schweizerkäse) verteilt, dann gibt es für die Anzahl solcher möglichen Verteilungen um so mehr Möglichkeiten, je kleiner die transfer_size gewählt wird (der Schweizerkäse darf bildlich gesprochen immer kleinere Löcher und auch mehr Löcher enthalten, obwohl er weder sein Gewicht noch sein Volumen ändert). Welche dieser vermehrten Möglichkeiten konkret vorliegt, muss irgendwo gemerkt und abgespeichert werden, was aus informationstheoretischen Gründen einen Platzbedarf zur Folge hat, der mit immer kleinerem transfer_size zumindest im Worst Case ansteigt96. Hieraus folgt, dass es im Allgemeinen nicht möglich ist, die transfer_size nach unten zu transformieren, ohne dass irgendwo zusätzlicher Platz für die Speicherung der nunmehr feineren Abbildungsmöglichkeiten für den Definitionsbereich des Nestes verbraucht wird.Unfortunately, this is not possible in perfect pure form for information-theoretical reasons: In order to manage the distribution of a given fixed number of payload bytes to a likewise fixed, larger address space with holes, space must be used somewhere for the representation of this status information. If you distribute the useful content on the larger address space somehow (eg randomly in a kind of Swiss cheese), then there are more possibilities for the number of such possible distributions, the smaller the transfer_size is chosen (the Swiss cheese may figuratively ever smaller holes and also contain more holes although it does not change its weight or volume). Which of these increased possibilities actually exists must be noted and stored somewhere, which, for information-theoretical reasons, results in a need for space that increases with ever smaller transfer_size, at least in the worst case 96 . It follows that in general it is not possible to transform the transfer_size down without any additional space being consumed for storing the now finer imaging possibilities for the domain of definition of the nest.

Dies bedeutet jedoch nicht, dass zusätzlicher Platz in allen Fällen verbraucht werden muss. Ich kann von einer Hinuntertransformation folgende wünschenswerte Eigenschaft verlangen:
Falls am Ausgang der Hinuntertransformation nur solche Operationen ausgeführt werden, die auch ohne die Hinuntertransformation stattfinden könnten, weil sie (zufälligerweise) die Bedingungen der größeren transfer_size am Eingang bereits erfüllen, dann sollte am Ausgang der Hinuntertransformation derselbe Nest-Zustand sichtbar sein, als wäre die Hinuntertransformation nicht vorhanden. Dies bedeutet u.a., dass in diesem Fall kein Platz für interne Verwaltungsinformationen abgezwackt werden darf (der Sachverhalt als solcher kann im Meta-Nest mit geringen Platzkosten vermerkt werden). Eine derartige Hinuntertransformation stellt in gewissem Sinn eine Verfeinerung des Eingangs-Nestes am Ausgang zur Verfügung.
However, this does not mean that extra space needs to be consumed in all cases. I can request the following desirable property from a down transformation:
If only those operations are performed at the output of the down transformation that could take place without the down conversion because they (coincidentally) already satisfy the conditions of the larger transfer_size at the input, then the same nest condition should be visible at the output of the down transformation Down transformation not available. This means, among other things, that in this case no space for internal administrative information may be zwzwackt (the facts as such can be noted in the meta-nest with low space costs). Such subthreshold, in a sense, provides refinement of the input nest at the output.

Zu realisieren ist eine solche Verfeinerung im Prinzip dadurch, dass nur die Unterschiede zu der gröberen Eingangsstruktur intern verwaltet werden. Bei dieser Verwaltung tritt u.a. das in der Literatur bekannte Problem des internen Verschnitts auf, für das es mehrere Lösungsansätze gibt97. Auf weitere Details möchte ich in dieser Arbeit nicht eingehen.Such a refinement is in principle realized by the fact that only the differences to the coarser input structure are managed internally. Among other things, this problem is compounded by the problem of internal blending known in the literature, for which there are several possible solutions 97 . I do not want to go into further details in this work.

4.1.9 redirect4.1.9 redirect

Dieser Baustein (siehe 20) realisiert die Funktionalität von Hard- und Softlinks98, sowie von Mount-Punkten und -Tabellen. Er hat zwei Eingänge und einen Ausgang. Vom ersten Eingang wird standardmäßig das Meta-Nest (falls dieses leer sein sollte, auch das Daten-Nest) abgefragt, ob es einen Pfad im Auto-Instantüerungs-Netzwerk enthält. Der zweite Eingang wird daraufhin mit dem angegebenen (ggf. noch zu konstruierenden) Ausgang automatisch verbunden, der dann wiederum am Ausgang unverändert zur Verfügung steht. Weitere Details sind in Abschnitt 4.2 erklärt.This module (see 20 ) realizes the functionality of hard and soft links 98 , as well as mount points and tables. It has two inputs and one output. By default, the first input queries the meta-nest (if it should be empty, including the data-nest) if it contains a path in the auto-instantiation network. The second input is then automatically connected to the specified (possibly still to be constructed) output, which in turn is then available at the output unchanged. Further details are explained in section 4.2.

4.1.10 cow4.1.10 cow

Dieser Baustein (siehe 21) realisiert die von konventionellen privaten Mappings bekannte Copy-on-Write-Strategie. Er hat zwei Eingänge, die mit orig und tmp bezeichnet sind, sowie einen mit merged bezeichneten Ausgang.This module (see 21 ) implements the copy-on-write strategy known from conventional private mappings. It has two inputs labeled orig and tmp, and one called merged output.

Im initialen Zustand ist das mit tmp bezeichnete Eingangs-Nest leer, und am mit merged bezeichneten Ausgang erscheint exakt derselbe Nest-Zustand wie am orig-Eingang. Die Aufgabe besteht in der Isolation des orig-Eingangs von allen Änderungen, die vom Konsumenten hinten am merged-Ausgang in Auftrag gegeben werden. Jegliche Änderungen am Nest-Inhalt des Ausgangs oder an seinem Adressraum müssen ausschließlich im tmp-Nest eingetragen und zwischen-gepuffert werden, damit sie keine tatsächlichen Änderungen am orig-Eingang bewirken.in the initial state, the input nest labeled tmp is empty, and the exit marked merged will appear exactly the same Nest state as at orig entrance. The task is in isolation the orig input of all changes, which are commissioned by the consumer behind at the merged exit. Any changes at the nest contents of the output or at its address space must exclusively in the tmp nest be registered and buffered so they do not actual changes effect at the orig entrance.

Die Implementierung von write-Transferoperationen bzw. get im Schreibmodus ist relativ einfach und folgt der bekannten Methodik, wobei Löcher im Definitionsbereich von tmp direkt ausnutzbar sind. Schwieriger ist die Bereitstellung von move-Operationen. Eine Analyse dieses Teilproblems ergibt, dass es starke Verwandtschaft mit der Adressverschiebungs-Problematik bei den map-Bausteinen besitzt. Eine mögliche Realisierung ist daher die interne Verwendung eines map-Bausteins, der allerdings auch mit Löchern im orig-Nest korrekt umgehen können sollte.The implementation of write-transfer operations or get in the write mode is relatively simple and follows the known methodology, whereby holes in the domain of tmp are directly exploitable. More difficult is the provision of move operations. An analysis of this subproblem shows that it has a strong relationship with the address shifting problem in the map building blocks. One possible implementation is therefore the internal use of a map module, which however should be able to handle holes in the orig nest correctly.

4.1.11 transaction4.1.11 transaction

Im Unterschied zu Datenbanken, wo Transaktions-Identifier (TIDs) meist fest mit Prozessen verknüpft sind, verstehe ich unter einer Transaktion eine logische Sicht auf einen Datenbestand, die die bekannte ACID-Eigenschaft (oder Eigenschaften anderer Transaktions-Paradigmen) besitzt, und die von beliebig vielen Prozessen kooperativ (bzw. bei Verwendung zusätzlicher Sperren auch im multiuser- oder multiversion-Modell) nutzbar ist. Durch die Aufgabe fester Zuordnungen zwischen Prozessen und Datenräumen wird insbesondere auch ermöglicht, dass ein Prozess an mehreren Transaktionen, auch parallel, teilnehmen darf. Das Standard-Szenario einer festen 1:1 Zuordnung zwischen Prozessen und Datenräumen ist als Spezialfall in diesem Modell enthalten.in the Difference to databases where transaction identifiers (TIDs) mostly are firmly linked to processes, Under a transaction I understand a logical view of one Dataset containing the well-known ACID property (or properties other transactional paradigms), and those of any number of processes cooperative (or, if additional locks are used, also in multiuser or multiversion model). Solidified by the task In particular, mappings between processes and data spaces will also be allows that a process participates in several transactions, also in parallel may. The default scenario of a fixed 1: 1 mapping between Processes and data spaces is included as a special case in this model.

Sequentielle Transaktionen Sequential transactions

Ein cow-Baustein (siehe 21) realisiert bereits einen wichtigen Teil der bekannten Isolations-Funktionalität von Transaktionen (siehe 22): um eine Rollback-Operation zu simulieren, braucht man lediglich den Inhalt des tmp-Nestes zu vergessen und den merged-Ausgang wieder auf den initialen Zustand des orig-Eingangs zu setzen. Ein transaction-Baustein läßt sich im Prinzip als leicht modifizierter cow-Baustein realisieren, der seine grundsätzliche Funktionsweise von cow erbt.A cow building block (see 21 ) already realizes an important part of the known isolation functionality of transactions (see 22 ): To simulate a rollback operation, all you have to do is forget the contents of the tmp nest and set the merged output back to the initial state of the orig input. A transaction module can be realized in principle as a slightly modified cow block, which inherits its basic operation of cow.

Die Commit-Operation läßt sich prinzipiell dadurch realisieren, dass man einfach gar nichts tut: man hört auf, Änderungen am merged-Ausgang vorzunehmen, und betrachtet seinen Zustand als „eingefroren". Ein derartig „eingefrorenes" Nest dient nun insbesondere als Ausgangspunkt für eine zeitlich nachfolgende (nicht-parallele) Transaktion, deren orig-Eingang mit dem merged-Ausgang der jeweils letzten erfolgreich abgeschlossenen Transaktion verbunden wird, so dass im Endeffekt lange Ketten entstehen, die alle historischen Zwischenschritte der von den Transaktions-Operationen ausgelösten Zustände des Nestes repräsentieren. Der Ausgang der letzten erfolgreich abgeschlossenen transaction-Instanz einer Kette wird Aktualversion genannt. Hinter der Aktualversion darf vorläufig nur eine einzige, noch nicht abgeschlossene Transaktion angeschlossen werden; ansonsten könnten divergierende Versions-Splits99 entstehen, die dem Konzept einer einheitlichen logischen Sicht widersprechen.In principle, the commit operation can be accomplished by simply doing nothing: stopping changes to the merged output, and viewing its state as "frozen." Such a "frozen" nest now serves as a starting point for one temporal successive (non-parallel) transaction whose orig input is merged with the merged output of the most recent successfully completed transaction, ultimately creating long chains representing all the historical intermediate steps of the states of the nest triggered by the transaction operations , The output of the last successfully completed transaction instance of a chain is called the actual version. For the time being, only a single, incomplete transaction may be added after the current version; otherwise divergent version splits 99 could emerge that contradict the concept of a unified logical view.

Es ist klar, dass solche Ketten nicht beliebig lang werden dürfen. Die Entfernung von Bausteinen ohne Änderung der Semantik ist auf folgende Weise möglich: eine abgeschlossene Transaktion darf ohne weiteres Invariante interne Operationen ausführen, die von außen durch die (gegenüber cow neu hinzukommende) Operation integrate angestoßen werden und bewirken, dass das Ausgangs-Nest weiterhin von außen betrachtet denselben eingefrorenen Zustand behält, während der Inhalt des tmp-Eingangs in das orig-Eingangsnest integriert wird, so dass das tmp-Nest immer kleiner wird, bis es schließlich völlig leer wird. Bei dieser Integrations-Operation wird der Inhalt des orig-Eingangs so verändert, dass er schließlich mit dem eingefrorenen merged-Ausgang übereinstimmt; damit ist die Isolation aufgehoben. Ab diesem Zeitpunkt darf man den nunmehr völlig statuslos gewordenen transaction-Baustein aus der Kette entfernen, ohne dass sich Seiteneffekte ergeben.It It is clear that such chains can not be arbitrarily long. The Removal of building blocks without change The semantics is possible in the following way: a completed Transaction may execute internal operations without further invariant from the outside through the (opposite cow newly added) operation to be initiated and cause the starting nest to continue to be viewed from the outside retains the same frozen state while the contents of the tmp input is integrated into the orig entrance nest, so the tmp nest always gets smaller until it finally completely becomes empty. In this integration operation, the contents of the orig input so changed that he finally matches the frozen merged output; that is the Isolation lifted. From now on you can now completely stateless remove the transaction block from the chain, without Side effects arise.

Parallele Transaktionen Parallel transactions

Mit der soeben vorgestellten Methodik lassen sich nur rein sequentiell nacheinander ablaufende Transaktionen modellieren.With The methodology just presented can only be done in a sequential manner modeling successive transactions.

Zur Herstellung echter Parallelität zwischen mehreren transaction-Instanzen müssen diese unbedingt an derselben Aktualitätsversion angeschlossen werden (sofern sie nicht absichtlich mit einem veralteten Zustand beginnen wollen); siehe 23. Wenn man dies mit getrennten Einzel-Bausteinen für jede Transaktion realisieren würde, dann müssten sich die verschiedenen Transaktions-Sichten über diesen oder einen anderen Anschluss-Punkt auf dem aktuellen Stand halten und jede für sich den aktuellen Status an ihrem Eingang nachvollziehen, was im Prinzip möglich wäre, aber eine Vervielfachung von immer gleichartigen Operationen an mehrere Stellen bewirken würde100. Um diesen Aufwand zu sparen, ist es günstiger, eine konventionelle Implementierung von Transaktionen (siehe z.B. [GR93]), eventuell auch von verschiedenen Transaktions-Modellen (siehe z.B. [Elmbe]) in einen Baustein zu verpacken, der einen internen zentralen Puffer für die Verwaltung aller vorkommenden Versionen benutzt, und/oder dessen Eingang im multiversion-Modus arbeitet (dann muss allerdings auch die restliche Infrastruktur des Systems mitspielen).To create true parallelism between multiple transaction instances, they must be attached to the same update version (unless they intentionally start with an outdated state); please refer 23 , If this were done with separate individual building blocks for each transaction, then the different transaction views would have to keep up to date via this or another connection point, each tracking the current status at their entrance, which in principle would be possible but would cause a multiplication of always similar operations to multiple locations 100 . To save this effort, it is better to have a conventional implementation of transactions (see eg [GR93]), possibly also of different transaction Mo packaging (see, for example, [Elmbe]) into a building block that uses an internal central buffer to manage all the existing versions, and / or whose input works in multiversion mode (but then the rest of the infrastructure must also be present).

Bei der Kombination von Transaktionen mit Schutzbereichen kann das Baustein-Konzept mit Funktionalitäten aufwarten, die in konventionellen Betriebssystem-Implementierungen einen erheblichen Aufwand verursachen würden. Ein Beispiel ist das Exeption-Handling in konventionellen Laufzeitumgebungen. Dieses kann auf einen Fehler nur noch reagieren, ihn aber meist nicht reparieren, da es beim Auftreten des Fehlers bereits „zu spät" ist. Transaktionen bieten die Möglichkeit, auf frühere Zustände von Adressräumen zurückzusetzen und erneute Versuche zu starten, und zwar auch auf ganze Kollektionen und Konfigurationen von Adressrüumen (spekulative Ausführung).at The combination of transactions with protection areas can be the building block concept with functionalities come up in conventional operating system implementations would cause a considerable effort. An example is this Exception handling in conventional runtime environments. This can only react to a mistake, but usually do not fix it, since it is already "too late" when the error occurs. Transactions offer the possibility on earlier conditions of address spaces reset and to try again, even on whole collections and configurations of address spaces (speculative execution).

Sehr interessant dürfte auch die Kombination von Transaktions-Bausteinen mit den nun folgenden Baustein-Typen sein, die verteilte Systeme in Netzwerken ermöglichen, und zwar je nach Einsatz-Stelle auf verschiedenen Ebenen einer Baustein-Hierarchie. Very interesting also the combination of transaction blocks with the following block types which enable distributed systems in networks, depending on the job site at different levels of a building block hierarchy.

4.1.12 remote4.1.12 remote

Dieser Baustein (siehe 24) implementiert das Client-Server-Paradigma. Ein Nest wird auf einem anderen Rechner so verfügbar gemacht, dass seine Eigenschaften nicht von einem lokalen Nest unterscheidbar sind.This module (see 24 ) implements the client-server paradigm. A nest is made available on another machine so that its properties are indistinguishable from a local nest.

Die Realisierung des Netzwerk-Protokolls kann statuslos erfolgen, wenn man eine buffer-Instanz nachschaltet, die durch ihr Caching den Datenverkehr über die interne Netzwerk-Verbindung in vielen Fällen reduziert und nebenbei die Latenzzeit vieler Operationen senkt. Bei einer statuslosen Realisierung hält der Client-Teil keinerlei Status-Informationen über den Zustand des Nestes vor, sondern muss jede einzelne Operation an den Server durch reichen. Dies führt zu einer hohen Einfachheit, Robustheit, Unabhängigkeit und Absturzsicherheit.The Realization of the network protocol can be stateless, if you add a buffer instance that caches the buffer Traffic over the internal network connection is reduced in many cases and incidentally lowers the latency of many operations. In a stateless realization holds the Client part no status information about the state of the nest but must pass each and every operation to the server. this leads to to a high simplicity, robustness, independence and fall protection.

Fragen der Einbruchssicherheit in Netzwerke, Verschlüsselung, Authentifizierung usw. sind eine interne Angelegenheit der Baustein-Implementierung; in dieser Arbeit wird hierauf nicht weiter eingegangen.ask burglary security in networks, encryption, authentication etc. are an internal matter of the building block implementation; This work will not be discussed further here.

4.1.13 mirror4.1.13 mirror

Dieser Baustein (siehe 25) realisiert das Konzept von Verteiltem Gemeinsamen Speicher (distributed shared memory).This module (see 25 ) implements the concept of Distributed Shared Memory.

Eine Baustein-Instanz von mirror darf sich über mehrere physikalisch getrennte Rechner erstrecken, die miteinander über interne (nicht von außen sichtbare) Kommunikationsmechanismen in Verbindung stehen (hierfür bietet sich insbesondere Gruppenkommunikation an). Die Verteilung der Baustein-Instanz über mehrere Rechner wird im Bild durch gestrichelte Linien angedeutet. Ein- und Ausgänge sind im Grundmodell paarweise in der gleichen Anzahl vorhanden. Die Ausgänge stellen dieselbe Funktionalität dar, wie sie in einem nicht-verteilen System von der gemeinsamen Verdrahtung mehrerer Eingänge auf denselben Ausgang erfüllt wird: überall herrscht die gleiche logische Sicht, das Nest ist logisch betrachtet identisch und ermöglicht Kooperation im multiuser- oder multiversion-Modell.A The building block instance of mirror is allowed to be physically separated over several Extend computers that communicate with each other via internal (not visible from the outside) Communication mechanisms (this provides especially group communication). The distribution of the block instance over several Calculator is indicated in the picture by dashed lines. One- and outputs are present in pairs in the same number in the basic model. The exits provide the same functionality as they are in a non-distributed system of the common Wiring of several inputs is fulfilled at the same exit: everywhere prevails the same logical view, the nest is logically identical and allows Cooperation in the multiuser or multiversion model.

Diese knappe, aber vollständige Funktionsbeschreibung läßt viele Möglichkeiten für die Realisierung zu, die im Wesentlichen den bekannten Techniken aus der Literatur folgen kann (siehe z.B. [TSF90, Doe96, Esk96]). Was die Eingänge enthalten, kann bei verschiedenen mirror_*-Typen stark voneinander abweichen. Ich werde zwei Extremfälle kurz erläutern:
Bei einer Realisierung namens mirror_replicate enthalten alle Eingänge den gleichen Nest-Zustand wie die Ausgänge. Jede an irgendeinem Ausgang ankommende Änderung wird sofort auf alle Eingänge aller verteilten Teil-Instanzen durch gereicht. Bei parallelem Zugriff auf mehreren Rechnern erfordert dies im Regelfall verteilte interne Synchronisationsoperationen, um die Konsistenz jederzeit zu wahren.
This concise but complete functional description allows many possibilities for implementation, which can essentially follow the known techniques of the literature (see eg [TSF90, Doe96, Esk96]). What the inputs contain can vary greatly with different mirror _ * types. I'll briefly explain two extreme cases:
In a realization called mirror_replicate, all inputs contain the same nest state as the outputs. Any change arriving at any output is immediately passed through to all inputs of all distributed sub-instances. With parallel access to multiple machines this usually requires distributed internal synchronization operations to maintain consistency at all times.

Das dadurch verursachte Problem relativ hoher Latenzzeiten läßt sich durch rchner-lokales Nachschalten je einer buffer-Instanz hinter die Ausgänge in vielen Fällen abmildern; daher kann die interne Realisierung der Kommunikationsprotokolle weitgehend statuslos erfolgen.The This causes relatively high latency problems by runter-local downstream of each buffer instance behind the exits in many cases mitigate; therefore, the internal realization of the communication protocols largely stateless.

Eine andere Realisierung namens mirror_primarycopy besitzt nur einen einzigen Eingang, der einem ausgezeichneten Rechner fest zugeordnet ist und stets dort verbleibt, auch wenn weitere Ausgänge auf anderen Rechnern dynamisch hinzugefügt oder weggenommen werden.Another implementation called mirror_primarycopy has only a single input, the one is permanently assigned to the computer and always remains there, even if other outputs are dynamically added or removed on other computers.

Schließlich möchte ich noch auf Mischformen zwischen den beiden Extremen der vollständigen Replikation aller Daten und der replikationslosen Primärkopie hinweisen. Dazu gehören Baustein-Varianten, die ihre Eingänge nicht für Replikate, sondern für die Bereitstellung der Summe alles vorhandenen Platzes zu verwenden (disjunkt verteilter Speicher). Es ist prinzipiell möglich, einen Baustein mirror_general zu schaffen, der sowohl die Extremfälle der vollständigen Replikation als auch der Primärkopie, als auch beliebige Mischformen mit teilweiser Replikation, als auch Mischformen mit disjunkt verteiltem Speicher abdeckt.Finally, I want still on hybrid forms between the two extremes of complete replication all data and the replication-free primary copy. These include building block variants, their entrances not for Replicas, but for to use the provision of the sum of all available space (disjoint distributed memory). It is possible in principle, one Building block mirror_general that covers both the extreme cases of complete Replication as well as the primary copy, as well as any mixed forms with partial replication, as well Covering mixed forms with disjointly distributed memory.

Zu erwähnen ist weiterhin, dass die RAID-Konzepte (Redundant Array of Inexpensible Disks, vgl. [CLG+93]) als Spezialfall von mirror mit einer je nach RAID-Level besonderen Art der Redundanz-Verteilung aufgefasst werden können: es wird lediglich auf eine Verteilung der Ein- und Ausgänge auf verschiedene Rechner verzichtet. Eine effiziente Realisierung von mirror sollte sich daher darum bemühen, dass lokale Replikation keinen merklichen Overhead zur Folge hat. Damit würde es sich auch für die Aufgabengebiete eignen, in denen bisher Software-RAID eingesetzt wird.It should also be mentioned that the RAID concepts (Redundant Array of Inexpensible Disks, see [CLG + 93]) can be considered a special case of mirror with a special kind of redundancy distribution according to the RAID level: it only goes on a distribution of inputs and outputs on different computers omitted. An efficient realization of mirror should therefore strive to ensure that local replication does not result in noticeable overhead. This would also make it suitable for the task areas in which software RAID has been used so far.

Implementierungen von mirror sollten auf jeden Fall den Grundideen der Ausfallsicherheit hohe Aufmerksamkeit schenken und z.B. mit dem Fall einer Netzwerk-Partitionierung (vgl. [DGMS85]) sinnvoll umgehen können. Eine detaillierte Behandlung dieser Konzepte würde den Rahmen dieser Arbeit sprengen. Es wäre interessant zu ergründen, inwieweit das Baustein-Konzept und einige der hier. vorstellten Bausteine bei der internen Realisierung von mirror Vorteile bringen können.implementations by mirror should definitely have the basic ideas of reliability pay close attention and, for example, with the case of network partitioning (see [DGMS85]) can handle sense. A detailed treatment these concepts would go beyond the scope of this work. It would be interesting to find out to what extent the building block concept and some of the here. presented building blocks in the internal realization of mirror can bring benefits.

Schließlich ist zu erwähnen, dass sich die Funktionalität von Prozess-Migration (vgl. [Smi88]) als Spezialfall von verteilt ablaufenden Kontrollflüssen auf verteilten gemeinsamen Schutzbereichen bzw. durch Wechseln von Konfrollflüssen auf andere Rechner unter Benutzung gespiegelter Schutzbereiche darstellen lässt. Hierzu ist erforderlich, dass die verwendeten mmu_*-Bausteine multiuser-Verhalten implementieren101.Finally, it should be mentioned that the functionality of process migration (see [Smi88]) can be represented as a special case of distributed control flows on distributed shared protection areas or by switching of confor- mity flows to other computers using mirrored protection areas. This requires that the mmu_ * devices used implement multiuser behavior 101 .

Die Verteilung von Nestern ist auch zur Herstellung verteilter gemeinsamer Namensräume sehr nützlich; mirror ist somit die wesentliche Grundlage für ein verteiltes Betriebssystem.The Distribution of nests is also common for making distributed namespaces very helpful; mirror is thus the essential basis for a distributed operating system.

4.1.14 pipe4.1.14 pipe

Zum Verständnis des pipe-Entwurfs (siehe 26) muss man sich nochmals in Erinnerung rufen, dass eine Leitung eine Hierarchie-Beziehung zwischen Baustein-Instanzen darstellt und nichts direkt mit Datenfluss-Richtungen zu tun hat. In abstrakter Sicht sind daher die Teilnehmer an einer Pipe prinzipiell gleichberechtigt, sie werden daher an verschiedenen Ausgängen angeschlossen. Der interne Status einer pipe-Instanz wird in einem tmp-Eingang gehalten, an den sich nicht nur device_ramdisk anschließen läßt, sondern z.B. auch Puffer-Nester, die nicht in den Hauptspeicher eines Kleinrechners passen würden.To understand the pipe design (see 26 ) It is important to remember that a line represents a hierarchical relationship between block instances and has nothing directly to do with data flow directions. In an abstract perspective, therefore, the participants in a pipe are in principle equal, they are therefore connected to different outputs. The internal status of a pipe instance is kept in a tmp input, to which not only device_ramdisk can be connected, but also buffer nests, for example, which would not fit into the main memory of a minicomputer.

4.2 Instantiierung von Bausteinen4.2 Instantiation of building blocks

Zur Instantiierung der Bausteine wird irgendein Mechanismus benötigt. Dieser sollte außerhalb oder oberhalb der eigentlichen Baustein-Hierarchie liegen, da es sich um einen übergeordneten Kontroll-Mechanismus handelt. Nach dem Grundsatz der Trennung in Mechanismen und Strategien sind folgende Teilbereiche zu verwenden:

  • 1. Der eigentliche Instantiierungs-Mechanismus (technische Durchführung der Instantiierung)
  • 2. Die logische Kontrolle, welche Instantiierung zu welchem Zeitpunkt und aus welchem Anlass ausgeführt werden soll
To instantiate the building blocks, some mechanism is needed. This should be outside or above the actual building block hierarchy because it is a higher-level control mechanism. Following the principle of separation into mechanisms and strategies, the following subareas should be used:
  • 1. The actual instantiation mechanism (technical implementation of instantiation)
  • 2. The logical control of what instantiation should be performed at what time and for what reason

Diese Trennung hat den Vorteil, dass insbesondere für Punkt 2 mehrere verschiedene Verfahren gleichzeitig oder konkurrierend eingesetzt werden können.These Separation has the advantage that, in particular for point 2 several different Be used simultaneously or concurrently.

4.2.1 Der Mechanismus4.2.1 The mechanism

Für die technische Durchführung der Instantiierung schlage ich vor, einen Baustein namens control einzusetzen, von dem es auf jedem Rechner beliebig viele Instanzen geben kann, wobei im Normalfall jedoch eine Instanz ausreicht, die ihrerseits beim Urstart auf eine Weise instantiiert worden sein muss, die ausserhalb des normalen Instantiierungs-Mechanismus liegt (und logischerweise auch liegen muss102). Der control-Baustein (siehe 27) verwaltet alle von ihm erzeugten Baustein-Instanzen samt Verdrahtung. Er selbst benötigt ebenfalls Betriebsmittel, beispielsweise den Maschinencode von sich selbst. Ich schlage vor, diese beiden Funktionsbereiche logisch zu trennen: Die von einer control-Instanz verwalteten Baustein-Instanzen können i.a. in einem anderen (virtuellen) Adressraum (der wiederum in Schutzbereiche aufgeteilt sein kann) liegen als die control-Instanz selbst; damit sind z.B. beliebige hierarchische Schachtelungen von Adressräumen oder ganzen virtuellen Maschinen möglich103. Die steuernde control-Instanz bedient sich des tmp-Eingangs, um darin den gesamten notwendigen Status zu halten, und stellt am image-Ausgang ein „Prozessabbild" bzw. eine Menge von Schutzbereichen zur Verfügung, die in einer nachfolgenden (ggf. über Zwischenbausteine wie union angeschlossene) mmu_i386 oder mmu_dummy-Instanz zur eigentlichen Ausführung gebracht werden. Damit ist eine Separation zwischen dem Adressraum möglich, der die control-Instanz beherbergt, und dem Adressraum, in dem die verwalteten Instanzen laufen sollen. Durch diese Trennung ist es u.a. möglich, Teile eines Betriebssystems in „Benutzer"-Adressräumen ablaufen zu lassen. Benutzer können auf diese Weise voneinander unabhängige Subsysteme schaffen, die von der Funktionalität her virtuellen Betriebssystemen gleich kommen. Damit verschwimmt die klassische Einteilung in Kern- und Benutzer-Zuständigkeiten; die Verteilung dieser Zuständigkeiten ist nur noch eine Frage der Konfiguration. Eine Trennung zwischen der control-Instanz und ihrem image in separate Adressräume ist jedoch keine Pflicht104: wenn man den image-Ausgang in die gleiche mmu_*-Instanz einblendet, in der auch der control-Baustein beheimatet ist, kann man ohne weiteres Single-Address-Space-Strategien105 fahren. Als weiterer Sonderfall ist es prinzipiell auch möglich, dass ein control-Baustein sich selbst verwaltet106; in diesem Fall besteht kein Unterschied zwischen „innen" und „außen"; eine Destruktion der control-Instanz würde dann nicht nur zur Destruktion aller verwalteten Instanzen führen, sondern nie mehr eine erneute Re-Konstruktion ermöglichen (dies kann ausnahmsweise beim Herunterfahren des Rechners auch erwünscht sein).For the technical implementation of the instantiation, I propose to use a block called control, of which there can be any number of instances on each computer, but in the normal case an instance is sufficient, which in turn must have been instantiated at the start in a way outside of the normal instantiation mechanism (and, logically, it must be 102 ). The control block (see 27 ) manages all block instances that it generates, including wiring. He needs himself I also propose to logically separate these two functional areas: The block instances managed by a control instance can generally be located in another (virtual) address space (which in turn can be divided into protection areas) as the control instance itself; Thus, for example, any hierarchical nesting of address spaces or entire virtual machines is possible 103 . The controlling control instance uses the tmp input to hold all necessary status in it, and provides a "process image" or a set of protection areas at the image output that can be used in a subsequent (possibly via intermediate blocks such as union) or mmu_i386 or mmu_dummy instance, to allow for separation between the address space hosting the control instance and the address space in which the managed instances are to run. Explode portions of an operating system into "user" address spaces. In this way, users can create independent subsystems that are similar in functionality to virtual operating systems. This blurs the classic division into core and user responsibilities; the distribution of these responsibilities is just a matter of configuration. However, separating the control instance and its image into separate address spaces is not a requirement. 104 : If you insert the image output in the same mmu_ * instance where the control module is located, you can easily Address space strategies 105 drive. As a further special case, it is also possible in principle for a control block to manage itself 106 ; in this case, there is no difference between "inside" and "outside"; destroying the control instance would then not only result in the destruction of all managed instances, but would never allow another re-construction (this may exceptionally be desirable when shutting down the machine).

Die Befehle zum Instantiieren/De-Instantiieren der verwalteten Instanzen sowie zum Verdrahten werden über den control-Ausgang gegeben. Eine Möglichkeit ist die Einführung weiterer Elementar-Operationen, oder die Benutzung der Schnittstelle von generischen Operationen (Kapitel 6). Da auf dieser Leitung nur Steuer-Operationen benutzt werden, ist sie gestrichelt gezeichnet. Über den control-Ausgang lassen sich fernerhin die Attribute der instantiierten Bausteine, Ein- und Ausgänge und die Verdrahtungs-Struktur abfragen. Auftraggeber für diese Operationen können beliebige Bausteine sein; i.A. dürfen diese auch in image liegen107. Zu Zwecken der Kommunikation nach außen existiert eine dynamische Anzahl von Ein- und Ausgängen in* und out*108, die als Schnittstellen für LRPC dienen und die zu beliebigen Zwecken einsetzbar sind109.The commands for instantiating / de-instantiating the managed instances and for wiring are given via the control output. One possibility is the introduction of further elementary operations, or the use of the interface of generic operations (Chapter 6). Since only control operations are used on this line, it is shown in dashed lines. Furthermore, the attributes of the instantiated blocks, inputs and outputs and the wiring structure can be queried via the control output. Clients for these operations can be any building blocks; iA these may also be in image 107 . For purposes of external communication, there are a dynamic number of inputs and outputs in * and out * 108 which serve as interfaces for LRPC and which can be used for any purpose 109 .

Es ist sinnvoll, das Instantiieren/De-Instantieren vom Konstruieren/Destruieren zu trennen: Beim Instantiieren wird lediglich Platz für die Baustein-Infrastruktur (z.B. statische Attribute) angelegt und die Verdrahtung ermöglicht. Die Parametrierung der Baustein-Instanz (z.B. Festlegen dynamischer Attribute) erfolgt spätestens beim Konstruieren. Wenn man einen Baustein nur destruiert, aber nicht de-instantiiert, wird er im Endeffekt lediglich in den Zustand der Statuslosigkeit geschaltet (d.h. nach dem Abarbeiten aller evtl. noch vorliegenden Aufträge wird der evtl. noch vorhandene interne Status auf die Eingänge abgewälzt, danach werden keine Operationen mehr bearbeitet), und er kann anschliessend durch Konstruieren wieder in Betrieb genommen werden.It makes sense to instantiate / de-instantiate from constructing / destroying disconnect: When instantiating is only room for the device infrastructure (e.g., static attributes) and allows for wiring. The parameterization of the block instance (for example, setting dynamic Attributes) takes place at the latest while constructing. If one only destroys a building block, but not de-instantiated, in the end it only becomes the state the statelessness switched (that is, after the completion of all possibly. still existing orders the possibly existing internal status is passed on to the inputs, afterwards no operations are processed), and he can then be put back into operation by design.

Details zur internen Realisierung von control werden in dieser Arbeit nicht behandelt; die grundlegende Funktionsweise soll hier nur skizziert werden:
Im code-Eingang wird dynamisch linkbarer Maschinencode für alle instantiierbaren Baustein-Typen bereitgehalten110. Bei der erstmaligen Verwendung wird er nach tmp kopiert und dabei gelinkt. Die Instanzen der verwalteten Bausteine werden in zwei Phasen erzeugt: aus den statischen Attributen des zu instantiierden Baustein-Typs wird der Speicherplatzbedarf für eine Instanz ausgelesen und entsprechender Platz in tmp reserviert. Anschließend wird eine Instantiierungs-Routine aufgerufen; diese kann bei Bedarf weitere Aktionen ausführen111. Nach der Instantiierung sollte im Regelfall die Verdrahtung stattfinden; hierbei kann bereits auf Konflikte zwischen statischen Kompetenz-Attributen und Verhaltens-Attributen geprüft werden. Die Konstruktion erfolgt ebenfalls durch Aufruf einer baustein-spezifischen Routine mit passenden Parametern. Da u.U. erst zu diesem Zeitpunkt dynamische Attribute festgelegt werden, kann die Konstruktion auch fehlschlagen. Destruktion und De-Instantiierung funktionieren analog.
Details on the internal realization of control are not dealt with in this work; the basic functionality is only sketched here:
In the code input, dynamically linkable machine code is kept ready for all instantiable block types 110 . When first used, it is copied to tmp and linked. The instances of the managed blocks are generated in two phases: The memory requirements for an instance are read out of the static attributes of the block type to be instantiated, and corresponding memory space is reserved in tmp. Subsequently, an instantiation routine is called; this can carry out further actions if necessary 111 . After instantiation, the wiring should normally take place; It is already possible to check for conflicts between static competence attributes and behavioral attributes. The construction also takes place by calling a block-specific routine with suitable parameters. Since dynamic attributes may only be set at this point in time, the design may fail. Destruction and de-instantiation work analogously.

4.2.2 Einige mögliche grundlegende Strategien4.2.2 Some possible basic strategies

Bei den Anlässen für eine Instantiierug sind mehrere mögliche Szenarien zu unterscheiden:

  • 1. Manche Baustein-Arten wie z.B. dir_* können nur an bestimmten vorgegebenen oder vorgebbaren Stellen einer Baustein-Hierachie instantiiert werden, weil sie einen Interpreter für ein bestimmtes konkretes Datenformat darstellen. Es macht i.a. keinen Sinn, andere Baustein-Arten als die für die jeweilige Interpretation geeigneten zu instantiieren; häufig existiert für ein bestimmtes Datenformat nur eine einzige Interpreter-Baustein-Art (in einem gewachsenen System allerdings oft in verschiedenen Versionen, von denen bei der Instantiierung die geeignete ausgewählt werden muss).
  • 2. Andere Baustein-Arten wie z.B. mmu_* oder geschachtelte control-Instanzen werden fast ausschließlich auf Veranlassung von Benutzer-Aktivitäten instantiiert.
  • 3. Es gibt Mischformen zwischen beiden Extremen: ein Verzeichnis-Pfadname wird zwar vom Benutzer vorgegeben, die Art des jeweils zu inantiierenden Bausteins hängt jedoch vom Datenformat ab.
  • 4. In manchen Fällen können Instantiierungen oder Re-Instantiierungen auch ohne konkreten äußeren Anlass geschehen, z.B. zeitgesteuert in selbsttätig optimierenden Betriebssystemen (vgl. [BR76]) oder zur Erzielung von Fehlertoleranz und Ausfallsicherheit.
There are several possible scenarios for an instantiation event:
  • 1. Some types of building blocks, such as dir_ *, can only be instantiated at certain predefined or predefinable locations of a building block hierarchy because they represent an interpreter for a particular concrete data format. In general, it makes no sense to instantiate other types of building blocks other than those suitable for the respective interpretation; Often, there is only one single interpreter for a given data format ter block type (in a grown system, however, often in different versions, of which the appropriate one must be selected during the instantiation).
  • 2. Other types of devices, such as mmu_ * or nested control instances, are instantiated almost exclusively at the behest of user activities.
  • 3. There are hybrids between both extremes: although a directory path name is specified by the user, the type of block to be instantiated depends on the data format.
  • 4. In some cases, instantiation or re-instantiation can also be done without specific external cause, eg time-controlled in self-optimizing operating systems (see [BR76]) or to achieve fault tolerance and reliability.

Der Fall 1 läßt sich entweder direkt in control abhandeln, oder durch einen eigenen Baustein-Typ registrar, der als Registrar für verschiedene Datenformate dient. Datenformate sollten vorzugsweise im zugehörigen Meta-Nest beschrieben werden; es gibt aber auch auch Sonderfälle wie Platten-Partitionen oder dir_*-Bausteine für konventionelle Archiv-Datei Formate (wie .tar oder .zip), bei denen die Format-Erkennung durch Inspektion des Inhaltes des betreffenden Nestes erfolgen muss. Ein Registrar verwaltet daher auch die Methoden für die automatische Format-Erkennung.Of the Case 1 can be either deal directly in control, or by a separate block type registrar, who is a registrar for different data formats are used. Data formats should preferably in the associated Meta-nest can be described; but there are also special cases like Disk partitions or you _ * - blocks for conventional archive file Formats (such as .tar or .zip), where the format detection by Inspection of the contents of the relevant nest. One Registrar also manages the methods for automatic format detection.

Um eine möglichst hohe Flexibilität bei verschiedenen Auslösern von Instantiierungen zu erreichen, schlage ich die Einrichtung von strategy_*-Bausteinen vor; siehe 28. Diese steuern den control- oder registrar-Baustein und erhalten von dort Informationen über vorhandene Datenformate und Kompetenzen; sie werden ihrerseits von anderen Steuer-Instanzen wie z.B. Benutzer-Operationen oder andere strategy_*-Instanzen gesteuert. Im Bild sind die Steuerleitungen gestrichelt gezeichnet.In order to achieve the greatest possible flexibility with different triggers of instantiations, I propose the establishment of strategy _ * building blocks; please refer 28 , These control the control or registrar module and receive information about existing data formats and competences from there; they are themselves controlled by other control instances, such as user operations or other strategy _ * instances. In the picture, the control lines are shown in dashed lines.

Ein Beispiel wäre ein Baustein strategy_asciipath, der Pfadnamen in ASCII-Codierung akzeptiert und indirekt über registrar bzw. control auf einen Verzeichnisbaum von dir_*-Instanzen abbildet. Ein weiterer Baustein strategy_utf_ascii liesse sich zwischenschalten, um Pfadkomponenten in Unicode- oder UTF-8-Codierung nach ASCII zu übersetzen und dabei UTF-8-Sonderzeichen in eine umkehrbar eindeutige äquivalente Mehrzeichen-ASCII-Repräsentation zu übertragen. Ein weiteres Beispiel wäre strategy_ascii_bin, der binär kodierte Zahlen-Schlüssel (z.B. Feldschlüssel in Datenbanken) aus äquivalenten ASCII-Repräsentationen erzeugt. Weitere strategy_*-Arten könnten z.B. die Verwaltung von URLs übernehmen; der Erweiterbarkeit und Flexibilität werden durch diese Architektur kaum Grenzen gesetzt. Um ständig wiederholende Instantiierungen/De-Instantiierungen von Bausteinen zu verhindern, kann strategy_cache einen „Vorrat" von häufig benutzten Instanzen anlegen, die bei Nichtbenutzen evtl. lediglich auf „statuslos" geschaltet werden. Die Funktionalität des klassischen fork-Systemaufrufs von Unix lässt sich ebenfalls durch strategy_*-Bausteine, diejenige von /proc-Dateisytemen durch spezialisierte Arten von Registraren herstellen, die für automatische Default-Instantiierungen registrierter Komponenten sorgen. Das Problem von inkompatiblen Kompetenzen und Verhalten von versuchten Baustein-Verdrahtungen bzw. Konstruktionen läßt sich durch einen zwischengeschalteten registrar_intermediate lösen. Dieser kennt alle möglichen adaptor_* und sonstigen Konversions-Baustein-Typen samt ihren Eigenschaften und veranlasst bei Bedarf die automatische Zwischenschaltung der geeigneten Komponenten. Auf ähnliche Weise läßt sich Netzwerk-Transparenz durch automatisierte Zwischenschaltung von remote erzielen.One Example would be a building block strategy_asciipath, the path name in ASCII encoding accepted and indirectly over register or control on a directory tree of you _ * - instances maps. Another building block strategy_utf_ascii could be interposed, to translate path components in Unicode or UTF-8 encoding to ASCII and UTF-8 special characters into a reversibly unique equivalent multi-character ASCII representation transferred to. Another example would be strategy_ascii_bin, the binary encoded number keys (e.g., field key in databases) from equivalent ASCII representations generated. Other strategies could be used e.g. the administration of Take over URLs; The extensibility and flexibility are provided by this architecture barely set any limits. To constantly repetitive instantiations / de-instantiations of building blocks strategy_cache can create a "store" of frequently used instances, which in case of non-use may only be switched to "stateless" The functionality of the classic fork system call from Unix also by strategy _ * - building blocks, those of / proc file systems through specialized types of registrars that are automatic Default instantiations of registered components provide. The problem of incompatible competencies and behavior of attempted building block wirings or constructions can be through an intermediary registrar_intermediate. This knows all kinds of things adaptor_ * and other conversion block types including their properties and causes the automatic interposition of the suitable components. On similar Way can be Network transparency through automated interposition of achieve remotely.

Bei Implementierung geeigneter Strategien (z.B. [LS94]) lässt sich Fehlertoleranz durch automatisches Re-Instantiieren von ausgefallenen Bausteinen erzielen, oder in Kombination mit der Netzwerk-Transparenz zur dynamischen Lastbalancierung nutzen. Es sind unzählige weitere Anwendungen für strategy_* und registrar_* denkbar.at Implementation of appropriate strategies (e.g., [LS94]) can be achieved Fault tolerance through automatic re-instantiation of failed ones Achieve building blocks, or in combination with network transparency to use for dynamic load balancing. There are countless others Applications for strategy_ * and registrar_ * conceivable.

Für Datenbank-Konstrukteure könnte eine reizvolle Aufgabe darin bestehen, einen Baustein strategy_sgl zu entwickeln, der sich bei geeigneter Auslegung nicht nur für die klassischen Einsatzgebiete in Datenbanken eignet112, sondern das Prinzip der Trennung von logischen und physischen Zugriffspfaden auch auf solche Einsatzgebiete ausdehnt, die bisher als Domäne von Betriebssystemen113 oder verteilten Systemen betrachtet wurden (insbesondere das Management virtueller Benutzer-Adressräume114).For database designers could be a delightful task to develop a building block strategy_sgl, which is suitable for a suitable design not only for the classic applications in databases 112 , but extends the principle of separation of logical and physical access path to such applications, the hitherto considered to be the domain of operating systems 113 or distributed systems (in particular the management of virtual user address spaces 114 ).

5 Callbacks durch notify-Operationen5 callbacks through notify operations

Hierarchische Beziehungen drücken ein Abhängigkeitsverhältnis aus. Baustein-Instanzen, die „höher" in einer Hierarchie stehen, haben „Macht" oder „Kontrolle" über solche, die weiter unten stehen. Die Leitungen des Baustein-Modells drücken derartige Hierarchie-Beziehungen aus.hierarchical Press relationships a dependency ratio. Building block instances that are "higher" in a hierarchy have "power" or "control" over those below stand. The building block model lines express such hierarchy relationships out.

Es gibt jedoch Fälle, in denen sich eine eindeutige Hierarchie nicht immer reinrassig ausführen läßt. Betriebssystem-Konstrukteure versuchen traditionell, solche Fälle möglichst zu vermeiden. Im Idealfall sollte ein Betriebssystem durch ein Schichtenmodell beschreibbar sein (vgl. [Dij71]). Die notify-Operationen sind dazu gedacht, um ein Schichtenmodell auch dann noch beibehalten zu können, wenn es aus irgendwelchen Gründen klemmen würde (vgl. [Cla85]). In dieser Sichtweise haben notify-Operationen einen Ausnahmecharakter, der nicht missbraucht werden sollte. Ich werde versuchen, diejenigen Anwendungsfälle zu begründen, in denen ich Vorteile durch den Einsatz von notify-Operationen sehe.However, there are cases in which a clear hierarchy can not always be pure-bred. Operating system designers traditionally try to avoid such cases as much as possible. Ideally, an operating system should be writable through a layered model (see [Dij71]). The notify operations are meant to be able to maintain a layered model even if it would jam for some reason (see [Cla85]). In this view, notify operations are exceptional and should not be abused. I will try to justify those use cases where I see benefits through the use of notify operations.

5.1 Eigentums- und Besitzverhältnisse5.1 Ownership and ownership

Die Begriffe Eigentum und Besitz stammen aus dem Rechtswesen. Dort kennzeichnen sie den Erstreckungsbereich eines Rechtes: wer Eigentümer einer Sache ist, der hat weitergehende Rechte als der Besitzer. Es ist insbesondere möglich, Sachen auszuleihen oder zu vermieten; dabei bleibt man weiterhin Eigentümer, obwohl der Besitzer (kurzzeitig) wechselt. Der neue Besitzer kann transitiven Unterbesitz an einer Sache oder Teilsache an ein oder mehrere Unterbesitzer weitergeben; diese schulden die Rückgabe an den Hauptbesitzer, das ist derjenige, von dem sie den Unterbesitz erhalten haben; dieser schuldet wiederum die Rückgabe des Besitzes an den Eigentümer. Der Eigentümer ist jemand, der niemandem die Rückgabe des Besitzes schuldet115. Im realen Leben kommen solche Rechtsverhältnisse z.B. bei der Vermietung und Untervermietung von Wohneigentum vor. Ein Mieter einer 5-Zimmerwohnung kann z.B. jedes Zimmer einzeln an Studenten untervermieten.The terms property and possession come from the legal system. There they mark the scope of a right: who owns a thing, has more rights than the owner. In particular, it is possible to rent or rent things; while you remain owner, although the owner (short term) changes. The new owner may transfer transitive ownership of one thing or partial thing to one or more sub-owners; they owe the return to the chief owner, that is the one from whom they received the sub-possession; this in turn owes the return of ownership to the owner. The owner is someone who owes nobody the return of the property 115 . In real life, such legal relationships occur, for example, when renting and subletting residential property. For example, a tenant of a 5-room apartment can sublet each room individually to students.

Diese Analogie möchte ich zur Darstellung der Verhältnisse in einem Betriebssystem einsetzen; dabei werde ich als Beispiel das Eigentum und den Besitz an Datenblöcken und an Locks nehmen; diese Methodik ist auch auf andere Objekte übertragbar.These Analogy would like I to the representation of the circumstances use in an operating system; Here I will be an example take ownership and ownership of data blocks and locks; these Methodology is also transferable to other objects.

Eigentums- und Besitzverhältnisse sind von einer Hierarchie unabhängig116 und können sich dynamisch zur Laufzeit ändern. Eine Baustein-Hierarchie teilt die Gesamtverantwortung eines Betriebssystems in statische Zuständigkeiten auf; bei der Übertragung eines Besitzes wird dagegen die temporäre Verantwortung für die zu verwaltenden Objekte innerhalb der Hierarchie weitergegeben.Property and ownership are of a hierarchy regardless 116 and can change dynamically at runtime. A building block hierarchy divides the overall responsibility of an operating system into static responsibilities; when transferring a property, however, the temporary responsibility for the objects to be managed within the hierarchy is passed on.

Bei physischen Datenblöcken gibt es einen natürlichen Eigentümer: das ist diejenige Instanz, die die physische Adresse festlegt und verwaltet, z.B. indem sie den Datenblock „erzeugt", d.h. in Existenz bringt117. In der Regel stellt dieser natürliche Eigentümer den Datenblock her, um ihn anschließend zu „verleihen", d.h. das Zugriffs- oder Besitzrecht an eine andere Instanz für eine bestimmte Zeit abzutreten. Der neue Besitzer kann hierarchisch tiefer oder höher stehen. Unabhängig von der Hierarchie aber muß er den Besitz irgendwann wieder an den Eigentümer zurückgeben, ansonsten droht das bekannte Problem der Ressourcenverknappung durch nicht mehr recycelbare Ressourcen.For physical data blocks there is a natural form of ownership: this is the one instance that defines the physical address and managed, for example by the data block "created", that brings into existence 117 As a rule, this natural owner of the data block forth to him. subsequently to "lend", ie to assign the right of access or ownership to another entity for a certain period of time. The new owner can be hierarchically lower or higher. Regardless of the hierarchy, however, he eventually has to return ownership to the owner, otherwise the well-known problem of scarcity of resources due to no longer recyclable resources threatens.

29 zeigt einen Ausschnitt aus einem Szenario eines Rechners, der mit MMU-Hardware ausgestattet ist. Prinzipiell kommt als Eigentümer oder Hauptbesitzer von Datenblöcken jede der beteiligten Baustein-Arten in Frage. Es bringt jedoch Vorteile, wenn die Adressvergabe der physischen Datenblöcke von der Adressvergabe im jeweiligen logischen Adressraum getrennt wird. Bei den logischen Adressen gibt es einen notwendigen Eigentümer bzw. Hauptbesitzer, der darüber zumindest in den Grundzügen bestimmen können muss: das ist der Benutzer, der ganz hinten als Endkonsument sitzt und bestimmen möchte, was der Rechner und das Betriebssystem für ihn tun soll; er kann zwar einige dieser Aufgaben an den Compiler oder das Laufzeitsystem (Benutzer-Heap-Verwaltung) delegieren, aber letztlich ist er der Herr über seinen virtuellen Adressraum. 29 shows a part of a scenario of a computer that is equipped with MMU hardware. In principle, the owner or main owner of data blocks can be any of the building block types involved. However, there are advantages if the address assignment of the physical data blocks is separated from the address assignment in the respective logical address space. For the logical addresses, there is a necessary owner or main owner, who must be able to determine at least the basic features: this is the user, who sits at the very back end consumer and wants to determine what the computer and the operating system should do for him; While he can delegate some of these tasks to the compiler or the runtime system (user heap management), he is ultimately the master of his virtual address space.

Physische Adressen lassen sich prinzipiell sowohl ganz oben bei den mmu_*-Instanzen als auch ganz unten bei der buf fer-Instanz bzw. der evtl. vorgeschalteten device mem-Instanz verwalten. Bei Vorhandensein von MMU-Hardware ist es jedoch aus mehreren Gründen vorteilhaft, die Verwaltung phyischer Adressen und damit das Eigentumsrecht der buf fer- bzw. device mem-Instanz und nicht den vielen mmu-Instanzen zu übertragen:

  • • Verschiedene mmu-Instanzen greifen häufig auf dieselben Datenblöcke zu; beispielsweise gemeinsamer Maschinencode. Wenn das Eigentumsrecht bei der buf fer-Instanz liegt, ist die gemeinsame Nutzung von Datenblöcken relativ einfach zu realisieren. Billigt man das Eigentum dagegen den mmu-Instanzen zu, dann findet entweder keine gemeinsame Nutzung statt, oder diese muss wesentlich aufwendiger z.B. über ein Cache-Kohärenz-Protokoll hergestellt werden, das sich über die gesamte Hierarchie hinweg erstrecken kann.
  • • Die Gefahr von Deadlocks ist leichter vermeidbar, da eine zentrale Instanz besser die Übersicht über die vergebenen Ressourcen wie Locks behalten kann.
In principle, physical addresses can be managed both at the top of the mmu_ * instances and at the very bottom of the buf fer instance or the possibly upstream device mem instance. In the presence of MMU hardware, however, it is advantageous to transfer the management of physical addresses and thus the ownership of the buf fer or device mem instance and not the many mmu instances for several reasons:
  • • Different mmu instances often access the same data blocks; for example, common machine code. Having ownership of the buf fer instance makes it easy to share blocks of data. On the other hand, if the property is approved for the mmu instances, then either no sharing takes place, or it must be produced much more expensively, for example via a cache coherence protocol, which can extend over the entire hierarchy.
  • • The danger of deadlocks is easier to avoid, because a central authority can better keep track of the allocated resources such as locks.

Im folgenden Beispiel (30) ist keine MMU-Hardware vorhanden. Die Verwaltung der physischen Datenblock-Adressen muss(!) wegen der notwendigen Übereinstimmung von logischen und physischen Adressen bei den mmu_dummy-Instanzen erfolgen, die als Ersatz für die fehlende MMU-Hardware stehen. Wenn keine MMU vorhanden ist, dann ist eine unabhängige Übersetzung von logischen Adressen nach physischen Adressen nicht möglich; es bleibt als einzige Lösung, die physischen Adressen mit den logischen Adressen gleichzusetzen. Daher ist es günstiger, das Eigentumsrecht zumindest an denjenigen Datenblöcken, die in Prozessabbildern verwendet werden, ganz oben in der Hierarchie bei mmu_dummy oder process_manager zu verwalten (andernfalls könnten keine Transformationen durch dazwischenliegende dir_*-Instanzen durchgeführt werden, oder es müssten zusätzliche Performanz fressende Kopien erstellt werden118).In the following example ( 30 ) there is no MMU hardware. The management of the physical data block addresses must be done (!) Because of the necessary match of logical and physical addresses with the mmu_dummy instances, which are a replacement for the missing MMU hardware. If no MMU exists, then independent translation from logical addresses to physical addresses is not possible; the only solution is to equate the physical addresses with the logical addresses. Therefore, it is better to maintain ownership of at least those data blocks used in process images at the top of the hierarchy at mmu_dummy or process_manager (otherwise, transformations could not be performed by intervening dir_ * instances or additional performance-eating copies be created 118 ).

Diese Erörterung sollte bewusst gemacht haben, dass Eigentums- und Besitzverhältnisse prinzipiell unabhängig von Hierarchie-Beziehungen sind, und dass eine gut durchdachte Zuordnung Implementierungs-Aufwand und Performanz sparen kann.These discussion should have made aware of ownership and ownership in principle independent of hierarchy relationships, and that is a well thought-out assignment Can save implementation effort and performance.

Die in Abschnitt 3.1 eingeführte Unterscheidung zwischen logischem und physischem IO auf Nestern korrespondiert mit dem Konzept der Eigentums- und Besitzverhältnisse in folgender Weise:

  • • Ein Eigentümer bzw Hauptbesitzer bietet stets logischen IO an seinem Ausgang an. Die höheren Hierarchie-Instanzen sind gezwungen, logischen IO zu verwenden, wenn sie in den (temporären) Besitz eines Datenblocks gelangen wollen; der in Abschnitt 3.3.3 eingeführte Referenzzähler dient zur Verwaltung der „Ausleih-Rechtsverhältnisse"; im juristischen Kontext würde man dies als „Schuldverhältnis" charakterisieren. Ein „Schuldner" muss irgendwann seine „Schulden" wieder „zurückzahlen"; dies geschieht in der hier vorgestellten Archtektur durch korrekte Paarung von put.
  • • Ein Eigentümer betreibt an seinem Eingang ausschließlich physischen IO; die unterliegenden Instanzen brauchen nur diese Betriebsart zu unterstützen.
The distinction between logical and physical IO on nests introduced in Section 3.1 corresponds to the concept of ownership and ownership in the following way:
  • • An owner or main owner always offers logical IO at its output. The higher hierarchy instances are forced to use logical IOs if they want to get into the (temporary) possession of a data block; the reference counter introduced in section 3.3.3 is used to manage the "lending legal relations", which in the legal context would be characterized as a "debt relationship". A "debtor" must someday "pay back" his "debts", this is done in the here presented Archtektur by correct pairing of put.
  • • An owner operates at his entrance only physical IO; the underlying instances only need to support this mode of operation.

Es ist jedoch sinnvoll, dass zwischenliegende Instanzen wie dir_* sowohl die Kompetenzen zu logischem als auch zu physischem IO haben sollten. Dies ermöglicht nicht nur den Einsatz der neuen Architektur in MMU-freier Hardware wie embedded systems, sondern rein theoretisch sogar den gemischten Einsatz von solchen Prozessen, die in virtuellen Adressräumen laufen, neben MMU-übersetzungsfreien Prozessen119.However, it makes sense that intermediate entities like dir_ * should have both logical and physical IO competencies. This not only allows the use of the new architecture in MMU-free hardware such as embedded systems, but in theory even the mixed use of such processes that run in virtual address spaces, in addition to MMU translation-free processes 119 .

5.2 Rückforderung von Eigentum5.2 Recovery of property

Wie im realen Leben kann es auch in einem Betriebssystem vorkommen, dass ein „Schuldner" seine „Schulden" nicht bezahlt, oder nicht „rechtzeitig" bezahlt. Die Einführung eines „Mahnwesens" ist prinzipiell geeignet, den Systemdurchsatz zu verbessern oder in hoffnungslosen Mangelsituationen überhaupt noch ein Weiterarbeiten zu ermöglichen.As in real life it can also happen in an operating system that a "debtor" does not pay his "debts," or not paid "on time." The introduction of a "dunning" is in principle suitable to improve system throughput or in desperate Lack of situations at all to allow further work.

Figure 00630001
Figure 00630001

Diese Operationen durchlaufen eine Baustein-Hierarchie in umgekehrter Richtung, d.h. vom Eigentümer hin zu den Konsumenten. Die Konsumenten werden gebeten oder gezwungen, die jeweilige Ressource (ein Datenblock mit der angegebenen logischen und physischen Adresse, oder ein Lock der angegebenen Art) zurückzugeben. Der Parameter urgency kann einen der folgenden Werte annehmen:
ask Es wird lediglich angefragt, ob eine Rückgabe der Ressource ohne größere Mühen und Störung des Betriebes möglich wäre. Der Empfänger braucht außer der boolschen success-Rückmeldung nichts zu unternehmen.
try Der Empfänger wird gebeten, die Ressource zurückzugeben, wenn es den Betrieb nicht unverhältnismäßig stört. Ein genauer Zeitpunkt für die Rückgabe wird nicht vorgeschrieben. command Der Empfänger wird aufgefordert, die Rückgabe unverzüglich (d.h. noch vor der success-Rückmeldung) vorzunehmen. Eine Verweigerung der Rückgabe durch Rücklieferung von success=false ist nur dann statthaft, wenn der Empfänger wegen der fehlenden Ressource seine Tätigkeit ganz einstellen müsste.
force Der Empfänger muss die Ressource unverzüglich zurückgeben, auch wenn er dadurch zum Abbruch seiner Tätigkeit gezwungen wird. Falls er sich dennoch weigern sollte120, werden alle seine Ressourcen „konfisziert", d.h. vom Eigentümer so behandelt, als wären sie zurückgegeben worden, und es finden im Zukunft keine Operations-Ausführungen mehr statt, die durch die Empfänger-Instanz in Auftrag gegeben worden sind oder noch gegeben werden.
These operations go through a building block hierarchy in the opposite direction, ie from the owner to the consumer. Consumers are asked or forced to return the resource (a data block with the specified logical and physical address, or a lock of the specified type). The urgency parameter can take one of the following values:
ask It is only asked if a return of the resource would be possible without major effort and disruption of the operation. The receiver needs nothing to do except the boolean success feedback.
try The recipient is requested to return the resource if it does not disproportionately disrupt the operation. An exact time for the return is not required. command The recipient is requested to return immediately (ie before the success feedback). A refusal of the return by return delivery of success = false is only permissible if the recipient has to cease his activity because of the missing resource.
force The recipient must immediately return the resource, even if it forces him to stop working. If he still refuses 120 , all his resources will be "confiscated", ie treated by the owner as if they had been returned, and there will be none in the future Operations executions that have been commissioned or are still being given by the Recipient Instance.

Die notify_*-Operationen haben den Charakter einer Ausnahme und sind konzeptuell mit den Signalen von Unix und anderen Betriebssystemen vergleichbar. Prinzipiell sind daher Wettrennen zwischen notify_*-Operationen und Anforderungs- bzw. Rückgabe-Operationen des Besitzers möglich. Diese Wettrennen treten auch bei vergleichbaren Situationen in konventionellen Betriebssystemen auf und sind meiner Ansicht nach prinzipbedingt (siehe Diskussion in Anhang C). Wettrennen lassen sich zwar durch architekturelle Maßnahmen prinzipiell vermeiden (vgl. Anhang C), jedoch geht dies i.a. zumindest bei verteilten Systemen zu Lasten der erzielbaren Parallelität und Performanz, da zumindest dort das Wettrenn-Problem inhärent ist und ohnehin gelöst werden muss.The notify _ * - operations have the character of an exception and are Conceptually with the signals from Unix and other operating systems comparable. In principle, therefore, races are between notify _ * operations and request or return operations of the owner possible. These races also occur in comparable situations in conventional Operating systems and are in my view inherently (see discussion in Appendix C). Although races can be through architectural measures avoid in principle (see Annex C), but i.a. at least in distributed systems at the expense of achievable parallelism and performance, because at least there the race problem is inherent and will be solved anyway got to.

Eine vom Wettrenn-Problem unabhängige Frage betrifft die „rechtmäßige" Ausübung „brutaler Gewalt", insbesondere der force-Modus. Es versteht sich von selbst, dass ein Eigentümer oder Hauptbesitzer große Macht über jeden ausüben kann, der etwas von ihm als Unterbesitz erhalten hat, da er auch dann auf Rückforderung bestehen kann, wenn dadurch die Existenz des Unterbesitzers gefährdet wird. Da die Besitzschuldverhältnisse prinzipiell unabhängig von den in Abschnitt 2.7 besprochenen Zugriffsrechten sind, könnte man die Frage stellen, ob diese Machtstellung insbesondere von hierarchisch untergeordneten Instanzen nicht unangemessen sein könnte. Hierauf gibt es eine prinzipielle Antwort: Nein. Wer (auf welche Weise auch immer) einmal die Macht erhalten hat, bestimmte Ressourcen verwalten zu dürfen, der kann von dieser Macht bereits bei der Ressourcenvergabe unangemessenen Gebrauch machen. Er kann rein theoretisch bereits zu diesem Zeitpunkt „bösartig" handeln und eventuelle Zugriffsbeschränkungen umgehen; ein typisches Beispiel ist die Hauptspeicherverwaltung, die bei Kompromittierung sämtliche Schutzmechanismen des gesamten Systems aushebeln kann, die auf ihr basieren121. Daher muss man einem Ressourcenbesitzer im Hinblick auf die Einhaltung geforderter Zugriffsrechts-Beschränkungen ohnehin vertrauen. Das Recht zur Rückforderung benötigt in dieser Sichtweise kein zusätzliches Vertrauen. Wenn man einer Instanz nicht vertrauen kann, dann darf man sie von vornherein nicht mit der Verwaltung von Eigentum oder Unterbesitz beauftragen (z.B. indem man für eine geeignete Aufteilung der Macht sorgt).A question independent of the problem of race separation concerns the "lawful" exercise of "brutal force", in particular the force mode. It goes without saying that an owner or principal owner can exercise great power over anyone who has received something from him as a sub-estate, as he can insist on recovery even if it endangers the existence of the sub-owner. Since ownership is, in principle, independent of the access rights discussed in Section 2.7, one might ask whether this power position could not be inappropriate, especially by hierarchically subordinate authorities. There is a principal answer to this: no. Whoever (in whatever way) has once been given the power to manage certain resources, can use this power inappropriately when allocating resources. He can theoretically act "vicious" at this point in time and circumvent any access restrictions, a typical example of which is memory management, which can compromise all the protections of the entire system based on it 121 The right of recovery does not require additional trust in this view, and if one can not trust an entity, then one must not entrust it with the administration of property or sub-estate (eg by choosing an appropriate one) Division of power ensures).

Es gibt weitere Gründe, die den Entzug beliebiger Ressourcen zu einem Pflicht-Mechanismus in zukunftssicheren Betriebssystemen machen. Großrechner unterstützen seit langem das sogenannte „Hot-Plugging" von Hardware-Komponenten, also den Austausch mitten im laufenden Betrieb. Dies betrifft nicht nur CPUs, die in fast allen Betriebssystemen entziehbare Ressourcen darstellen, sondern auch Speicher-Module. Die Problematik des Laufzeit-Austausches taucht fernerhin im IO-Bereich wie z.B. bei RAID auf; bei sicherheitskritischen Anwendungen wird ein prophylaktischer Austausch von Hauptspeicher-Modulen manchmal sogar turnusmäßig durchgeführt. Die Fähigkeit zum Austausch im laufenden Betrieb erfordert einen Mechanismus, mit dem der Entzug von Ressourcen in geordneten Bahnen durchgeführt werden kann.It gives more reasons the deprivation of any resources to a mandatory mechanism in future-proof operating systems. Mainframe computers support since long the so-called "hot plugging" of hardware components, So the exchange in the middle of ongoing operation. This does not apply only CPUs, the resources in almost all operating systems extractable represent, but also memory modules. The problem of the term exchange also appears in the IO area such as at RAID on; in safety critical Applications will be a prophylactic replacement of main memory modules sometimes even regularly. The ability for replacement during operation requires a mechanism with which the deprivation of resources is carried out in an orderly manner can.

Microsoft hat das Konzept der opportunistischen Locks [OpL] in die Betriebssystem-Schnittstelle der neueren Windows-Versionen integriert und damit zumindest für einige Anwendungen auch Anwendungsprogrammen verfügbar gemacht. Opportunistische Locks122 sind dazu gedacht, um das Cache-Kohärenz-Problem in verteilten System durch den gezielten Entzug von Ressourcen zu beschleunigen; wenn kein aktueller Bedarf für einen Entzug vorhanden ist, dann wird auf das zeitaufwendige Durchreichen der Ressource über das Netzwerk verzichtet („aggressives Caching"). Im hier vorgestellten Modell wird der Entzug mittels brutaler Gewalt nur als letztes Mittel betrachtet; für das im nächsten Abschnitt näher behandelte Cache-Kohärenz-Problem wird der try-Modus favorisiert. Ein weiterer grundlegender Unterschied der hier favorisierten spekulativen Locks zu opportunistischen Locks besteht darin, dass auf Rückforderungen im try-Modus nicht mit der Rückgabe des gesamten gesperrten Bereiches, sondern auch nur eines Teiles reagiert werden kann; dies ist insbesondere in Kombination mit der spekulativen Anforderung von vergrößerten Adress-Bereichen durch die try_address- und try_len-Parameter vorteilhaft (vgl. Abschnitt 3.3.5). Die Unterscheidung zwischen einem Kernbereich und einem spekulativ erweiterten Bereich wird auch in notify_lock getroffen; damit kann der Empfänger einer Rückforderung selbst entscheiden, wieviel er ohne größere Behinderung seiner Arbeit zurückgeben kann.Microsoft has integrated the concept of opportunistic locks [OpL] into the operating system interface of the newer versions of Windows, making application programs available for at least some applications. Opportunistic locks 122 are intended to speed up the cache coherency problem in distributed systems through the deliberate deprivation of resources; if there is no current need for withdrawal, then the time-consuming passing of the resource through the network is avoided ("aggressive caching.") In the model presented here, brutal violence withdrawal is seen as a last resort, in the next section A further fundamental difference between the speculative locks favored here and opportunistic locks is that the returns in the try mode do not involve the return of the entire locked area, but only a part of the cache This is particularly advantageous in combination with the speculative request for increased address ranges by the try_address and try_len parameters (see Section 3.3.5.) The distinction between a core region and a speculatively extended region is also in notify_lock so that the recipient can get a He himself decides how much he can return to his work without major hindrances.

5.3 Synchronisation zwischen Kopien: spekulative Locks5.3 Synchronization between Copies: speculative locks

Verteilte Systeme unterscheiden sich aus Sicht der hier vorgestellten Architektur hauptsächlich123 durch eine Eigenschaft von einem alleinstehenden Rechner: das ist die Zugriffs- bzw Latenzzeit der remote- und mirror-Bausteine, sowie die maximale Datenrate, die ihren Durchsatz begrenzt. Dieses Problem tritt in Gestalt der bekannten „Speicherlücke" auch in alleinstehenden Systemen auf und ist als so genanntes Flaschenhals-Problem lange bekannt, das sich z.B. bei virtuellem Speicher als Thrashing (vgl. [DS72]) äußern kann. Die spezifische Problematik steckt bei verteilten Systemen lediglich im Ort (Hierarchie-Ebene), an dem sich der Flaschenhals befindet.Distributed systems differ from the perspective of the presented architecture mainly 123 by a property from a stand alone machine: that is the access or latency of remotecapable and mirror devices, and the maximum data rate that limits its throughput. This problem occurs in the form of the well-known "memory gap" even in standalone systems and is known as bottles neck problem long known, for example, in virtual memory as Thrashing (see [DS72]) can express. For distributed systems, the specific problem is only in the place (hierarchy level) where the bottleneck is located.

Zur Lösung des Flaschenhals-Problems gibt es zwei erprobte grundlegende Strategien: man versucht den Flaschenhals durch Hardware-Aufrüstung zu erweitern, und/oder die zur Lösung einer Aufgabe notwendige Belastung zu senken. Während sich bei der Hardware klassischer Peripheriegeräten in der Vergangenheit ständige Fortschritte sowohl bei den Latenzzeiten als auch beim Durchsatz ereignet haben und voraussichtlich weiter ereignen werden, sind derartige Fortschritte bei räumlich weit verteilten Systemen nur beim Durchsatz, nicht hingegen bei der Latenzzeit möglich (vgl. [TL93]), da die Kommunikation von der Lichtgeschwindigkeit begrenzt wird. Daher ist unnötiger Datenverkehr bzw. unnötiges Warten auf die Ausführung von Operationen bei verteilten System noch dringender zu vermeiden als in alleinstehenden Systemen. Die hier vorgestellte Architektur legt auch aus diesem Grund besonderen Wert auf asynchrone Kommunikation.to solution There are two proven basic strategies for the bottleneck problem: you try to bottleneck through hardware upgrade expand, and / or the solution a task to reduce the burden. While in the hardware classic peripherals permanent in the past Advances in both latency and throughput have occurred and are expected to continue such progress in spatial widely distributed systems only in throughput, not in contrast the latency possible (see [TL93]), since communication is limited by the speed of light becomes. Therefore, is unnecessary Traffic or unnecessary Waiting for the execution of distributed system operations even more urgent as in stand-alone systems. The architecture presented here attaches particular importance to asynchronous communication for this reason.

Wie bereits in Abschnitt 4.1.2 (Baustein buffer) dargestellt, besteht der Zweck eines Caches in der Entkoppelung von Flaschenhälsen und der Reduktion der darüber laufenden transfer-Operationen. Während bei alleinstehenden Rechnern Konfigurationen mit nur einer zentralen buffer-Instanz möglich sind, ist der Einsatz kaskadierter verteilter Caches (buffer-Instanzen) bei verteilten Systemen aus Performanz-Gründen de facto unumgänglich. Kaskadierte Caches führen zwangsläufig zum bekannten Cache-Kohärenz-Problem.As already described in section 4.1.2 (block buffer) the purpose of a cache in the decoupling of bottlenecks and the reduction of it ongoing transfer operations. While at standalone computers Configurations with only one central buffer instance are possible, is the use of cascaded distributed caches (buffer instances) in distributed systems for performance reasons de facto inevitable. Cascaded caches lead inevitably to the well-known cache coherence problem.

Das Cache-Kohärenz-Problem läßt sich in der Systematik der hier verwendeten Begriffe auf folgende Weise formulieren: es sind mehrere Besitzer derselben logischen Ressource vorhanden.The Cache coherency problem let yourself in the scheme of the terms used here in the following way formulate: there are multiple owners of the same logical resource available.

Im Rechtswesen taucht dieses Phänomen in den Begriffen Gemeinschaftseigentum (z.B. bei Wohnungseigentümer-Gesellschaften) und gemeinschaftlicher Besitz (z.B. Anmietung durch einen Verein) auf. Grundsätzlich sind mehrere Besitzer gleichberechtigt, und sie müssen sich bei allen Fragen betreffs des Besitzes gegenseitig auseinandersetzen; dies geschieht im sogenannten Innenverhältnis. Der Grund hierfür ist, dass ein Besitz exklusiv nutzbare Eigenschaften haben kann, so dass eine gleichmäßige und/oder gleichzeitige Nutzung durch alle Besitzer nicht immer möglich ist.in the Law emerges this phenomenon in the terms community property (e.g., in condominium companies) and joint ownership (for example, rented by an association) on. in principle Several owners are equal, and they have to to deal with each other in matters of ownership; This happens in the so-called internal relationship. The reason is that a possession may have exclusive usable properties, so that one uniform and / or simultaneous use by all owners is not always possible.

Die Auseinandersetzung über exklusiv nutzbare Ressourcen findet in traditionellen alleinstehenden Betriebssystemen bevorzugt durch Delegation der Verwaltungsaufgaben an eine zentrale Instanz (z.B. ein Lock-Manager) statt. Diese Lösung hat den Vorteil hoher Einfachheit bei geringen Kosten, da durch die Delegation praktisch vernachlässigbare Latenzen entstehen. In einem verteilten System ist dagegen eine Delegation an eine einzige Instanz i.a. wegen der Kommunikations-Latenzen sehr kostenintensiv.The Dispute over Exclusively usable resources are found in traditional stand-alone operating systems preferably by delegating the administrative tasks to a central Instance (e.g., a lock manager). This solution has the advantage of higher Simplicity at low cost, as by the delegation practical negligible Latencies arise. In a distributed system, however, there is one Delegation to a single instance i.a. because of the communication latencies very expensive.

Man kann sich Worst-Case-Zugriffsszenarien ausdenken, bei denen die Latenz-Kosten eines verteilten Systems zwangsläufig bei jedem einzelnen Zugriff entstehen müssen, weil sie wegen einer „genügend bösartigen" Aufgabenstellung nicht zu umgehen sind (analog zum Working-Set-Modell). Dies trifft übrigens auch für Caches alleinstehender Systeme zu, die man ebenfalls mit solchen Zugriffsmustern belasten kann, dass sie den bekannten Thrashing-Effekt zeigen, bei dem sie ihre Wirksamkeit fast vollständig einbüßen können. Bei alleinstehenden Systemen gilt die lange bekannte Grundregel, dass Thrashing nur dann vermeidbar ist, wenn der Working Set [Den68] der Last in den Cache passt. Diese lange bekannte Grundregel gilt aber auch in einem verteilten System mit mehreren Caches, allerdings in nochmals verschärfter Form. you can think of worst-case access scenarios in which the Latency costs of a distributed system inevitably with each individual access have to arise because they are due to a "sufficiently malicious" task can not be avoided (analogous to the working set model). By the way, this is true also for Caches of standalone systems that you also with such Access patterns can burden them with the well-known thrashing effect show that they can almost completely lose their effectiveness. For stand-alone systems The long-known principle that thrashing is only preventable applies is when the working set [Den68] matches the load in the cache. These However, a long-known basic rule also applies in a distributed system with several caches, but in a sharpened form.

Schauen wir uns dazu das folgende Szenario (31) aus mehreren örtlich weit verteilten Caches an, die ich „hierarchisch hochstehende Caches" nenne, die an einen gemeinsamen Basis-Cache angeschlossen sind. Damit überhaupt ein Entkopplungs-Effekt durch die hochstehenden buf fer-Instanzen entstehen kann, müssen ihre Working-Sets, bezogen auf die zeitliche Größenordnung der Kommunikations-Latenzen, „einigermassen disjunkt" sein. Andernfalls tritt analog zu [DS72] zwangsläufig ein Thrashing-Effekt zwischen den hochstehenden buf fer-Instanzen ein, der in der hier gewählten Hierarchie-Struktur über die untenstehende Basis-buffer-Instanz abgewickelt wird und auch durch Vergrößerung der Caches nicht eliminierbar ist, wie Denning sehr einleuchtend bereits vor langer Zeit gezeigt hat. Gegen diese Art von Thrashing hilft meiner Ansicht nach überhaupt kein Kraut: es ist verteilten Systemen inhärent, dass modifizierte Daten irgendwie an den Ort der anderen buffer-Instanz gebracht werden müssen, wenn sie dort von der Aufgabenstellung her unbedingt benötigt werden, und das kostet zwangsläufig Latenzzeit (weil die Lichtgewindigkeit als Naturkonstante nicht umgehbar ist). Ich sehe daher keine andere Möglichkeit, als die Aufgabenstellung so zu gestalten, dass ein derartiges Thrashing nicht stattfindet. Dazu ist eine notwendige Bedingung, dass die Working-Sets an verschiedenen Orten einigermassen disjunkt voneinander sein müssen.Let's look at the following scenario ( 31 ) of several locally distributed caches, which I call "hierarchically high-level caches", which are connected to a common base cache.To have any decoupling effect from the high-level buf fer instances, their working sets, based on the temporal magnitude of the communication latencies, be "reasonably disjoint". Otherwise, in analogy to [DS72], a thrashing effect inevitably occurs between the high-level buffer instances, which is handled in the hierarchy structure selected here via the base buffer instance below and can not be eliminated by enlarging the caches, such as Denning has shown very clearly a long time ago. In my opinion, there is no herb at all against this type of thrashing: it is inherent in distributed systems that modified data must somehow be brought to the location of the other buffer instance if they are absolutely necessary there from the task, and that inevitably costs Latency (because the wind speed is not bypassable as a natural constant). So I see no other way than to design the task so that such thrashing does not take place. A necessary condition for this is that the working sets at different locations must be reasonably disjoint.

Unter der Annahme, dass die Working-Sets der hochstehenden buf fer-Instanzen disjunkt sind, sieht die Lösung des Problems folgendermassen aus: es ist nichts anderes zu tun, als die vorkommenden Working-Sets einigermaßen genau zu bestimmen. Dies macht ein ausschließlich von Anforderungen getriebener Cache von Natur aus ganz von selbst. Anders sieht die Situation höchstens dann aus, wenn das Laden der oberen Cache-Instanzen mit Daten zusätzlich auf spekulative Weise erfolgt, z.B. beim sogenannten Preloading.Under Assuming that the working sets of the high-level buf fer instances disjoint, the solution looks the problem as follows: there is nothing else to do to determine as the working sets reasonably accurate. This makes one exclusively inherently cached by nature. The situation looks different at most then booting when loading the upper cache instances with data in addition speculative manner, e.g. in the so-called preloading.

Zur Analyse des Preloadings sehen wir uns den Best Case an, bei dem wir die folgenden idealisierten Annahmen treffen:

  • 1. Die Caches seien jeweils genügend groß, so dass alle insgesamt benötigten Datenmengen in jedem einzelnen Cache Platz haben.
  • 2. Die Datenübertragungs-Rate sei näherungsweise unendlich groß, die Latenzzeit dagegen ein fester Wert echt größer Null.
  • 3. Jegliche Änderung eines Datums werde sofort an alle anderen Cache-Instanzen propagiert (was wegen der unendlichen Datenübertragungs-Raten auch kein Problem darstellt); diese Propagation kostet näherungsweise nichts.
  • 4. Welche Version eines Datums während der Kommunikations-Latenzzeiten an welcher Stelle zur Verfügung steht, wird idealisierend als ständig überall bekannt vorausgesetzt.
To analyze preloading, let's look at the best case, where we make the following idealized assumptions:
  • 1. The caches are each sufficiently large, so that all the data required in total have space in each cache.
  • 2. The data transfer rate is approximately infinitely large, while the latency is a fixed value really greater than zero.
  • 3. Any change to a date is immediately propagated to all other cache instances (which is not a problem because of the infinite data transfer rates); this propagation costs approximately nothing.
  • 4. Which version of a date is available at any point during the communication latencies is ideally assumed to be constantly known everywhere.

Trotz dieser bestmöglichen Annahmen, die unter der vorgegebenen räumlichen Verteilung nicht mehr zu verbessern sind, kann hier immer noch ein Trashing zwischen den hochstehenden Caches stattfinden, sofern man nur die Anforderungen durch die Aufgabenstellung genügend „bösartig" gestaltet. Ist diese Bösartigkeit jedoch nicht gegeben (weil die Working Sets aller Teilnehmer-Instanzen disjunkt sind), dann braucht niemals irgend eine buf fer-Instanz auf eine andere zu warten. Damit haben wir den Best Case dessen, was mit Hilfe von Caching-Strategien überhaupt erreichbar ist, nämlich die totale Entkopplung aller Aktivitäten und damit die Illusion, dass Latenzzeiten nicht vorhanden seien.In spite of this best possible Assumptions that are no longer under the given spatial distribution There can still be a trashing between them here high-level caches take place, given only the requirements designed by the task enough "vicious" Is this malignancy but not given (because the working sets of all participant instances disjoint), then never needs any buf fer instance to wait for another. This gives us the best case of which can even be achieved with the help of caching strategies, namely the total decoupling of all activities and with it the illusion that latencies are not available.

Da die getroffenen Annahmen in der Praxis natürlich nicht zutreffen124, lautet die Frage, wie man den Best Case approximieren kann. Für die Annahme 1 gibt es lange bekannte und erprobte Strategien der Adaption von Caches an die Working-Sets der Anforderungen, insbesondere LRU und LFU. Zur Lösung des Problems 2 wird insbesondere in Hardware-Architekturen (beispielsweise in Prozessor-Cache-Hierarchien) die explizite Priorisierung der Datentransfers eingesetzt: beim Transport durch einen Flaschenhals müssen solche Transport-Aufträge dringender behandelt werden, von deren Ausführung andere Aktivitäten abhängen; dagegen sollten spekulative Transport-Aufträge unbedingt geringer priorisiert werden, um dringendere Aktivitäten nicht durch Verstopfung des Flaschenhalses zu behindern. Dies wird bei der hier vorgestellten Architektur durch die IO-Prioritäten ermöglicht (siehe Abschnitt 2.8.3). Das Problem 3 lässt sich dadurch lösen, dass jegliche Änderungen grundsätzlich sofort125 durch Erzeugen eines IO-Auftrages (transfer-Operation) bekannt gemacht werden, allerdings standardmäßig nur mit Background-IO-Priorität, die nur bei Vorliegen höherer Dringlichkeit erhöht wird. Das Problem 4 erfordert eine genauere Analyse:
Wie bereits in Abschnitt 3.3.3 dargestellt und in Abschnitt 5.1 begründet, erfordert die Verwaltung von Besitz eine transiente Zuordnung des Besitz-Status (z.B. als Referenzzähler, ggf. auch der Versions-Zuordnung). Dieser Status ist an den Ort gekoppelt, für den der jeweilige (Unter-)Besitz-Status verwaltet wird. Da alle hochstehenden Caches aus Sicht des Basis-Cache Konsumenten sind, müssen sich diese wie alle anderen parallel arbeitenden Konsumenten an ein multi*-Verhalten halten, um die Determinanz für ihre jeweiligen Konsumenten sicherstellen zu können. Daraus folgt inbesondere, dass Locks prinzipiell bis auf den Basis-Cache durchgereicht werden müssen, ansonsten könnten die Verhaltens-Modelle verletzt werden. Wenn man jeden Lock einzeln durchreichen würde, dann entstünde jedesmal eine Wartezeit durch die Kommunikations-Latenzen, was sich katastrophal auf den Durchsatz auswirken würde. Diese Pflicht zum Durchreichen ist jedoch eine Mindest-Anforderung, die auch übererfüllt werden darf. Die Idee besteht nun darin, dass bei der erstmaligen Anforderung eines Locks nicht die vom Endkonsumenten angeforderte Granularität durchgereicht wird, sondern möglichst ein spekulativ vergrößerter Adressbereich (z.B. ein gesamtes Unter-Nest oder ein gesamtes Verzeichnis-Nest). Ein dazu geeigneter Mechanismus ist bereits in Abschnitt 3.3.5 vorgestellt worden (Parameter try_address und try_len). Wenn es einem der hochstehenden Caches gelungen ist, den Working Set seiner Konsumenten einigermassen realistisch spekulativ einzuschätzen, dann braucht er spätere Lock-Anforderungen seiner Konsumenten nicht jedesmal Zeit raubend zum Basis-Cache durch zu schalten, sondern kann den bereits erhaltenen spekulativen Besitz ohne Wartezeit an seine Konsumenten als Unterbesitz weiter geben, sobald diese eine entsprechende Anforderung stellen. Zu beachten ist dabei lediglich, dass spekulativ vorab angeforderte Lock-Arten die korrekte Semantik bei späterer Nachforderung durch die Endkonsumenten ergeben müssen; i.a. wird man dabei statt eines Read-Locks einen Write-Lock spekulativ anfordern müssen, um die Aktualität der neuesten Version garantieren zu können (ansonsten könnten andere Instanzen Veränderungen vornehmen, die zu einem unbemerkten Veralten der spekulativ angeforderten Version führen).
Since the assumptions made are of course not true in practice, 124 the question is how to approximate the best case. For Assumption 1, there are long known and proven strategies of adapting caches to the working sets of requirements, especially LRU and LFU. To solve the problem 2, the explicit prioritization of the data transfers is used in particular in hardware architectures (for example in processor cache hierarchies): in the case of transport through a bottleneck, those transport orders whose execution depends on other activities must be treated more urgently; on the other hand, speculative transport orders should definitely be given a lower priority in order not to impede more urgent activities by blocking the neck of the bottle. This is made possible by the IO priorities in the architecture presented here (see Section 2.8.3). The problem 3 can be solved by making any changes basically immediately 125 by generating an IO-order (transfer operation), but by default only with background IO priority, which is increased only in case of higher urgency. Problem 4 requires a more detailed analysis:
As already explained in Section 3.3.3 and in Section 5.1, the management of possession requires a transient assignment of the ownership status (eg as a reference counter, possibly also the version assignment). This status is linked to the location for which the respective (sub) ownership status is managed. Since all high-level caches are consumers from the perspective of the base cache, they, like all other concurrent consumers, must adhere to a multi-* behavior in order to ensure the determinant for their respective consumers. It follows in particular that locks must be passed in principle down to the basic cache, otherwise the behavioral models could be violated. If you passed each lock individually, there would be a delay in communication latencies each time, which would be catastrophic on throughput. However, this obligation to pass is a minimum requirement that may be exceeded. The idea is that when a lock is requested for the first time, the granularity requested by the end user is not passed on, but preferably a speculatively larger address range (eg an entire sub-nest or an entire directory nest). A suitable mechanism has already been presented in Section 3.3.5 (parameters try_address and try_len). If one of the most up-to-date caches has been able to reasonably speculate on the working set of its consumers, then it does not need to lock up its consumers' lock requests every time they take their way to the basic cache. Instead, it can accept the already received speculative ownership without waiting give their consumers as a sub-estate as soon as they make a corresponding request. It should only be noted that speculative, previously requested lock types must result in the correct semantics for subsequent demand from the end consumer; In general, instead of a read-lock, one will have to speculatively request a write-lock in order to guarantee the up-to-dateness of the latest version (otherwise other instances could change conditions that lead to an unnoticed obsolescence of the speculatively requested version).

Spekulationen über den zukünftigen Working-Set der Endkonsumenten können insofern fehl gehen, als dass zu grosse Bereiche vom Basis-Cache angefordert wurden, die später doch noch von anderen hochstehenden Caches benötigt werden126. Fehlspekulationen lassen sich durch Rückforderungen mittels notify_*-Operationen korrigieren. Der Basis-Cache kann grundsätzlich bei Anforderung bereits vergebener Locks entsprechende notify_*-Operationen an den/die momentane(n) Besitzer-Instanz(on) generieren. Falls er sich die Unterschiede zwischen vergebenen Kern- und Erweiterungsbereichen merkt (sowie ggf. von später hinzukommenden Kernbereichen durch den neuen Besitzer zeitnah, aber asynchron informiert wird), kann er auf das Stellen „aussichtsloser" Rückforderungen, die vergebene Kernbereiche betreffen, auch verzichten. Rückforderungen von Kernbereichen sollten möglichst nur für solche Adressbereiche gestellt werden, die ein anderer Cache auch wirklich aktuell benötigt. Es ist Sache des Fehlspekulanten; ggf. auch größere Bereich als den aktuell zurück geforderten oder sogar größere als den vorgeschlagenen Erweiterungsbereich an den Basis-Cache zurück zu geben, um damit weiteren zukünftigen Rückforderungen spekulativ vorzubeugen. Eine Rückgabe ist darüber hinaus auch jederzeit spontan möglich, beispielsweise wenn erkannt wurde, dass ein bestimmter Bereich auf jeden Fall nicht mehr benötigt wird.Speculation about the end user's future working set may be misleading in that oversized areas were requested by the base cache, which would later be needed by other high-level caches 126 . False speculations can be corrected by recoveries using notify _ * operations. Basically, the base cache can generate corresponding notify _ * operations to the current owner instance (on) upon requesting already issued locks. If he notices the differences between assigned core and extension areas (and possibly from later added core areas by the new owner in a timely manner, but asynchronously informed), he can also refrain from providing "hopeless" recoveries that concern assigned core areas. If possible, reclaims of core areas should only be made for those address areas that another cache really needs up-to-date.It is the fault of the wrong speculator, possibly even larger areas than the currently required or even larger than the proposed extension area to the base cache In addition, a return is spontaneously possible at any time, for example, if it was recognized that a certain area is no longer needed in any case.

Insgesamt bewirkt diese Vorgehensweise eine spekulative Vorab-Verteilung von Ressourcen, die durch die aktuellen Anforderungen nachträglich korrigiert wird. Die Rückgabe spekulativ angeforderter Ressourcen kann durch verschiedene Strategien erfolgen. Eine mögliche Rückgabe-Strategie ist, den zwischen dem nächstliegenden tatsächlich selbstgenutzten Bereich und dem rückgeforderten Bereich liegenden spekulativ angeforderten Bereich zu halbieren, also die Hälfte weiter zu behalten, die andere Hälte dem Rückforderer zu überlassen. Falls die Working Sets der Endkonsumenten disjunkt und näherungsweise zusammenhängend sind, dann ergibt sich dadurch im Worst Case eine logarithmische Anzahl von Rückforderngen (in Abhängigkeit von der Größe des aufzuteilenden Adressbereiches). Nach dieser höchstens logarithmischen Anzahl an Rückforderungen ist der vorab unbekannte genaue Verlauf der disjunkten Working Sets empirisch festgestellt worden, und es finden keine weiteren Rückforderungen mehr statt (eingeschwungener Zustand des Systems). Nach dem Einschwingen sind keine weiteren Synchronisationen mehr erforderlich, sofern sich die Working Sets nicht ändern; damit ist der obige Best Case relativ gut approximiert. Bei „langsamen" Änderungen der Working Sets finden zwar ab und zu noch Rückforderungen statt, diese haben jedoch ein relativ geringes Gewicht in den Gesamtzahl aller Operationen; damit ist hier ebenfalls der Best Case relativ gut approximiert. Bei zu starker Überlappung der Working-Sets bzw zu großer Änderungsrate kann es zu einem Thrashing kommen, das jedoch laut obiger Argumentation prinzipiell nicht vermeidbar ist.All in all this approach causes a speculative pre-distribution of Resources that are subsequently corrected by the current requirements becomes. The return Speculatively requested resources can come through different strategies respectively. A possible Return Strategy is the one between the nearest indeed self-occupied area and the reclaimed area halve speculatively requested range, ie half further to keep the other half to the reclaimer. If the working sets of end consumers are disjoint and approximate are connected, then this results in the worst case, a logarithmic number of reclaims (in dependence of the size of the item to be split Address range). After this at most logarithmic number of recoveries is the previously unknown exact course of disjoint working sets been found empirically and there are no further recoveries more instead (steady state of the system). After the swing No further synchronization is required, provided that the working sets do not change so that the above best case is approximated relatively well. For "slow" changes to the working sets may occasionally find recoveries instead, these have a relatively low weight in the total all operations; so here is also the best case relative well approximated. If the working sets overlap too much or too high a rate of change it can come to a thrashing, but according to the above reasoning in principle unavoidable.

6 Generische Operationen6 Generic Operations

Generische Operationen sind Operationen, die über eine polymorphe Schnittstelle aufrufbar. sind. In Betriebssystemen wird das Paradigma der Generizität bzw. der Polymorphie bereits sehr lange eingesetzt; bekannte Beispiele finden sich u.a. bei polymorphen Kern-Schnittstellen wie ioctl in Unix, oder bei den Operations-Sprungtabellen von IBM-Betriebssystemen, die verschiedene Arten von Polymorphie bereits in den 1960er Jahren implementierten.Generic Operations are operations that have a polymorphic interface callable. are. In operating systems, the paradigm of genericity or the Polymorphism has been used for a very long time; find known examples u.a. at polymorphic core interfaces like ioctl in Unix, or in the operation jump tables of IBM operating systems, the different types of polymorphism as early as the 1960s implemented.

Bevor wir zur Untersuchung der Arten von Polymorphie kommen, möchte ich klären, was ein Operations-Aufruf überhaupt ist:
Ein Operations-Aufruf ist die Übergabe von Information von einer Aufrufer-Instanz an eine Bearbeiter-Instanz.
Before we come to the study of the types of polymorphism, I would like to clarify what an operations call is at all:
An operation call is the passing of information from a caller instance to an agent instance.

Nach dieser Definition ist die Rückgabe von Ergebnissen, z.B. in Ergebnis-Parametern, ebenfalls ein Operations-Aufruf, nur in umgekehrter Richtung, d.h. vom ursprünglichen Bearbeiter zurück zum ursprünglichen Aufrufer. In diesem Fall spricht man von einem Operations-Aufrufs-Paar. Operations-Aufrufe bzw -Paare lassen sich auf verschiedene Weisen realisieren. Bekannte Realisierungs-Arten sind z.B. Prozeduraufrufe mittels Übergabe von Parametern auf dem Stack eines Programmiersprachen-Laufzeitsystems, oder der RPC (Remote Procedure Call). Ersterer Fall läßt nur den synchronen Aufruf, letzterer Fall auch den asynchronen Aufruf zu. Weitere bekannte Realisierungs-Arten sind das Starten von Kontrollflüssen (asynchrones Verhalten), oder die Weitergabe der Flusskontrolle in einem Coroutinen-Modell durch Aufruf einer Transfer-Operation (dies bewirkt synchrones Verhalten aus Sicht des Gesamtsystems).To this definition is the return of results, e.g. in result parameters, also an operations call, only in the reverse direction, i. from the original editor back to the original one Caller. In this case we speak of an operation call pair. Operation calls or pairs can be done in different ways realize. Known implementation types are e.g. procedure calls by handover parameters on the stack of a programming language runtime system, or the RPC (Remote Procedure Call). First case leaves only the synchronous call, the latter case also the asynchronous call. Other well-known implementation types are the start of control flows (asynchronous Behavior), or the passing of flow control in a coroutine model by calling a transfer operation (this causes synchronous behavior from the perspective of the overall system).

Ich möchte auf eine weitere bekannte Art der Realisierung von Operations-Aufrufen fokussieren: das so genannte Nachrichten-Paradigma127, das zwar oft im Kontext von CSP (siehe [Hoa78]) in Erscheinung tritt, prinzipiell jedoch unabhängig von sequentiellen Kontrollflüssen ist. Das Nachrichten-Paradigma wird grundlegend in der Hardware verwendet und steckt z.B. hinter den weit verbreiteten read-write-Schnittstellen, bei denen ja auch Informationen von einer Instanz an eine andere weitergegeben werden.I would like to focus on another well-known way of realizing operation calls: the so-called message paradigm 127 , which often appears in the context of CSP (see [Hoa78]), but in principle is independent of sequential control flows. The news paradigm is fundamentally used in hardware and is behind the widespread read-write interfaces, for example information can also be passed on from one instance to another.

Man sollte sich unbedingt klar machen, dass zwischen einer reinen Nachrichten-Übertragung und einem Operations-Aufruf überhaupt kein prinzipieller Unterschied besteht. Ein solcher Unterschied entsteht erst durch die Interpretation der Nachricht durch den Empfänger, sowie ggf. durch seine Reaktion auf die interpretierte Nachricht.you should definitely make it clear that between a pure news broadcast and an operation call at all there is no difference in principle. Such a difference arises only through the interpretation of the message by the recipient, as well possibly by its reaction to the interpreted message.

Dies bedeutet für unsere Betriebssystem-Architektur, dass wir zur Realisierung von generischen Operationen keine neuen Konzepte einführen müssen, sondern die bereits ausführlich vorgestellten Abstraktionen Nest und Baustein verwenden können.This means for our operating system architecture that we use to realize generic operations do not have to introduce new concepts, but already in detail featured abstractions nest and building block can use.

Konkret wird dies z.B. auf folgende Weise realisiert: Einer Nest-Instanz s wird ein so genanntes Operations-Nest als dynamisches Attribut zugeordnet, oder mit Hilfe einer einer eigenen Elementarfunktion get_ops(s). Das Operations-Nest dient zum Austausch der Nachrichten für die generischen Operationen, die auf dem zugeordneten Nest s ausgeführt werden sollen. Zu einem Operations-Nest op kann man umgekehrt das zugeordnete Nest durch eine Elementarfunktion get_nest(op) zugänglich machen. Es gilt dann get_nest(get_ops(s)) = s.Concrete If this is e.g. realized in the following way: A nest instance s becomes a so-called operations nest as a dynamic attribute assigned or with the help of its own elementary function get_ops (s). The Operations Nest is used to exchange messages for the generic ones Operations that are performed on the associated nest s should. Inversely, the associated one can be assigned to a surgical nest op Make nest accessible through an elementary function get_nest (op). It then applies get_nest (get_ops (s)) = s.

Zum Austausch der Nachrichten werden die in Abschnitt 3.3.8 behandelten Elementaroperationen get_address, put_address,get,put,transfer und wait verwendet. Das Operations-Nest darf zu einem beliebigen Zeitpunkt mehrere Operations-Aufrufe enthalten und ist daher prinzipiell geeignet, um die Funktionalität von Auftrags-Warteschlangen, Gerätetreiber-Warteschlangen u.ä. auszuführen.To the Exchange of messages will be dealt with in section 3.3.8 Elementary operations get_address, put_address, get, put, transfer and wait used. The operations nest is allowed at any time contain several operation calls and is therefore suitable in principle, about the functionality job queues, device driver queues etc. perform.

Zum Übertragen der Nachrichten in einem Operations-Nest müssen auf jeden Fall Elementaroperationen verwendet werden128, die an einen Schnittstellen-Mechanismus aus Abschnitt 2.3.2 gebunden sind, und mit deren Hilfe erst das Konzept der generischen Operationen auf einer höheren Abstraktionsstufe implementiert wird. Rein theoretisch wäre es möglich, auf die Implementierung der Elementaroperationen im zugeordneten Nest zu verzichten und diese ausschließlich durch generische Operationen im zugehörigen Operations-Nest auszuführen. Nicht nur aus Performanz-Gründen, sondern auch aus Symmetriegründen propagiere ich die umgekehrte Methodik, dass Elementaroperationen auf beide Arten aufrufbar sein sollen (und dabei dasselbe tun sollen). Es spielt dann keine Rolle, ob Elementaroperationen direkt auf dem zugeordneten Nest aufgerufen werden oder indirekt über das Operations-Nest in Auftrag gegeben werden129. Es wäre jedoch zu überlegen, die Operationen lock und unlock ausschliesslich mittels generischer Operationen zu realiseren und damit nicht mehr als Elementaroperationen zu betrachten, da diese für die Herstellung von generischen Operationen nicht benötigt werden; damit würden die Schnittstellen-Mechanismen aus Abschnitt 2.3.2 die Eigenschaft der Minimalität erfüllen.In any case, to transfer the messages in an operations nest, it is necessary to use elementary operations 128 that are bound to an interface mechanism in Section 2.3.2 and that first implement the concept of generic operations at a higher level of abstraction. Theoretically, it would be possible to dispense with the implementation of the elementary operations in the associated nest and to execute these exclusively by generic operations in the corresponding operations nest. Not only for performance reasons, but also for reasons of symmetry, I propagate the reverse methodology that elementary operations should be invoked in both ways (and should do the same). It does not matter if elementary operations are invoked directly on the associated nest or indirectly commissioned through the operations nest 129 . However, it would be wise to lock and unlock operations exclusively through generic operations, and thus no longer as elementary operations, since they are not needed for the production of generic operations; Thus, the interface mechanisms of Section 2.3.2 would satisfy the property of minimality.

Weiterhin bietet ein Operations-Nest die Möglichkeit zur atomaren Bündelung von Lock-Operationen. Dazu werden mehrere Lock-Operations-Beschreibungen in ein gemeinsames Datenpaket gepackt. Die Ausführung erfolgt entweder zusammen als atomare Einheit oder gar nicht. Damit lässt sich insbesondere das Handwerker-Problem [Jür73] ohne Einführung weiterer Konzepte lösen. Bei der Bündelung mehrerer wait-Operationen ließe sich die Semantik disjunktiven Wartens ohne Einführung zusätzlicher Konzepte realisieren.Farther An Operations Nest offers the opportunity for atomic bundling of lock operations. This will be several Lock Operations descriptions packed in a common data package. The execution is done either together as an atomic unit or not at all. This is especially the craftsman problem [Jür73] without introduction solve further concepts. When bundling several wait operations to realize the semantics of disjunctive waiting without introducing additional concepts.

Nun zur Problematik der Polymorphie. Aufrufer und Bearbeiter müssen eine generische Operations-Nachricht auf zueinander passende Weise interpretieren, sonst entsteht eine Fehlfunktion des Systems.Now on the problem of polymorphism. Callers and editors must have one Interpret Generic Operations Message in Matching Manner otherwise a malfunction of the system will occur.

Um Informationen darüber aufzubewahren, wie ein Nest-Inhalt zu interpretieren ist, ist das Konzept des Meta-Nestes vorgesehen (vgl. Operation get_meta in Abschnitt 3.4.5; vgl. Abschnitt 4.2)130. Dies kann nun analog auf Operations-Nester übertragen werden. Das Operations-Meta-Nest soll einen Konsens zwischen dem Aufrufer und dem Bearbeiter über die zu verwendenden Datenformate bzw Datentypen vermitteln.In order to keep information about how Nest's content is to be interpreted, the concept of the meta-nest is envisaged (see Operation get_meta in Section 3.4.5, see Section 4.2) 130 . This can now be transferred analogously to operation nests. The operations meta-nest is intended to convey a consensus between the caller and the editor about the data formats or data types to be used.

Wir brauchen also ein Typsystem, wie es prinzipiell bei Programmiersprachen schon lange eingesetzt wird. In der Literatur dieses Gebiets wenden unzählige Varianten von Typsystemen behandelt. Die Auswahl eines konkreten Typsystems fällt leichter, wenn man sich folgende Anforderungen vor Augen hält, die auch schon bisher in Betriebssystemen traditionell eine große Rolle gespielt haben:

  • 1. Eine Typprüfung (d.h. ein Test, ob zwei Datenformate zueinander passen) braucht nur zur Laufzeit erfolgen. Es gibt genügend Anwendungsfälle, wo dies auf jeden Fall erst zur Laufzeit geschehen kann; dynamische Typprüfungen sind also unbedingt erforderlich und können statische Typprüfungen notfalls vollständig ersetzen131. Als Konsequenz hieraus brauchen statische Typprüfungen höchstens bei einfachen Grund-Datentypen und nicht notwendigerweise bei komplexen Datentypen vorgesehen zu werden. Dies vereinfacht ein Typsystem enorm.
  • 2. Welche Typen (d.h. Datenformate) ein Bearbeiter akzeptieren und bearbeiten kann, kann nur dieser alleine festlegen. Typ-Informationen dienen zur Einweg-Kommunikation zwischen Bearbeiter und Aufrufer; damit kommen komplexere Mechanismen wie Typ-Inferenzsysteme nicht auf Systemebene132 in Frage.
So we need a type system, as it has been used in programming languages for a long time. In the literature of this area, innumerable variants of type systems are treated. Selecting a specific type system is easier if you consider the following requirements that have traditionally played a major role in operating systems:
  • 1. A type check (ie a test of whether two data formats match each other) only needs to be done at runtime. There are enough use cases where this can happen at runtime; Dynamic type checks are therefore absolutely necessary and can completely replace static type checks if necessary 131 . As a consequence, static type tests at most need simple basic data and not necessarily for complex data types. This enormously simplifies a type system.
  • 2. Only those can decide which types (ie data formats) an editor can accept and edit. Type information is used for one-way communication between the engineer and the caller; This means that more complex mechanisms such as type inference systems can not be considered at system level 132 .

Es ist klar, dass trotz dieser Einschränkungen viele verschiedene Typsysteme und noch mehr konkrete Realisierungen derselben in Frage kommen. In nächsten Abschnitt werde ich zwei einfache Typsystem vorstellen, die wichtige Grundfunktionen abdecken sollten und lediglich als Beispiele zu verstehen sind.It It is clear that despite these limitations many different Type systems and even more concrete implementations of the same in question come. In next Section, I will introduce two simple type system, the important one Basic functions should cover and only as examples understand.

6.1 Beispiel-Typsysteme6.1 Example Type Systems

Einige Betriebssystem-Konstrukteure haben sich in der Vergangenheit geweigert, Typkonzepte einzuführen, was u.a. zu der historischen Spaltung zwischen Betriebssystem- und Datenbank-Konstrukteure beigetragen hat. Argumente hierfür waren oder sind immer noch, dass im Betriebssystem fest verankerte Typen die Flexibilität mindern, die Schnittstellen verkomplizieren und obendrein Performanz kosten. Ich hoffe, diese Sichtweise relativieren zu können. Es geht mir nicht darum, fest verankerte Typen einzuführen, sondern auf der Basis generischer Schnittstellen die Deklaration beliebiger Typen zu ermöglichen, indem es erweiterbar ist. Typbeschreibungen stellen ein optionales Konzept dar, das auch weggelassen werden kann; dann erhält man Generizität in Reinkultur. Richtig eingesetzt, kann es generische Schnittstellen ergänzen und vereinfachen, indem traditionell von Hand codierte Vorgänge (beispielsweise bei Verwendung von Assembler bis in 1970er Jahre hinein) automatisiert werden. Ich versuche in den folgenden Beispielen zu zeigen, dass exzellente Performanz von Typprüfungen durch die Wahl geeigneter Sprachklassen und Kodierungen erreichbar ist.Some Operating system designers have refused in the past Introduce type concepts, what u.a. to the historical split between operating system and Database constructors contributed. Arguments for this were or are still that types firmly anchored in the operating system the flexibility mitigate the interfaces and on top of that performance costs. I hope to be able to relativize this view. It I do not care about introducing firmly anchored types, but on the basis of generic interfaces, the declaration of any To enable types by being expandable. Type descriptions provide an optional Concept that can also be omitted; then you get genericity in pure culture. Properly used, it can complement generic interfaces and by traditionally hand-coded operations (e.g. using assembler into the 1970s) automated become. I try to show in the following examples that excellent performance of type tests attainable by the choice of suitable language classes and codings is.

6.1.1 Minimal-Typsystem6.1.1 Minimal type system

Hier geht es um die Frage, was ein Typsystem unbedingt enthalten muss, damit generische Operationen einigermaßen brauchbar und benutzbar sind. Alles, was dazu nicht erforderlich ist, versuchen wir weg zu lassen und auf Laufzeit-Tests durch den Bearbeiter zu verlagern.Here is the question of what a type system must necessarily contain making generic operations reasonably usable and usable are. Everything we do not need, we try to get away and to relocate to runtime tests by the editor.

Wenn ein Operations-Nest mehrere verschiedene generische Operationen ermöglichen soll, dann gibt es eine Information, die in jedem Falle sowohl beim Aufrufer als auch beim Bearbeiter vorhanden sein muss:
der Name der Operation.
If an operations nest should allow several different generic operations, then there is information that must be present in both the caller and the agent:
the name of the operation.

Eine einfache Realisierung eines Minimal-Typsystems besteht darin, dass das Meta-Nest des Operations-Nestes eine Liste der implementierten zueinander disjunkten Operationsnamen enthält. Diese Liste läßt sich beispielsweise als lückenlos liegende Folge von Paketen realisieren, deren Grenzen im adjungierten Nest des Meta-Nestes angezeigt werden. Für die Kodierung der Operationsnamen kommen beispielsweise Text-Zeichenketten in Frage, die gegenüber Integer-Konstanten133 zu bevorzugen sind. Mehr braucht ein minimales Typsystem nicht zu enthalten134; ob die Anzahl, Größen und Werte der Operations-Parameter korrekt sind, kann der Bearbeiter selbst prüfen und ggf. mit der Rücklieferung einer Fehlermeldung reagieren.A simple implementation of a minimal type system is that the meta-nest of the operation nest contains a list of implemented disjoint operation names. For example, this list can be realized as a series of packages whose boundaries are displayed in the adjoint nest of the meta-nest. For example, text strings may be used for encoding the operation names, which are preferable to integer constants 133 . More does not need to be contained in a minimal type system 134 ; Whether the number, sizes and values of the operation parameters are correct can be checked by the processor himself and, if necessary, react with the return of an error message.

6.1.2 Einfaches erweiterbares Typsystem6.1.2 Simple extensible type system

Das soeben vorgestellte minimale Typsystem ist bereits insofern erweiterbar, als dass der Wertevorrat für die Kodierung der Operationsnamen so groß gewählt werden kann, dass zukünftige Erweiterungen um neue Operationen praktisch unbeschränkt möglich sind. Es geht jetzt um die Frage von Schnittstellen-Erweiterungen, die man unter die Rubrik „Erweiterungs-Generizität" (vgl. Abschnitt 2.1.2) einordnen kann135. Bei der hier vorgestellten Architektur ist vor dem Einsatz von Erweiterungs-Generizität unbedingt gewissenhaft zu prüfen, ob der gleiche Effekt nicht auch durch kompositorische Generizität (vgl. Abschnitt 2.1.3) erreichbar ist. Kompositorische Generizität hat grundsätzlich Vorrang vor Erweiterungs-Generizität; dieses Philosophie ist ein wichtiges Unterscheidungsmerkmal des hier vorgestellten Ansatzes gegenüber den meisten konkurrierenden Ansätzen.The minimal type system just presented is already expandable in that the value set for the coding of the operation names can be chosen so large that future extensions to new operations are practically unlimited. It is now a matter of the question of interface extensions, which can be classified under the heading "extension genericity" (see section 2.1.2) 135. With the architecture presented here, it is absolutely necessary to scrupulously examine the use of extension genericity Whether the same effect is not achievable through compositional generosity (see Section 2.1.3.) Compositional genericity generally takes precedence over extension genericity, and this philosophy is an important distinguishing feature of the approach presented here compared with most competing approaches.

In der Literatur aus dem Gebiet der Programmiersprachen werden Typsysteme als algebraische Struktur aufgefasst, für die eine abstrakte Syntax angegeben werden kann und meist auch nur angegeben wird. Dies genügt i.A. für unsere Zwecke nicht: ein Betriebssystem muss auch die konkreten Datenformate (sog. Aufruf-Konventionen) festlegen, da die System-Schnittstellen übergreifend für unterschiedliche Aufrufer-Typen gelten sollen, insbesondere den Anschluss an unterschiedliche Programmiersprachen und Laufzeitsystem-Modelle ermöglichen sollen. Wir benötigen daher eine Spezifikation der algebraischen Struktur in konkreter Syntax136.In the field of programming languages, type systems are considered to be algebraic structures for which an abstract syntax can be given and usually only given. This is not sufficient for our purposes: an operating system must also specify the specific data formats (so-called call conventions), since the system interfaces should apply across different caller types, in particular to enable connection to different programming languages and runtime system models , We therefore need a specification of the algebraic structure in conc ter syntax 136 .

Zur Spezifikation einer konkreten Syntax eignen sich bekanntermaßen kontextfreie Grammatiken. Diese bringen jedoch in ihrer Allgemeinform das Problem der Mehrdeutigkeit mit sich: bei unbedachter Verwendung zur Beschreibung von Datenformaten kann es vorkommen, dass ein konkret vorliegendes Datenformats-Muster verschiedene Interpretationen zulässt. Aus der Theorie der formalen Sprachen ist bekannt, dass die Mitgliedschaft einer beliebigen Grammatik in der Klasse der eindeutig kontextfreien Sprachen nicht entscheidbar ist; zum Glück gibt es jedoch entscheidbare Unterklassen wie die bekannten LR(k) oder LL(k)-Grammatikklassen. Diese sind nicht nur entscheidbar, sondern reichen für praktische Zwecke vollkommen aus137.Context-free grammars are known to be suitable for specifying a concrete syntax. However, in their general form they bring with them the problem of ambiguity: if carelessly used to describe data formats, it may happen that a concrete data format pattern allows different interpretations. From the theory of formal languages it is known that the membership of any grammar in the class of uniquely context-free languages is not decidable; Fortunately, however, there are decidable subclasses such as the well-known LR (k) or LL (k) grammar classes. These are not only decidable, but sufficient for practical purposes entirely of 137th

Ich möchte noch einen Schritt weitergehen und zeigen, dass für die Zwecke von Betriebssystemen die Klasse derjenigen LL(1)-Grammatiken ausreichend ist, die sich zusätzlich in Greibach-Normalform138 befinden. Das Wortproblem bzw. das Parsing-Problem ist bei diesen Grammatiken trivial lösbar, da man beispielsweise das bekannte Verfahren des rekursiven Abstiegs in interpretativer Weise direkt auf einer Kodierung der Grammatik ausführen kann, ohne die bei LL(1) notwendigen FIRST-Mengen berechnen zu müssen, da diese trivialerweise mit dem ersten Terminalsymbol übereinstimmen, mit dem jede Grammatikregel wegen der Greibach-Normalform beginnen muss. Die beim rekursiven Abstieg notwendigen Parsing-Entscheidungen werden dadurch trivial.I would like to go a step further and show that, for the purposes of operating systems, the class of LL (1) grammars that are additionally in Greibach normal form 138 is sufficient. The word problem or the parsing problem is trivially solvable in these grammars, since, for example, the well-known method of recursive descent can be interpreted in an interpretative manner directly on a grammatical encoding without having to calculate the FIRST sets required by LL (1) because they trivially match the first terminal symbol with which every grammatical rule must begin because of Greibach's normal form. The necessary parsing decisions during recursive descent become trivial.

Um sicherzustellen, dass eine Greibach-Grammatik auf jeden Fall die LL(1)-Eigenschaft erfüllt, gibt es eine einfache Methode, die leicht zu erlernen und zu beherrschen sein dürfte: Man verlangt als Ersatz-Forderung für die LL(1)-Eigenschaft, dass keine verschiedenen Produktionsregeln der Form X → aα und X → aβ mit gleichem Nichtterminalsymbol X und gleichem Terminalsymbol a, aber verschiedenen Fortsetzungen α und β vorkommen dürfen. Diese Forderung läßt sich dadurch einhalten, dass man für α bzw. β ein neues Nichtterminalsymbol Y einführt, das die Rolle der bisherigen Reste α und β gemeinsam ausführen und übernehmen soll. Da alle Produktionen für Y wiederum den gleichen Erfordernissen unterliegen, ergibt sich die LL(1)-Eigenschaft beim Entwurf der kontextfreien Grammatik durch einen Menschen ganz von selbst. Ich nenne eine Greibach-Grammatik mit dieser Ersatz-Forderung eine Typ-Grammatik.Around make sure that a Greibach grammar is definitely the one Satisfies LL (1) property, There is a simple method that is easy to learn and master should be: It is claimed as a substitute requirement for the LL (1) property that no different rules of production of the form X → aα and X → aβ with the same Nonterminal symbol X and same terminal symbol a, but different Sequences α and β occur allowed to. This requirement can be keep in mind that for α or β a new Introduces non-terminal symbol Y, that perform the role of the previous residues α and β together and take over should. Because all productions for Y again subject to the same requirements arises the LL (1) property when designing the context-free grammar a person by itself. I call a Greibach grammar with this replacement requirement a type grammar.

Eine Typ-Grammatik setzt die folgenden bekannten Grundprinzipien des Entwurfs von Datenstrukturen direkt in leicht zu handhabende Grammatik-Regeln um:

  • • Die Schachtelung
  • • Die Sequenz
  • • Die Alternative
A type grammar directly translates the following known basic principles of data structure design into easy-to-use grammar rules:
  • • The nesting
  • • The sequence
  • • The alternative

Eine Schachtelung von Datenformaten wird durch die Unterscheidung zwischen Terminal- und Nichtterminalsymbolen ausgedrückt; ein Nichtterminalsymbol läßt sich an verschiedenen Stellen wiederverwenden. Eine Sequenz von Datenformaten139 wird durch Hintereinander-schreiben von Terminal- oder Nichtterminalsymbolen in einer Grammatikregel ausgedrückt; mathematisch gesehen repräsentiert es ein kartesisches Produkt. Alternativen zum gleichen Nichtterminal müssen im Gegensatz zu beliebigen kontextfreien Grammatikregeln stets durch voneinander verschiedene Terminalsymbole140 eingeleitet werden, so dass die jeweils richtige Alternative stets am Anfang eines rekursiven Abstiegs durch einen trivialen Diskriminator141 erkannt werden kann.Nesting of data formats is expressed by the distinction between terminal and non-terminal symbols; a non-terminal symbol can be reused in various places. A sequence of data formats 139 is expressed by concatenating terminal or nonterminal symbols in a grammatical rule; mathematically, it represents a Cartesian product. Alternatives to the same nonterminal, unlike arbitrary context-free grammar rules, must always be initiated by mutually different terminal symbols 140 , so that the respectively correct alternative can always be recognized at the beginning of a recursive descent by a trivial discriminator 141 .

Im Gegensatz zu Programmiersprachen wird diese Methodik in Betriebssystemen vollkommen dynamisch eingesetzt; die Erkennung eines Datenformats kann i.A. nicht vom Typsystem eines Compilers vorweggenommen werden, sondern muss mindestens bei der Verdrahtungs-Operation zur Laufzeit durchführbar sein. Hierfür eignet sich die Laufzeit-Interpretation142 von Datenformaten mit Hilfe kontextfreier Grammatikregeln ganz besonders. Performanz-Steigerungen durch Vorübersetzung von Typ-Grammatiken in deterministische Kellerautomaten sind dadurch nicht ausgeschlossen143.Unlike programming languages, this methodology is used quite dynamically in operating systems; In general, the recognition of a data format can not be anticipated by the type system of a compiler, but must at least be feasible at runtime during the wiring operation. For this purpose, the runtime interpretation 142 of data formats using context-free grammar rules is particularly suitable. Performance increases by pre-translation of type grammars into deterministic pushdown automata are not excluded 143 .

Eine konkrete Realisierung mittels interpretierbaren Typ-Grammatiken könnte beispielsweise folgendermaßen aussehen:
Nichtterminalsymbole werden durch ASCII-Zeichenketten aus Großbuchstaben und Unterstrich dargestellt. Ein Beispiel wäre „IP_ADDRESS".
For example, a concrete implementation using interpretable type grammars might look like this:
Nonterminal symbols are represented by upper case ASCII strings and underscore. An example would be "IP_ADDRESS".

Terminalsymbolklassen verhalten sich logisch wie Nichtterminale, zu denen keine Regeln definiert werden dürfen, da es bereits fest eingebaute Regeln für sie gibt144. Sie werden durch ASCII-Zeichenketten in Kleinschreibung dargestellt, denen eine ASCII-kodierte Zahl angefügt ist, die den Platzbedarf in Bytes beschreibt. Beispiele sind „int1", „int2", „int4" oder „int8", die vorzeichen-behaftet zu interpretierende Maschinenwörter der jeweiligen Länge darstellen sollen, oder „space512" für einen uninterpretierten Datenblock. Weitere Terminalsymbolklassen wie „bigendian_unsigned_int4" lassen sich später jederzeit hinzu erfinden; welche Bedeutung sich hinter dem Namen verbirgt, ist für das Parsen des Datenformats egal, nur der Platzbedarf ist entscheidend.Terminal symbol classes behave logically like nonterminals, to which no rules can be defined, since there are already built-in rules for them 144 . They are represented by lowercase ASCII strings, which are appended with an ASCII-encoded number that describes the amount of space in bytes. Examples are "int1", "int2", "int4" or "int8", the signed-to-be-interpreted machines or "space512" for an uninterpreted data block Further terminal symbol classes such as "bigendian_unsigned_int4" can be invented later at any time; the meaning behind the name does not matter for the parsing of the data format, only the space requirement is decisive.

Terminalsymbole werden durch Hintereinander-schreiben einer Terminalsymbolklasse und einer konkreten Ausprägung in Klammern notiert. Beispiele sind „int2(7)" oder „int4(–1)". Für Zeichenketten variabler Länge kann man eine Konvention der Art „string ('Name')" einführen, bei der sich der aktuelle Platzbedarf aus dem Text zwischen den Hochkommata ergibt.terminal symbols are written by consecutive-writing a terminal symbol class and a concrete expression noted in parentheses. Examples are "int2 (7)" or "int4 (-1)". For Character strings of variable length you can introduce a convention of the kind "string ('Name')", at the actual space requirement from the text between the quotes results.

Grammatikregeln lassen sich beispielsweise auf folgende Weise kodieren:
„STRUCTURE=int1(0);SUBSTRUCTURE;int4;"
Grammar rules can be encoded, for example, in the following way:
"STRUCTURE = int1 (0); substructure; int4;"

Wie zu erkennen ist, werden die Strichpunkte nicht nur als Trennzeichen, sondern auch als Abschlusszeichen einer Regel eingesetzt. Die Typgrammatik-Eigenschaft ist erfüllt, wenn keine zwei Regeln vorhanden sind, die bis zum Auftreten des ersten Strichpunktes miteinander übereinstimmen; weiterhin müssen alle Regeln zum gleichen Nichtterminal „STRUCTURE" hinter dem Gleichheitszeichen mit der gleichen Terminalsymbolklasse beginnen. Falls ein Nichtterminal keine Alternativen enthalten soll oder darf, dann ist als Sonderfall eines Terminalsymbols auch „0(0)" zulässig, das einen Diskriminator repräsentiert, der keinen Platz beansprucht und von dem es deshalb nur eine einzige Ausprägung gibt (so dass als Folge davon keine weiteren Alternativen mehr zulässig sind).As can be seen, the semicolons are not just separators, but also used as the terminator of a rule. The type grammar property is satisfied, if there are no two rules until the occurrence of the first semicolon coincide with each other; all must continue Rules for the same nonterminal "STRUCTURE" behind the equals sign with the start same terminal symbol class. If a nonterminal should not or may not contain alternatives, then, as a special case, one Terminal symbol also allowed "0 (0)" represents a discriminator, which occupies no space and of which therefore only one shaping (so that no further alternatives are allowed as a result).

Für das Startsymbol der Grammatik kann man eine Konvention einführen, beispielsweise ein Nichttenninalsymbol „OP" für die Beschreibung von Operations-Nestern, oder „DATA" für die Beschreibung von Datenformaten in persistenten Nestern. Die Beschreibung der vier Grundoperationen sieht dann beispielsweise folgendermaßen aus:

Figure 00750001
For the start symbol of the grammar, one can introduce a convention, for example a non-terminal symbol "OP" for the description of operation nests, or "DATA" for the description of data formats in persistent nests. The description of the four basic operations then looks like this, for example:
Figure 00750001

Dieses Beispiel stellt nur die wichtigsten Grundelemente eines Typsystems vor und sollte für den praktischen Einsatz um weitere Ausdrucksmöglichkeiten erweitert werden, etwa Feldnamen zur Beschreibung von Records oder weitere Terminalklassen zur Beschreibung von Bitfeldern oder von Bereichstypen, sowie von Ausrichtungs-Konventionen („alignment"). Mit Hilfe weiterer Konventionen ist beispielsweise die automatisierte Überprüfung der Gültigkeit von Adressbereichen oder von Deskriptoren möglich, so dass diese nicht mehr wie in bisherigen Betriebssystem-Implementierungen „von Hand" ad hoc getestet werden muss.This Example represents only the most important basic elements of a type system before and should be for the practical use can be extended by further expression possibilities, for example, field names describing records or other terminal classes to describe bit fields or range types, as well as alignment conventions ("Alignment"). With the help of others Conventions, for example, the automated verification of validity of address ranges or descriptors possible, so they are not more ad hoc tested as in previous operating system implementations "by hand" must become.

6.2 Zusammenhang mit Objektorientierung6.2 Connection with object orientation

32 zeigt den Zusammenhang der vier vorgestellten Nest-Arten mit bekannten Konzepten der Objektorientierung. Die gestrichelten Trennlinien sollen eine Unterteilung des Feldes nach zwei verschiedenen Kriterien andeuten:

  • • Unterteilung in Objekt-Instanzen und Klassen: Nest-Instanz versus zugehöriges Meta-Nest
  • • Unterteilung in Attribute und Methoden: Daten-Nest versus Operations-Nest
32 shows the relationship of the four introduced nest species with known concepts of object orientation. The dashed dividing lines should indicate a subdivision of the field according to two different criteria:
  • • Subdivision into object instances and classes: Nest instance versus associated meta nest
  • • Subdivision into attributes and methods: Data Nest versus Operations Nest

Die Beziehungen von Instanzen der jeweiligen Nest-Art sind durch Pfeile mit Beschriftung der zugehörigen Zugriffsfunktionen gekennzeichnet. Eine Nest-Instanz steht mit ihrer zugehöriger Operations-Nest-Instanz in einer 1:1-Beziehung, genau wie beim Zusammenpacken von Attributen und Methoden in der Objektorientierung zu einer Objekt-Instanz. Der Status einer Objekt-Instanz wird dabei in der Nest-Instanz abgespeichert.The Relations of instances of the respective nest species are indicated by arrows with caption of the associated Access features marked. A Nest instance stands with her associated Operations Nest instance in a one-to-one relationship, just like when packaging Attributes and Methods in Object Orientation to an Object Instance. The status of an object instance is stored in the nest instance.

Der Zusammenhang mit der Vererbung läßt sich durch zwei Anpassungs-Bausteine darstellen, die entsprechende Transformationen auf den Nestern bzw. Meta-Nestern durchführen.Of the Connection with inheritance is possible represented by two adaptation modules, the corresponding transformations on the nests or meta-nests.

Beim downcast (siehe 33) wird die Schnittstelle erweitert; zu den am Eingang base_class verfügbaren Attributen und Methoden können neue hinzukommen, die am Ausgang son_class zur Verfügung gestellt werden; ggf. kann dabei auch die Implementierung (bzw. das Verhalten) einiger Methoden abgeändert werden (überschriebene Methoden und virtuelle Methoden). Da sich dabei der Umfang des abgespeicherten Status vergrößern kann, ist ein Eingang tmp vorgesehen, um diesen aufzunehmen. Bei geeigneten Konventionen über die Platz-Allokation im base_class-Nest läßt sich der Status aber auch dort abspeichern, so dass tmp überflüssig wird.When downcast (see 33 ) the interface is extended; new attributes can be added to the attributes and methods available at the base_class input, which are provided at the son_class output; if necessary, the implementation (or the behavior) of some methods can be changed (overridden methods and virtual methods). Since the extent of the stored status can increase, an input tmp is provided to accommodate this. However, with appropriate space allocation rules in the base_class nest, the status can also be stored there, making tmp redundant.

Beim upcast (siehe 34) wird lediglich die Schnittstelle verkleinert, so dass nicht mehr alle Attribute und Methoden von außen145 zugreifbar sind (Prinzip der Verbergung).When upcast (see 34 ) only the interface is reduced, so that not all attributes and methods are accessible from the outside 145 (principle of concealment).

Aus dieser Beschreibung wird ersichtlich, dass die Konzepte der Objektorientierung einen Spezialfall der hier vorgestellten Methodik darstellen. Durch die Abstraktionen Nest und Baustein sind folgende Konzepte realisierbar, die bei üblichen146 Ausprägungen von Objektorientierung im Regelfall nicht vorgesehen sind:

  • • Austausch einzelner Methoden-Implementierungen zur Laufzeit, und zwar unabhängig von einer Klassenhierarchie147
  • • Änderung der Repräsentation von Attributen (beim Erweitern der Schnittstelle und/oder zur Laufzeit); vgl. Anhang B.
  • • Aufspaltung eines Status-Raums in beliebige Kombinationen von Teilräumen148
  • • Einfache Verwendung beliebig unterschiedlicher Methoden-Sätze149
It can be seen from this description that the concepts of object orientation represent a special case of the methodology presented here. The abstractions nest and building block make it possible to realize the following concepts, which as a rule are not provided for the usual 146 forms of object orientation:
  • • Exchange of individual method implementations at runtime, independent of a class hierarchy 147
  • • changing the representation of attributes (when extending the interface and / or at runtime); see. Appendix B.
  • Splitting a status space into arbitrary combinations of subspaces 148
  • • Simple use of arbitrary different sets of methods 149

6.3 Zusammenhang mit dem Funktionalen Paradigma6.3 Connection with the Functional paradigm

Die Grundidee eines lambda-Bausteins (siehe 35) ist, einen universellen Interpreter zu schaffen, dessen tatsächliche Funktionsweise durch den Inhalt des expr-Eingang in einer geeigneten Kodierung festgelegt wird. Am Ausgang f werden besondere generische Operationen zur Verfügung gestellt, die über die gestrichelt gezeichneten Leitungen vom in 36 vorgestellten apply verwendet werden können. Eine von lambda erzeugte Funktion stellt keine vollständige Space-Instanz mit einem Zustand dar, sondern stellt lediglich die Operationen bereit, die die Funktion f realisieren, wenn sie mit Hilfe von apply und einem Argument x zu einer funktionsfähigen Nest-Instanz f(x) verknüpft werden. Da dabei zusätzlich zum in x gehaltenen Status weiterer Platzbedarf für Status-Information zur Berchnung von f(x) erforderlich sein kann, wird wie für solche Fälle üblich ein tmp-Eingang vorgesehen.The basic idea of a lambda device (see 35 ) is to provide a universal interpreter whose actual operation is determined by the content of the expr input in an appropriate encoding. At the output f special generic operations are provided, which are indicated by the dashed lines of in 36 featured apply can be used. A function generated by lambda does not represent a complete space instance with a state, but merely provides the operations that implement the function f when it joins to a working nest instance f (x) using apply and an argument x become. Since, in addition to the status held in x, further space requirement for status information for the calculation of f (x) may be required, a tmp input is provided as usual for such cases.

Die Funktionsweise ist wie folgt skizziert: wenn am Ausgang f(x) irgendwelche Nest-Operationen aufgerufen werden, dann ruft apply die generischen Operationen des f-Eingangs mit den passenden Daten-Argumenten auf, die es vorher aus x gewonnen hat (und übergibt ggf. weiteren aus tmp gewonnenen Hilfsspeicher, der Instanz-spezifisch ist).The Operation is outlined as follows: if at the output f (x) any Called nest operations, then call the generic Operations of the f input with the appropriate data arguments on, which it has previously won from x (and possibly passes others from tmp recovered auxiliary storage that is instance-specific).

Funktionen höherer Ordnung [Fie88] lassen sich nach dem gleichen Prinzip erzeugen. Am Ausgang von apply erscheinen dabei lediglich keine voll funktionsfähigen Nester, sondern nur Operations-Nester, die mit Hilfe weiterer apply-Instanzen erst normal benutzbare Nester ergeben.features higher Order [Fie88] can be created on the same principle. At the exit of apply, only fully functional nests do not appear but only surgical nests using additional apply instances yield only normal usable nests.

Bausteine und ihre Verdrahtungen sind für sich genommen bereits universelle Konstrukte, die sich beispielsweise auch mit theoretisch interessanten Beschreibungen wie den Hotz'schen X-Kategorien beschreiben lassen.building blocks and her wiring is for already taken themselves universal constructs, for example also with theoretically interesting descriptions like the Hotzian X-categories describe.

Weiterhin ist zu erwähnen, dass man rein theoretisch bekannte Verfahren zur Term- oder Graph-Reduktion auch durch Vorschaltbausteine in den Steuerleitungen von control (Abschnitt 4.2.1) realisieren könnte. Theoretisch könnte man damit auch rein syntaktische Evaluationen mit Hilfe in den Baustein-Verdahtungen gespeicherten Beziehungen betreiben, ohne den Zustand der beteiligten Nester benutzen zu müssen. Die Baustein-Verdrahtungen werden dabei zur Repräsentation einer algebraischen Struktur missbraucht. Dieser theoretische Zusammenhang beleuchtet jedoch die Wichtigkeit und Notwendigkeit, in der Praxis sehr auf die in den Verdrahtungen gespeicherte Information und auf ihre nicht immer leicht zu beherrschenden Konsequenzen zu achten.Farther is to mention that theoretically known methods for term or graph reduction also by ballasts in the control lines of control (Section 4.2.1). Theoretically could you can also use syntactic evaluations with the help of the block compilations operated relationships without the state of the involved Nests to use. The block wirings are used to represent an algebraic Structure abused. This theoretical context illuminates However, the importance and necessity, in practice very much the information stored in the wiring and not theirs always easy to control consequences.

Obwohl man in der Praxis den hier aufgezeigten Zusammenhang mit funktionalen Paradigmen eher nicht in der theoretischen Form des allgemeinen Lambda-Kalküls einsetzen sollte (da Nester nicht als Konkurrenz zu etablierten Laufzeitsystemen für funktionale Berechnungen konstruiert wurden), dürften speziellere Formen funktionaler Denk- und Konstruktionsmethoden durchaus wertvolle praktische Anwendungen haben. Universell einsetzbare Interpreter brauchen nicht unbedingt pure funktionale Paradigmen zu beachten, sondern können in der Praxis durchaus „hemdsärmelig" wie beispielsweise durch einen Perl-Interpreter [Haj00] realisiert werden, der seinen Programmcode aus einem Eingang bezieht, der von den zu bearbeitenden Daten getrennt ist150. Damit lassen ich beispielsweise Prototypen sehr schnell entwickeln.Although in practice the connection with functional paradigms shown here should rather not be used in the theoretical form of the general lambda calculus (since nests are not used as competitors) In addition, more specialized forms of functional thinking and design methods may well have valuable practical applications. Universal interpreters do not necessarily have to consider purely functional paradigms, but can in practice be realized in a "shirt-sleeved" manner, for example by a Perl interpreter [Haj00], which derives its program code from an input separate from the data to be processed 150. For example, I have prototypes developed very quickly.

6.4 Zusammenhang mit Datenbank-Schemata6.4 Correlation with Database Schemes

Relationale Datenbank-Schemata lassen sich mittels Nestern und Bausteinen erzeugen, umwandeln, in Datenbank-Instanzen umsetzen, und die instantiierten Daten verarbeiten.relational Database schemas can be generated using nests and building blocks, convert to database instances, and the instantiated ones Process data.

In einem Nest lassen sich Datenbank-Tabellen und Indizes ablegen, das zugehörige (Teil-)Schema wird im Meta-Space bzw in den Attributen in einer geeigneten Repräsentation gehalten. Durch einen Baustein gen_table (siehe 37) kann ein reines Schema, das ein oder mehrere Metabeschreibungen von Tabellen enthält, in ein oder mehrere151 entsprechende Tabellen instantiiert werden. Der persistente Status wird im tmp-Eingang gehalten und am Ausgang zur Verfügung gestellt. Es wird dafür gesorgt und geprüft, dass die instantiierten Datensätze sowohl syntaktisch als auch semantisch dem Schema-Aufbau entsprechen.Database tables and indexes can be stored in a nest, and the associated (sub) schema is kept in a suitable representation in the meta-space or in the attributes. By a building block gen_table (see 37 ), A pure schema that contains one or more meta descriptions of tables, in one or more 151 corresponding tables are instantiated. The persistent status is kept in the tmp input and made available at the output. It is ensured and checked that the instantiated data records correspond both syntactically and semantically to the schema structure.

Datensätze fester Länge lassen sich am einfachsten als zusammenhängendes Array abspeichern. In diesem Fall braucht das adjungierte Nest nicht unbedingt die Grenzen jedes einzelnen Datensatzes darzustellen, da diese Information leicht berechnet werden kann. Bei variabler Datensatz-Länge ist allerdings die Repräsentation lückenlos liegender Pakete (vgl. Abschnitt 3.4.1) im adjungierten Nest angebracht. Falls aus Gründen der Uniformität diese Art der Darstellung auch bei festen Datensatzlängen gefordert wird, läßt sich der Inhalt des adjungierten Nestes intern auf virtuelle Weise berechnen, ohne Platz im persistenten Speicher zu verbrauchen. Eine weitere Möglichkeit besteht darin, die Bestandteile von Datensätzen mit fester Länge von denjenigen mit variabler Länge zu trennen, so dass eine performante Array-Darstellung der Datensätze mit Verweisen auf einen Heap-Bereich entsteht, der die variablen Teile beherbergt; derartige Verweise entsprechen konzeptionell den Datensatz-Beschreibungen im adjungierten Nest und sollten aus Gründen der Uniformität an einer Stelle zentralisiert werden; das Konzept des adjungierten Nestes eignet sich hierfür besonders152. Um eine gute Kombinierbarkeit von Bausteinen zu erhalten, sollten diese Konventionen einheitlich festgelegt werden.Fixed-length records are most easily stored as a contiguous array. In this case, the adjoint nest does not necessarily have to represent the boundaries of each individual record, as this information can be easily calculated. With variable data record length, however, the representation of gapless packets (see Section 3.4.1) is appropriate in the adjoint nest. If, for reasons of uniformity, this type of representation is also required for fixed data record lengths, the contents of the adjoint nest can be calculated internally in a virtual way, without taking up any space in the persistent memory. Another possibility is to separate the components of fixed-length data sets from those of variable length so that a high-performance array representation of the data sets with references to a heap area accommodating the variable parts; such references conceptually correspond to the record descriptions in the adjoint nest and should be centralized in one place for reasons of uniformity; the concept of the adjoint nest is particularly suitable for this 152 . In order to obtain a good combinability of building blocks, these conventions should be defined uniformly.

Über die Sortierung von Datensätzen wurde bisher nichts gesagt. Es ist möglich, eine Tabelle gleich von vornherein nach einem Primärschlüssel sortiert zu halten (vgl. 38). Da Sekundärschlüssel jedoch unabhängige Sichten erlauben, ist es günstig, die Schlüssel unabhängig von ihrer Art und Anzahl ebenfalls im Nest zu halten. Eine Schlüssel-Repräsentation kann beispielsweise als Array von Index-Nummern der Datensätze erfolgen, die nach dem Schlüssel sortiert sind. Einfügungen und Löschungen von Datensätzen werden dann durch move-Operationen auf den jeweiligen Arrays bewerkstelligt. Natürlich ist es ebenfalls möglich, klassische Repräsentationen wie B+-Bäume zu verwenden, doch sind diese wesentlich komplizierter aufgebaut und schwerer zu interpretieren. Da Nester vorzugsweise universelle Generizität mittels sehr einfacher Datenstrukturen repräsentieren sollten, halte ich die Verwendung sortierter Arrays für günstiger, zumal eine billige move-Operation zur Verwaltung dieser Array-Strukturen zur Verfügung steht. Performante Suchstrukturen wie B-Bäume. werden dadurch nicht überflüssig; sie werden lediglich an anderer Stelle einer Baustein-Hierarchie eingesetzt, nämlich bei der Erzeugung dynamischer Nester (Baustein map in Abschnitt 4.1.3).Nothing has been said yet about the sorting of records. It is possible to keep a table sorted by a primary key right from the start (cf. 38 ). However, because foreign keys allow independent views, it is convenient to keep the keys in the nest regardless of their type and number. For example, a key representation can be an array of index numbers of the records sorted by key. Insertions and deletions of records are then accomplished by move operations on the respective arrays. Of course it is also possible to use classical representations like B + trees, but they are much more complicated and difficult to interpret. Since nests should preferably represent universal genericity by means of very simple data structures, I consider the use of sorted arrays more favorable, especially since a cheap move operation is available for the administration of these array structures. High-performance search structures like B-trees. do not become superfluous; they are merely used elsewhere in a building block hierarchy, namely in the generation of dynamic nests (building block map in Section 4.1.3).

Die Operationen der Relationen-Algebra wie Selektion, Projektion und Kartesische Produktbildung durch verschiedene join-Varianten (siehe 39) lassen sich direkt durch Bausteine darstellen und ausführen. Details werden weiteren Arbeiten zur Integration von Datenbanken in Betriebssysteme überlassen.The operations of relations algebra such as selection, projection and Cartesian product formation through different join variants (see 39 ) can be represented and executed directly by building blocks. Details are left to further work on the integration of databases in operating systems.

7 Multiversion-Modelle7 multiversion models

In diesem Kapitel soll untersucht werden, wie sich die Funktionalität von Transaktionen auf einfache generische Weise in die Nest-Schnittstelle integrieren lässt. Ziel ist nicht die vollständige Abdeckung aller nur denkbarer multiversion-Modelle, sondern die exemplarische Auswahl und Darstellung einiger (hoffentlich) für praktische Zwecke geeigneter Modelle, die hinsichtlich der gängigsten Transaktions-Semantiken universelle Generizität bereit stellen sollten.In This chapter aims to examine how the functionality of transactions integrate into the nest interface in a simple generic way leaves. The goal is not the complete one Cover all conceivable multiversion models, but the exemplary selection and presentation of some (hopefully) for practical For purposes of appropriate models, the most common Transaction semantics should provide universal genericity.

Historisch betrachtet hatten Transaktionen [BHG87, LS87, GR93, Elmbe] das Ziel, trotz paralleler Aktivitäten jedem Konsumenten ein singleuser-Modell bereit zu stellen, so dass sich Programmierer nicht um Parallelität zu kümmern brauchten. Nach ausführlicher Untersuchung von Synchronisation und Rücksetzen (recovery) wurde entdeckt, dass man trotz singleuser-Ausgangsbasis mit Versionen von Datenobjekten zu tun hatte; ohne Versionierung ist Rücksetzen nicht denkbar. Daraufhin wurden Multiversibns-Varianten von Transaktionen [VGH93] untersucht, insbesondere Zeitstempel-Verfahren auf Basis von Versionen (time stamp ordering, time domain addressing). Im Folgenden setze ich die Kenntnis der wesentlichen Grundkonzepte aus der Datenbank-Welt aus der genannten Literatur beim Leser voraus. Für unsere Zwecke sind generische Transaktions-Mechanismen an der Nest-Schnittstelle gefragt, mit denen möglichst universell verschiedene Transaktions-Modelle als Strategie durch Bausteine implementierbar sind.Historically, transactions [BHG87, LS87, GR93, Elmbe] had the goal of providing each consumer with a single-user model, despite concurrent activity, so that programmers would not be interested in Pa Rallelität needed to take care of. After extensive research into synchronization and recovery, it was discovered that, despite the single-user baseline, we were dealing with versions of data objects; Without versioning, resetting is inconceivable. Subsequently, multiversibns variants of transactions [VGH93] were examined, in particular time stamping, time domain addressing. In the following I presuppose the knowledge of the essential basic concepts from the database world from the mentioned literature with the reader. For our purposes, generic transaction mechanisms at the nest interface are required, with which as diverse as possible transaction models can be implemented as a strategy through building blocks.

7.1 Anforderungen7.1 Requirements

In Anwendungsbereichen wie z.B. Finanzbuchhaltung gibt es gesetzliche Anforderungen, die das spätere Nachvollziehen (Lesen) aller durchgeführten Aktionen (Operationen) in der zeitlichen Reihenfolge der Durchführung erzwingen (lückenlose zeitliche Dokumentation aller Operationen). Darüber hinaus existieren davon unabhängige sachliche Kriterien als zeitliche Ordnungsmerkmale, unter denen durchgeführte Operationen ebenfalls nachträglich zugreifbar sein müssen. Ein typisches Beispiel aus der Finanzbuchhaltung ist der Unterschied zwischen dem Beleg-Datum eines Belegs und dem Verbuchungs-Datum: die Reihenfolge der Verbuchung (Eintragung) von Belegen muss nicht notwendigerweise in der Reihenfolge ihrer Geltung (Beleg-Datum) erfolgen. Im Journal einer Finanzbuchhaltung müssen alle Einträge mindestens in der Reihenfolge der Eingabe, in den Konto-Auszügen sollten sie zusätzlich in der Reihenfolge ihrer sachlichen Geltung abrufbar sein. Diese Anforderungen lassen sich auf folgende Weise verallgemeinern:

  • 1. Jede jemals durchgeführte Operations-Instanz auf einem Nest muss anhand eines Merkmals (z.B. Zeitstempel) wieder eindeutig auffindbar sein
  • 2. Es können mehrere von einander unabhängige Zeit-Bereiche notwendig sein
In application areas such as financial accounting, there are legal requirements that enforce the subsequent understanding (reading) of all actions performed (operations) in the chronological order of execution (complete time-based documentation of all operations). In addition, there are independent factual criteria as temporal order features, under which carried out operations must also be retrofittable. A typical example from financial accounting is the difference between the document date of a document and the posting date: the sequence of posting documents does not necessarily have to be in the order in which they are valid (document date). In the journal of a financial accounting, all entries must be at least in the order of entry, in the account statements they should also be retrievable in the order of their material validity. These requirements can be generalized in the following way:
  • 1. Every instance of operations ever performed on a nest must be clearly identifiable using a feature (eg timestamp)
  • 2. Several independent time ranges may be necessary

Punkt 1 bedeutet, dass ein „Elefantengedächtnis153" implementierbar sein muss, da es Anwendungen gibt, die dieses aufgrund gesetzlicher Anforderungen verlangen. Falls bei anderen Anwendungen der Overhead stört, lassen sich eingeschränkte Modelle ableiten, bei denen nicht mehr benötigte Informationen gezielt oder automatisch „vergessen" werden.Point 1 means that an "elephant memory 153 " needs to be implementable because there are applications that require it because of legal requirements, and in other applications, if the overhead is disruptive, restricted models can be derived that target or automatically remove unneeded information. be forgotten ".

Punkt 2 scheint auf den ersten Blick zu bedeuten, dass aufgrund gesetzlicher oder sachlicher Anforderungen ein oder mehrere Totalordnungen auf ein oder mehreren Zeit-Bereichen zu implementieren wären. Dies wäre jedoch insbesondere in verteilten Systemen sehr hinderlich. Die folgenden Überlegungen befassen sich hauptsächlich mit diesem Problem.Point 2 seems at first glance to mean that due to legal or material requirements one or more total orders one or more time ranges to implement. This would be, however especially in distributed systems very hindering. The following considerations mainly deal with this problem.

7.2 Allgemeines Modell7.2 General Model

Eine Möglichkeit wäre die Einführung von zeitlichen Halbordnungs-Konzepten in die Nest-Schnittstelle. Eine Totalordnung würde sich dann als Spezialfall dort ergeben, wo dies aufgrund von Anforderungen notwendig wäre. Diese Möglichkeit wird hier aufgrund ihrer hohen Komplexität nicht weiter untersucht154.One possibility would be the introduction of temporal half-plan concepts into the nest interface. A total order would then arise as a special case where this would be necessary due to requirements. This possibility is not further investigated here because of its high complexity 154 .

Stattdessen schlage ich folgende Betrachtungsweise des Problems vor:
Die Idee der Festlegung einer zeitlichen Totalordnung zwischen Operations-Instanzen impliziert nicht notwendigerweise, dass der Festlegungs-Vorgang selbst in totalgeordneter zeitlicher Reihenfolge geschehen muss. Es wird lediglich verlangt; dass das Endergebnis eine zeitliche Totalordnung ergeben muss; wann dieses Endergebnis jedoch berechnet wird, ist eine andere Frage.
Instead, I propose the following approach to the problem:
The idea of establishing a temporal total order between operation instances does not necessarily imply that the determination process itself must be done in a totally ordered order of time. It is only required; that the final result must be a temporal total; however, when this final result is calculated is another question.

Diese Unterscheidung zwischen virtueller Zeit und realer Reihenfolge von Operations-Ausführungen könnte als lazy evaluation bei der Festlegung der zeitlichen Reihenfolge von Operations-Instanzen charakterisiert werden155. Solange eine Totalordnung noch nicht endgültig festgelegt worden ist, können (temporäre) Halbordnungen im Effekt vorkommen. Einmal gemachte Festlegungen lassen sich jedoch nie mehr revidieren; dies ist nichts anderes als die konsequente Anwendung des Persistenz-Gedankens auf die zeitlichen Ordnungsrelationen. Ansonsten ist Persistenz jedoch unabhängig von den erreichten Zwischen oder Endzuständen eines Nestes.This distinction between virtual time and real order of operation executions could be characterized as a lazy evaluation in determining the temporal order of operation instances 155 . As long as a total order has not yet been finally determined, (temporary) partial orders can be effective. However, once made determinations can never be revised; this is nothing other than the consistent application of the persistence idea to the temporal ordering relations. Otherwise, however, persistence is independent of the achieved intermediate or final states of a nest.

Der Endzustand eines Nestes ist erst dann erreicht, wenn nicht nur die Daten-Inhalte und Parameter aller ausgeführten Operations-Instanzen, sondern auch die Zeitstempel der Operations-Instanzen intern fest gelegt sind. Konsumenten erhalten niemals Kenntnis von halb-geordneten Zwischenzuständen; spätestens die Abfrage zeitlicher Relationen an der Nest-Schnittstelle führt automatisch zu einer Festlegung (und damit eventuell zu einer Zustands-Änderung im strengen Sinn, selbst bei einer „simplen" Abfrage).Of the Final state of a nest is reached only if not only the Data contents and parameters of all executed operations instances, but also set the timestamps of the operations instances internally are. Consumers never become aware of semi-ordered ones Between states; at the latest the Querying temporal relations at the nest interface performs automatically to a determination (and thus possibly to a state change in the strict sense, even with a "simple" query).

Die nähere Festlegung vorher (teilweise) unbestimmter zeitlicher Relationen wird Präzisierung genannt; alle zeitlichen Relationen zwischen Operationen eines Nestes werden zusammen gefasst Präzisierungs-Zustand genannt. Präzisierungs-Zustände müssen konsistent sein, d.h. bei einem verteilten System dürfen zwei verschiedene Abfrager keine widersprüchlichen Antworten zum gleichen Sachverhalt bekommen. Die Menge aller ausgeführten Operationen samt deren Parametern, jedoch ohne die zeitlichen Relationen, wird Daten-Zustand eines Nestes genannt.The details Definition of previously (partially) indefinite temporal relations becomes more precise called; all temporal relations between operations of a nest be summarized precisification state called. Precision states must be consistent be, i. in a distributed system, two different queriers are allowed no contradictory Get answers to the same facts. The amount of all executed operations together with their parameters, but without the temporal relations, becomes data state called a nest.

Parallelität von Operationen ist insbesondere dann möglich, wenn keine Abfrage zeitlicher Relationen des Präzisierungs-Zustandes erfolgt (etwa weil zeitliche Ordnungen für das zu lösende Problem keine Rolle spielen). Falls niemals eine Abfrage zeitlicher Relationen zwischen Operations-Instanzen stattfindet, dann kann ein persistenter Speicher im Extremfall lauter unkorrelierte Operations-Instanzen enthalten, deren zeitliche Reihenfolge nicht festgelegt ist (eine Festlegung darf in diesem Fall natürlich trotzdem erfolgen). Ob zwei Operations-Instanzen eine zeitliche Relation zu einander besitzen, könnte mit Hilfe eines Benutzungs-Modells implizit fest gelegt werden. Beispielsweise könnte ein bestimmtes Benutzungs-Modell vorschreiben, dass sämtliche Operationen, die sich auf gegenseitig überlappende Adressbereiche eines Nestes beziehen, in eine Totalordnung gebracht werden müssen. Es sind jedoch Fälle denkbar, in denen selbst diese schwach erscheinende Forderung nicht erfüllt zu sein braucht (beispielsweise wenn irrelevante Operations-Durchführungen einfach ignoriert und niemals mehr betrachtet werden). Da weiterhin sehr viele verschiedene Benutzungs-Modelle denkbar sind, schlage ich vor, keine Annahmen über implizite Abhängigkeiten zwischen Operations-Instanzen in die Nest-Schnittstelle aufzunehmen, sondern jegliche zeitliche Abhängigkeiten explizit zu machen. Die Realisierung unterschiedlicher Benutzungs-Modelle wird dadurch zur Aufgabe konkreter Baustein-Implementierungen.Parallelism of operations is especially possible if there is no query of temporal relations of the preconditioning state (about because temporal orders for the one to be solved Problem does not matter). If never a query temporal Relations between operations instances takes place, then can a persistent memory in extreme cases, entirely uncorrelated operations instances whose chronological order is not fixed (one Of course, this may be done anyway). If two operation instances have a temporal relation to each other, could be determined implicitly with the help of a usage model. For example, could a particular usage model dictate that all Operations that rely on mutually overlapping address ranges of a nest, must be brought into a total order. It are however cases conceivable in which even this weak-seeming demand is not Fulfills to be (for example, when irrelevant operations implementations are easy ignored and never looked at again). Because continue very many different usage models are possible, I suggest ago, no assumptions about implicit dependencies to include between Operations instances in the Nest interface, but any temporal dependencies to make explicit. The realization of different usage models becomes the task of concrete building block implementations.

Das allgemeinste multiversion-Modell sieht so aus, daß zu jeder durchzuführenden Operations-Instanz in irgend einer Form angegeben werden muß, von welchen anderen („früheren") Operations-Instanzen sie abhängt. Die Spezifikation der „früheren" Operations-Instanzen braucht keine individuelle Bekanntschaft aller in Frage kommenden Operations-Instanzen voraus zu setzen, sondern kann durch verschiedene mengen- oder prädikatenorientierte Spezifikationsmechanismen erfolgen.The most general multiversion model looks like that to everyone to be performed Operations instance must be specified in any form, of which other ("previous") operations instances them depends. The specification of the "earlier" operation instances does not need an individual acquaintance of all in question It can be preceded by different instances of operations quantity- or predicate-oriented Specification mechanisms.

Aus der Vielzahl von Spezifikationsmechanismen für zeitliche Ordnungen wähle ich im Folgenden eine bestimmte aus und überlasse die Untersuchung alternativer Mechanismen weiteren Forschungsarbeiten.Out I choose the multitude of temporal order specification mechanisms Below is a specific one and leave the investigation of alternative Mechanisms of further research.

7.3 Zeitintervall-Modell7.3 Time Interval Model

Die Grundidee besteht darin, als Zeitbasis eine physikalische156 Lamportsche Uhr [Lam78] mit genügender Genauigkeit zu verwenden, jedoch den einzelnen Operations-Instanzen keine festen Zeit-Punkte, sondern Zeit-Intervalle (vgl. Begriff der Linearisierbarkeit in [HW90]) zuzuordnen. Im Unterschied zu festgefügten Konsistenzmodellen wie der linearen Konsistenz, die Halbordnungen auch im Endergebnis zulassen, können Zeitstempel-Intervalle zu jedem beliebigen späteren Zeitpunkt nachträglich verkleinert (Spezialfall einer Präzisierung) werden: ein ursprünglicher Zeitstempel [t1, t2] mit t1 ≤ t2 lässt sich jederzeit in [t3, t4] mit t1 ≤ t3, t3 ≤ t4 und t4 ≤ t2 umwandeln.The basic idea is, as a time base a physical 156 Lamportsche pm [Lam78] with sufficient accuracy to use, however, assign each Operations instances no fixed time-points, but time intervals (see. Concept of linearizability in [HW90]). In contrast to firmly established consistency models, such as the linear consistency, which also allow partial orders in the final result, time stamp intervals can be subsequently reduced at any later time (special case of a specification): an original time stamp [t 1 , t 2 ] with t 1 ≤ t 2 can be converted at any time into [t 3 , t 4 ] with t 1 ≤ t 3 , t 3 ≤ t 4 and t 4 ≤ t 2 .

Eine solche Verkleinerung muss immer dann durchgeführt werden, wenn sich beim Vergleich der Zeitstempel zweier Operations-Instanzen op1 und op2, geschrieben t(op1) = [t1, t2] und t(op2) = [t3, t4], eine gegenseitige Überlappung (d.h. t3 ≤ t2 ∧ t1 ≤ t4 oder t1 ≤ t4 ∧ t3 ≤ t2) ergibt. Durch die erzwungene Verkleinerungs-Operation wird sicher gestellt, dass anschliessend entweder t2 < t3 oder t4 < t1 gilt157, d.h. eine Kommutation der beiden Operations-Instanzen ist anschliessend nicht mehr möglich. Solange die Zeitstempel der beiden Operations-Instanzen nicht durch eine implizit oder explizit ausgeführte Vergleichs-Operation miteinander verglichen werden, dürfen sich die Intervalle überschneiden, d.h. es braucht keine endgültige Festlegung der Reihenfolge der beiden Operationen zu erfolgen.Such a reduction must always be carried out when, in the comparison, the time stamps of two operation instances op 1 and op 2 , written t (op 1 ) = [t 1 , t 2 ] and t (op 2 ) = [t 3 , t 4 ], a mutual overlap (ie, t 3 ≦ t 2 ∧ t 1 ≦ t 4 or t 1 ≦ t 4 ∧ t 3 ≦ t 2 ). The forced reduction operation ensures that subsequently either t 2 <t 3 or t 4 <t 1 applies 157 , ie a commutation of the two operation instances is subsequently no longer possible. As long as the time stamps of the two operation instances are not compared by an implicitly or explicitly executed comparison operation, the intervals may overlap, ie there is no need to finalize the order of the two operations.

Für den Benutzer dieses Modells sieht alles so aus, als gäbe es eine totalgeordnete globale Zeit. Die interne Realisierung verwendet jedoch (temporäre) Halbordnungen. Die Präsentation als Totalordnung nach aussen unterscheidet dieses Modell von explizit auf Halbordnungen aufgebauten Modellen.For the user This model looks like there is a total global Time. The internal realization, however, uses (temporary) partial orders. The presentation as a total external order, this model differs from explicit on semi-orders constructed models.

7.4 Container-Operationen: Locks7.4 Container Operations: Locks

Bereits im multiuser-Modell (Abschnitt 3.3.5) dienten Locks zur Klammerung einer Menge von Zugriffs-Operationen. In multiversion-Modellen werden Lock-Operationen analog dazu als zeitliche und räumliche Container aufgefasst, die eine Menge von Zugriffs-Operationen beherbergen können. Die Idee besteht darin, nur noch diese Container als Einheiten für Beziehungen zwischen Zugriffs-Operationen zu verwenden, und von den Details der im Container beherbergten Operationen und Operations-Arten zu abstrahieren.Already in the multiuser model (Section 3.3.5), locks were used to brace a set of access operations. In multiversion models, lock operations are analogously conceived as temporal and spatial containers that can accommodate a lot of access operations. The idea is only abstracting these containers as units for relationships between access operations, and abstracting from the details of the container-hosted operations and types of operations.

Lock-Operations-Instanzen werden als persistente oder quasi-persistente158 Objekte aufgefasst, die eine zeitliche und eine örtliche Dimension besitzen und einem Mandat als Eigentümer zugeordnet sind; verschiedene Transaktionen müssen unter verschiedenen Mandaten laufen. Die örtliche Ausdehnung ist der Bereich des virtuellen Adressraums des Nestes, auf den sich der Lock bezieht. Die zeitliche Ausdehnung entspricht den soeben vorgestellten Intervallen auf einer virtuellen Zeitachse, die unabhängig von der tatsächlichen Ausführungs-Reihenfolge besteht. Während die örtliche Ausdehnung weitgehend festgelegt ist (nachdem sie z.B. einmal als spekulative Locks ausgehandelt wurden, vgl. Abschnitt 5.3), kann die zeitliche Ausdehnung nachträglich jederzeit verkleinert werden (Präzisierung). Ein Container darf nur solche Zugriffs-Operationen beherbergen, die sich auf einen Teil-Bereich der räumlichen und zeitlichen Dimension beziehen. Im Regelfall erben die von einem Container beherbergten Zugriffs-Operationen ihre zeitliche Dimension vom umgebenden Container.Lock Operations instances be construed as persistent or quasi-persistent objects 158 that have a time and a local dimension and a mandate are assigned as the owner; Different transactions must run under different mandates. The spatial extent is the area of the virtual address space of the nest to which the lock refers. The temporal extent corresponds to the just introduced intervals on a virtual time axis, which is independent of the actual execution order. While the local extent is largely fixed (for example, once they have been negotiated as speculative locks, see Section 5.3), the temporal extent can be subsequently reduced at any time (clarification). A container may only accommodate such access operations that relate to a subset of the spatial and temporal dimensions. As a rule, the access operations inherited by a container inherit their temporal dimension from the surrounding container.

In 40 werden Write-Lock-Instanzen durch Rechtecke mit spitzen Ecken, Read-Lock-Instanzen dagegen durch abgerundete Ecken dargestellt. Verschiedene Write-Lock-Instanzen dürfen sich niemals gegenseitig überlappen, d.h. nicht die gleiche Fläche in der zeitlichen und örtlichen Dimension einnehmen. Im Konfliktfall lassen sich Write-Locks jedoch nachträglich immer so verkleinern, dass sie auf der Zeit-Achse nebeneinander passen (aufgrund der eindeutigen Zeitstempel, siehe Abschnitt 7.3). Read-Lock-Instanzen dürfen sich dagegen gegenseitig überlappen.In 40 For example, write-lock instances are represented by rectangles with pointed corners, while read-lock instances are represented by rounded corners. Different write-lock instances must never overlap one another, ie not occupy the same area in the temporal and spatial dimensions. However, in the event of a conflict, write locks can always be subsequently reduced in size so that they fit next to each other on the time axis (due to the unique time stamp, see Section 7.3). On the other hand, read-lock instances may overlap one another.

Die Verhältnisse zwischen Read- und Write-Lock-Instanzen werden in 41 näher untersucht. Die in den Kästchen eingezeichneten Nummern sollen die Reihenfolge159 andeuten, in denen die jeweiligen Locks gesetzt werden sollen. Das Setzen des gestrichelt gezeichneten Locks 3 ist nicht möglich, weil er die durch gestrichelte Linien angedeutete „Sicht" des vorher dagewesenen Locks 2 auf Lock 1 teilweise „verdecken" würde. Falls die Reihenfolge von Lock 2 und 3 vertauscht würde, dann wäre ein Setzen aller drei Locks möglich, jedoch würde dann die Read-Lock-Instanz eine Sicht auf die kleinere Write-Lock-Instanz erhalten. Im Sonderfall von 42 ist eine Konfliktlösung durch nachträgliches Verkleinern möglich.The relationships between read and write-lock instances are given in 41 examined more closely. The drawn numbers in the boxes are intended to indicate the order of 159, in which the respective locks to be set. Setting the dashed lock 3 is not possible because he would "hide" the indicated by dashed lines "view" of the previously existed Lock 2 on Lock 1 partially. If the order of Lock 2 and 3 were reversed then setting all three locks would be possible, but then the read lock would get a view of the smaller write lock instance. In the special case of 42 is a conflict resolution by subsequent reduction possible.

Es gilt folgender Grundsatz: Eine einmal gewährte (bzw. in Anspruch genommene160) Sicht eines Locks auf andere Locks darf nachträglich nicht verändert werden.The following principle applies: Once granted (or used 160 ) view of a lock on other locks may not be subsequently changed.

Die Frage ist, was man unter einer Sicht auf andere Locks verstehen soll. Intuitiv geht es um die bekannte Semantik von Speichern, nach der eine Lese-Operation bzw. ein Read-Lock den Zustand der zeitlich letzten davor liegenden Änderung (Write-Lock bzw. Schreib-Operationen) sehen sollte. Der Unterschied zur klassischen Semantik besteht lediglich darin, dass die Zeitachse ein virtuelles Gebilde ist, auf dem die Relationen „vorher" und „nachher" unabhängig von der tatsächlichen Ausführungsreihenfolge festgestellt werden (sofern eine global eindeutige Ausführungsreihenfolge überhaupt existiert).The The question is what is meant by a view of other locks should. Intuitively, it deals with the well-known semantics of memory a read operation or a read lock the state of the last in time before that change (Write-Lock or write operations) should see. The difference to the classical semantics consists only in that the time axis is a virtual entity on which the relations "before" and "after" are independent of the actual Execution Order (assuming a globally unique execution order at all exists).

7.5 Kausale Abhängigkeiten7.5 Causal dependencies

Die Verallgemeinerung der Idee einer Sicht einer Lock-Instanz auf andere Lock-Instanzen wird direkte kausale Abhängigkeit genannt. Die Verallgemeinerung besteht darin, dass nicht nur Abhängigkeiten wegen der (möglichen) Sicht auf andere Lock-Instanzen gleicher Adressbereiche als kausale Abhängigkeit gewertet werden, sondern darüber hinaus noch beliebige weitere kausale Abhängigkeiten in das (quasi-)persistente Präzisierungs-Zustands-Modell auf explizite Anforderung aufgenommen werden können.The Generalization of the idea of a view of a lock instance on others Lock instances are called direct causal dependency. The generalization is that not just dependencies because of the (possible) View of other lock instances of the same address range as causal dependence but above it In addition, any other causal dependencies in the (quasi) persistent Präzisierungs-state model can be included on explicit request.

Eine typische Anwendung für die Aufnahme extern spezifizierter kausaler Abhängigkeiten ist die Herbrand-Semantik klassischer Transaktionen [VGH93]. Klassische „an der Syntax" orientierte Transaktionen betrachten jede Schreiboperation als kausal abhängig von allen vorher durch die selbe Transaktion gelesenen Objekten. Sogenannte „semantische" Transaktions-Modelle [Elmbe] versuchen dagegen, durch Kenntnisse über den inneren Aufbau der Transaktionen nur diejenigen kausalen Abhängigkeiten als Konsistenz-Kriterium in Betracht zu ziehen, die auch tatsächlich vorhanden sind und benutzt werden.A typical application for the inclusion of externally specified causal dependencies is the Herbrand semantics classical transactions [VGH93]. Classic "syntax-oriented" transactions consider each write operation as causally dependent on all the previous ones the same transaction read objects. So-called "semantic" transaction models [Elmbe], on the other hand, try by knowledge of the inner structure of the Transactions only those causal dependencies as a consistency criterion in To consider that are actually present and used become.

Wir stellen universelle Generizität bezüglich verschiedener Transaktions-Modelle dadurch her, dass wir die explizite Angabe kausaler Abhängigkeiten in der Nest-Schnittstelle verlangen. Der Sonderfall vollständiger kausaler Abhängigkeiten von allen je von einer Transaktion angefassten Objekte lässt sich relativ leicht als Strategie durch einen geeigneten Anpassungs-Baustein implementieren.We provide universal genericity in terms of different transactional models by making the explicit Specification of causal dependencies in the nest interface demand. The special case of complete causal dependencies all objects handled by a transaction can be relatively easy as a strategy through a suitable adaptation module to implement.

Konkret lässt sich dies so gestalten: Read-Lock-Instanzen erhalten automatisch eine direkte kausale Abhängigkeit von allen Write-Lock-Instanzen, die sich mit ihrem Ausschnitt aus dem Adressbereich überschneiden und die in der Zeitachse davor am nächsten liegen.Concrete let yourself To do this: Read-Lock instances are automatically given a direct causal dependence from all the write-lock instances that deal with their clipping overlap the address range and those closest to the timeline before.

Bei Write-Lock-Instanzen muss der Aufrufer der Write-Lock-Operation eine Menge von Adressbereichen angeben. Aus dieser Menge von Adressbereichen wird die Menge der zeitlich nächstliegenden Write-Lock-Instanzen bestimmt, von denen eine direkte kausale Abhängigkeit angenommen werden soll. Diese Art der Abhängigkeit dient lediglich als Informationsübergabe für zusätzliche Bedingungen oder Eigenschaften wie beispielsweise die Serialisierbarkeit, deren Einhaltung eine Frage konkreter Implementierungs-Strategien ist.at Write-lock instances must be the caller of the write-lock operation specify a set of address ranges. From this set of address ranges becomes the set of temporally closest ones Write-Lock instances are determined, one of which is a direct causal dependency should be accepted. This type of dependency serves only as Information transfer for additional Conditions or properties such as serializability, compliance is a matter of concrete implementation strategies.

Die folg Situation in 43 lässt sich beispielsweise auf verschiedene Arten lösen. In der Ausgangs-Situation wurde Lock 3 als kausal abhängig von Lock 1 und Lock 2 definiert. Der neu hinzukommende Lock 4 überschneidet nur den Adressbereich von Lock 1, nicht jedoch den von Lock 3. Da er nicht gleichzeitig die Adressbereiche von Lock 3 und 2 überscheidet, ist die Zulässigkeit dieser Operation eine Frage der konkreten Strategie. Ich sehe folgende Möglichkeiten:
Man kann die Ausgangssituation (erstes Bild) zulassen. Dann muss jedoch persistent gemerkt werden, von welcher Version (nämlich Lock 1) die konkrete kausale Abhängigkeit besteht. Andernfalls würde eine Verkleinerung von Lock 4 wie im zweiten Bild zu einem unbeabsichtigen Wechsel der Version führen, von der die kausale Abhängikeit besteht. Letzteres Problem könnte auch dadurch vermieden werden, dass man unerwünschte Versions-Änderungen vermeidet, indem derartige Locks nicht gesetzt werden dürfen. Die spezielle Ausgangssituation lässt hierfür zwar wegen der zeitlichen Überschneidung von Lock 4 mit Lock 3 auch die spezielle Lösung aus dem dritten Bild zu, doch führt dies im allgemeinen zu einer Behinderung. Der einfachste Lösung scheint mir zu sein, „überspringende" kausale Abhängigkeiten161 zuzulassen, die auf den jeweiligen Lock-Instanzen und nicht auf den Adressbereichen aufgebaut sind. Überspringen ist dann zugelassen, wenn sich beide Adressbereiche von Quelle und Ziel der direkten kausalen Abhängigkeit nicht mit dem Adressbereich der eingeschobenen Lock-Instanz überschneiden. Es können jedoch weitere Zusatzbedingungen für die Zulässigkeit solcher „überspringender" kausaler Abhängigkeiten als besondere Strategie eingeführt werden; hierzu zählt insbesondere die Einhaltung der Serialisierbarkeit von Transaktionen.
The following situation in 43 can be solved for example in different ways. In the initial situation, Lock 3 was defined as causally dependent on Lock 1 and Lock 2. The newly added Lock 4 intersects only the address range of Lock 1, but not that of Lock 3. Since he does not simultaneously override the address ranges of Lock 3 and 2, the admissibility of this operation is a matter of concrete strategy. I see the following possibilities:
You can allow the initial situation (first picture). Then, however, it must be noted persistently which version (namely Lock 1) has the concrete causal dependency. Otherwise, reducing Lock 4 as in the second image would result in an inadvertent change of the version that is causally dependent. The latter problem could also be avoided by avoiding unwanted version changes by not allowing such locks to be set. Due to the overlapping of Lock 4 with Lock 3, the special situation also allows for the special solution from the third picture, but this generally leads to a disability. The simplest solution seems to me to allow for "skipping" causal dependencies 161 that are built on the respective lock instances and not on the address ranges, skipping is allowed if both address ranges of source and target of direct causal dependency do not match overlap the address range of the inserted lock instance, however, additional conditions may be introduced for the permissibility of such "skipping" causal dependencies as a particular strategy; this includes, in particular, compliance with the serializability of transactions.

7.6 Aktualitätsgrade7.6 Timelines

Der aufmerksame Leser wird sich bereits gefragt haben, wie unlock-Operationen in einem Modell funktionieren sollen, das alle Lock-Instanzen als (quasi-)persistente Objekte auffasst und sie im Extremfall für immer aufbewahren kann (womit z.B. in militärischen oder geheimdienstlichen Anwendungen jederzeit nachvollziehbar wäre, wer wann welche Read-Locks gesetzt und die zugehörigen Daten inspiziert hat). Die als Container für Zugriffs-Operationen wirkenden Lock-Instanzen müssen irgendwann abgeschlossen werden. Abschließen bedeutet, dass der Container keine (nachträglich angelieferten) Operationen mehr für die Beherbergung akzeptiert.Of the Attentive readers will already have wondered how unlock operations in a model that all Lock instances are supposed to work (quasi-) understands persistent objects and in extreme cases forever can keep (for example, in military or secret service Applications would understand at any time, who which which Read-Locks set and the associated Data has been inspected). The acting as containers for access operations Lock instances need be completed sometime. Complete means that the container no (subsequently delivered) operations accepted more for accommodation.

Beim Anlegen wird jedem Container ein Mandat oder eine Menge von Mandaten als „Eigentümer" des Containers zugeordnet. Der Zustand eines Containers wird beim Anlegen ebenfalls festgelegt, kann jedoch später geändert werden und ist ein Wert aus der folgenden hierarchisch geordneten Aufzählung von Aktualitätsgraden:
act_invalid Der Container beherbergt ungültige (d.h. zu ignorierende) Operationen.
act_destroyable Der Container beherbergt ein vorläufiges Berechnungsergebnis, das jederzeit (evtl. asynchron) auch durch fremde Mandate (nicht nur durch das Eigentümer-Mandat) für ungültig erklärt werden kann, ohne dass dadurch ein irreparabler Schaden entsteht.
act_optimistic Der Container beherbergt eine vorläufige Version, deren Gültigkeit noch nicht feststeht. Eine Ungültigkeits-Erklärung kann jedoch nur durch das Eigentümer-Mandat erfolgen (vgl. optimistische Strategien in der Datenbank-Literatur [VGH93]).
act_tmp Es handelt sich um einen vorläufigen (noch nicht abgeschlossenen) Container, zu dem jederzeit neue Operationen zur Beherbergung hinzukommen können. Ein Entzug bereits beherbergter Operationen ist im Normalfall nicht vorgesehen (einzige Ausnahme: Systemfehler oder andere katastrophale Ereignisse).
act_close Der Container ist geschlossen, d.h. es können keine neue Operationen mehr beherbergt werden. Die Operationen bzw. deren Effekte brauchen nicht unbedingt persistent gespeichert zu sein. Ein erneutes Öffnen, d.h. der Wechsel in einen kleineren Zustand mittels lock ist dann (und nur dann) zulässig, wenn nirgendwo kausale Abhängigkeiten von diesem Container bestehen.
act_freeze Wie act_close, jedoch ist ein Wechsel in kleinere Zustände nicht mehr möglich.
act_safe Wie vorher, der Container samt beherbergtem Container-Inhalt ist jedoch mindestens 1 Mal persistent gespeichert und daher auch nach einfachen Systemfehlern wie Stromausfall noch erreichbar.
act_multisafe Der Container(-Inhalt) ist mehrfach redundant gegen schwerere Systemfehler gesichert.
When created, each container is assigned a mandate or a set of mandates as the "owner" of the container.The state of a container is also defined at creation, but can be changed later and is a value from the following hierarchical list of actualities:
act_invalid The container holds invalid (ie ignorable) operations.
act_destroyable The container contains a preliminary calculation result that can be invalidated at any time (possibly asynchronously) by third-party mandates (not only by the owner's mandate), without resulting in irreparable damage.
act_optimistic The container contains a preliminary version whose validity has not yet been determined. However, a declaration of invalidity can only be made through the owner's mandate (see Optimistic Strategies in the Database Literature [VGH93]).
act_tmp It is a temporary (not yet completed) container to which new accommodation operations can be added at any time. Withdrawal of already hosted operations is normally not envisaged (sole exception: systemic failure or other catastrophic events).
act_close The container is closed, meaning that no new operations can be accommodated. The operations or their effects do not necessarily have to be stored persistently. A reopening, ie a change to a smaller state using lock, is then (and only then) permissible if there are no causal dependencies on this container.
act_freeze Like act_close, but a change to smaller states is no longer possible.
act_safe As before, however, the container and its container contents are persistent at least once stored and therefore still accessible even after simple system errors such as power failure.
act_multisafe The container (content) is repeatedly redundantly protected against more serious system errors.

Für die Zustände gelten folgende Regeln: Anlegen eines Containers ist nur mit den Aktualitätsgraden act_destroyable bis act_tmp möglich. Eine unlock-Operation setzt den Zustand aller von ihrem Adressbereich überstrichenen und im Mandats-Eigentum befindlichen Container auf einen wählbaren anderen Aktualitätsgrad; Zustands-Änderungen geschehen durch unlock mit Ausnahme von act_invalid nur in aufsteigender Richtung der Aktualitätsgrade. Der Zustand act_invalid ist von act_destroyable bis act_close aus erreichbar (also insbesondere ab act_freeze nicht mehr erreichbar); ein einmal erreichter act_invalid-Zustand kann nie mehr verlassen werden.For the states apply following rules: Creating a container is only with the actuality levels act_destroyable until act_tmp possible. An unlock operation sets the state of all the values swept by its address range and mandate-owned containers to a selectable one other level of actuality; State changes done by unlock with the exception of act_invalid only in ascending Direction of actuality levels. The state act_invalid is from act_destroyable to act_close off attainable (thus in particular from act_freeze no longer attainable); a once achieved act_invalid state can never leave become.

Weiterhin sollte beachtet werden, dass Zustandswechsel in höhere Aktualitätsgrade nur dann sinnvoll sind, wenn alle kausal vorangehenden Container mindestens den gleichen Aktualitätsgrad erreicht haben. Falls ein kausal vorangehender Container auf act_invalid gesetzt wird, müssen alle davon kausal abhängigen Container ebenfalls auf act_invalid gesetzt werden. Dies entspricht den kaskadierenden Rollbacks in klassischen Transaktions-Modellen.Farther should be noted that state changes in higher actuality levels only meaningful if all causally preceding container at least the same level of actuality achieved. If a causally preceding container is on act_invalid is set all of them causally dependent containers also be set to act_invalid. This corresponds to the cascading Rollbacks in classic transaction models.

Die unlock-Operation kann damit sowohl die klassische Funktionalität von Rollback-Operationen von Transaktionen als auch von Commit-Operationen ausführen. Ein Rollback entspricht dem Zustand act_invalid, beim Commit wird je nach geforderter Fehlertoleranz ein Aktualitätsgrad ab act_freeze angesteuert.The unlock operation thus allows both the classic functionality of rollback operations transactions as well as commit operations. One Rollback corresponds to the state act_invalid, the commit is ever After the required fault tolerance, an actuality level is controlled from act_freeze.

7.7 Schnittstellen von Lock-Operatioen7.7 Interfaces of Lock Operatioen

7.7.1 Suchintervalle7.7.1 Search intervals

Ein Nest lässt sich im multiversion-Modell als zweidimensionalen Raum auffassen, der eine örtliche und eine zeitliche Dimension hat. Prinzipiell kann man jederzeit auf alle Teile dieses Raumes zugreifen. Dazu gibt es Suchoperationen, mit denen sich Lock-Container im Nest aufspüren lassen. Zur Spezifikation von Suchintervallen schlage ich folgende Konventionen vor:
Ein Suchintervall ist ein Paar (start,delta), wobei start den Beginn und start + delta das Ende des Such-Bereiches angeben. Ein Suchintervall kann sich entweder auf die zeitliche oder auf die ärtliche Dimension beziehen. Bei positivem delta wird in aufsteigender Richtung gesucht, d.h. falls sich mehrere Lock-Container mit dem Suchintervall in der jeweiligen Dimension schneiden, wird nach dem Durchführen von Vergleichsoperationen und eventuell davon ausgelöster Verkleinerung (nur bei der zeitlichen Dimension) diejenige Lock-Instanz ausgeliefert, die den kleinsten Wert in der jeweiligen Dimension hat und sich mit dem Suchintervall überschneidet. Bei negativem delta wird in umgekehrter Richtung gesucht.
A nest can be seen in the multiversion model as a two-dimensional space that has a local and a temporal dimension. In principle, you can access all parts of this room at any time. There are also search operations that can be used to detect lock containers in the nest. To specify search intervals, I propose the following conventions:
A search interval is a pair (start, delta), where start is the start and start + delta is the end of the search range. A search interval can refer to either the temporal or the temporal dimension. If the delta is positive, it searches in the ascending direction, ie if several lock containers intersect with the search interval in the respective dimension, after performing comparison operations and possibly reducing them (only for the time dimension), the Lock instance is delivered has the smallest value in the respective dimension and overlaps with the search interval. Negative delta searches in reverse direction.

Die gleichzeitiger Suche nach Suchintervallen adr_search und time_search werden diejenigen Lock-Instanzen ausgeliefert, die sich in beiden Dimensionen mit den jeweiligen Suchintervallen überschneiden. Auf diese Weise ist eine Suche in einem rechteckigen Bereich des Ort-Zeit-Raumes möglich.The Simultaneous search for search intervals adr_search and time_search those Lock instances are delivered, which are in both Overlap dimensions with the respective search intervals. In this way is a search in a rectangular area of the place-time-space possible.

Als Sonderfall kann weiterhin delta= +∞ oder delta= –∞ zur unbeschränkten Suche zugelassen werden, ebenso start= +∞.When Special case can still delta = + ∞ or delta = -∞ for unlimited search allowed, as well as start = + ∞.

7.7.2 Lock-Operationen im Multiversion-Modell7.7.2 Lock operations in the multiversion model

Die lock-Operation aus Abschnitt 3.3.5 wird im hier vorgestellten Erweiterungs-Vorschlag auf multiversion-Modelle aus methodischen Gründen in die beiden Operations-Varianten read_lock und write_lock aufgesplittet, da sie eine leicht unterschiedliche Parameter-Versorgung benötigen. Es sind jedoch auch geringfügig andere Gestaltungen der Schnittstelle möglich, die die Uniformität der Schnittstelle beider Lock-Arten beibehalten.The lock operation from section 3.3.5 is included in the extension proposal presented here on multiversion models for methodological reasons in the two operations variants read_lock and write_lock split as they are slightly different Need parameter supply. However, they are also slightly different Designs of the interface possible, the uniformity maintained the interface of both lock types.

Figure 00850001
Figure 00850001

Die Parameter speculative_set und adr_set übernehmen die Funktion von log_address, len, try_address und try_len aus Abschnitt 3.3.5. Zusätzlich wird ein Vorschlag für das Zeitstempel-Intervall time set übergeben. In den Ergebnis-Intervallen adr_result und time_result werden die tatsächlich möglichen Orts- und Zeit-Intervalle zurückgeliefert (sofern das Setzen des Locks überhaupt möglich ist). Das Orts-Invervall muss auf jeden Fall mindestens adr_set umfassen, das Zeit-Intervall kann gegenüber time set auch verkleinert ausfallen.The speculative_set and adr_set parameters inherit the function of log_address, len, try_address, and try_len from Section 3.3.5. In addition, a proposal for the timestamp interval time pass set. In the result intervals adr_result and time_result, the actually possible location and time intervals are returned (if the setting of the lock is even possible). In any case, the location interval must at least include adr_set, the time interval may also be smaller compared to time set.

Der Parameter act gibt den Aktualitätsgrad des zu erzeugenden Read-Locks vor. min_act gibt dagegen einen Aktualitätsgrad vor, den sämtliche direkt kausal vorangehenden Write-Locks mindestens erfüllen müssen. Falls sich in der direkten kausalen Abhängigkeit Write-Locks mit zu geringem Aktualitätsgrad befinden, muss im Regelfall so lange gewartet werden, bis diese den geforderten Aktualitätsgrad erreicht haben. Wenn man kleine Aktualitätsgrade für min_act vorgibt, wird zwar die mögliche Parallelität gesteigert (vgl. „dirty read" in Datenbanken), gleichzeitig steigt jedoch das Risiko kaskadierender Rollbacks und auch das Risko von inkonsistentem Lesen durch neu hinzukommende Beherbergungen in kausal vorgehenden Containern. Bei strengen Anforderungen an einzuhaltende Konsistenz-Bedingungen kann damit u.U. die Notwendigkeit von Rollbacks impliziert werden (vgl. Fehlersicherheitvon Schedules [VGH93]).Of the Parameter act indicates the actuality level of the read lock to be generated. min_act, on the other hand, specifies an actuality level, all directly causally preceding write locks must meet at least. If in the direct causal dependency write-locks with too low level of actuality usually have to wait so long until this the required actuality level achieved. If you specify small levels of freshness for min_act, though the possible parallelism increased (see "dirty read" in databases), at the same time, however, the risk of cascading rollbacks and also the risk of inconsistent reading due to newly added ones Accommodations in causal preceding containers. For strict requirements to be complied with consistency conditions may thus u.U. the need Rollbacks are implied (see Schedules error security [VGH93]).

Die kausalen Abhängigkeiten werden im allgemeinsten multiversion-Modell persistent aufbewahrt, um die Speicher-Semantik auch bei später nachgelieferten „vordatierten" Locks erfüllen zu können. Der boolsche Parameter stable gibt vor, ob die kausalen Abhängigkeiten „stabil" sein sollen, oder ob sich spätere Locks „dazwischen schieben" dürfen. Bei stable = true dürfen später im Zeit-Intervall zwischen dem neu gesetzten Lock und dem kausal abhängigen Vorgänger keine solchen Write-Locks mehr nachträglich eingebaut werden, die zu irgendeiner Veränderung des Suchergebnisses bei der (erneuten) Bestimmung der funktionalen Abhängigkeiten aller möglicherweise betroffenen Lock-Instanzen führen können162. Dadurch bestimmt der Eigentümer eines Locks (d.h. das Mandat oder eine Menge von Mandaten), ob andere Locks mit ihm verträglich sind oder nicht. Wenn man diese Eigenschaft auch transitiv für alle Vorgänger der kausalen Abhängigkeiten ermöglicht (z.B. durch einen Aufzählungstyp mit stable = transitive; die Bestimmung gilt unabhängig vom ursprünglichen stable-Zustand der transitiv vorangehenden kausalen Abhängigkeiten), dann lassen sich verschiedene Transaktions- oder Konsistenz-Modelle beliebig miteinander mischen, ohne die jeweils intendierte Semantik zu verletzen (dies steht im Gegensatz zur herrschenden Meinung über die Mischbarkeit verschiedener Modelle).The causal dependencies are kept persistent in the most general multiversion model in order to satisfy the memory semantics even for later "predated" locks The Boolean parameter stable specifies whether the causal dependencies should be "stable" or later With stable = true, later in the time interval between the newly set lock and the causally dependent predecessor, no such write locks may be installed later, which will change the search result when (re) determining the . functional dependencies of all lock entities that may be affected can lead 162. Thus, the owner determines a lock (ie the mandate or set of mandates) whether other locks are compatible with it or not, if you this property also transitive for all predecessors of the causal. Dependencies (eg by listing type with stable = transitive; the determination holds independently of the original stable state of the transitive preceding causal dependencies), then different transactional or consistency models can be arbitrarily mixed with each other without violating the respective intended semantics (this is in contrast to the prevailing opinion about the miscibility of different models ).

Der boolsche Parameter direct bestimmt, ob die erstellte kausale Abhängigkeit unbedingt vom ersten tatsächlich vorhandenen Write-Lock in Suchrichtung abhängen muss, oder ob (z.B. in verteilten Systemen) veraltete Versionen geduldet werden. Letztere Möglichkeit verbessert die Performanz zu Lasten weniger strikter Konsistenz-Modelle und kann zu „überspringenden" kausalen Abhängigkeiten ähnlich der PRAM-Konsistenz163 führen.The Boolean parameter direct determines whether the created causal dependency must necessarily depend on the first actual write lock in the search direction, or whether outdated versions (eg in distributed systems) are tolerated. The latter option improves performance at the expense of less stringent consistency models and can lead to "skipping" causal dependencies similar to the PRAM consistency 163 .

Der Parameter aim dient als Ersatz für den früheren Parameter kind aus Abschnitt 3.3.5. Er gibt einen der Werte aim_address, aim_data oder aim_both an. Damit wird spezifiziert, ob nur die Adress-Abbildungs-Funktion des Nestes, oder die Daten-Abbildungs-Funktion, oder beide gegenüber konkurrierenden Zugriffen gesperrt werden sollen (weiterhin kann damit auch die Zulässigkeit der beherbergten Operations-Arten geprüft werden). Adressmodifizierende Operationen wie move lassen sich dadurch von datenmodifizierenden Operationen wie transfer entkoppeln. Um diese Fähigkeit besser auszunutzen, kann man beispielsweise einen weitere Parameter adr_time einführen, der den zu verwendenden Zeitstempel für die Adressabbildung unabhängig von der Datenabbildung vorgibt. Damit können insbesondere solche Mandate einen ungestörten Zugriff auf die Nest-Adressen durchführen, die selbst keine adressmodifizierenden Operationen ausführen; diesen Mandaten erscheint dann die Adress-Abbildung als „festgenagelt", obwohl sie von anderen Mandaten auf der virtuellen Zeitachse geändert worden sein kann.Of the Parameter aim serves as a substitute for the former Parameter child from section 3.3.5. It gives one of the values aim_address, aim_data or aim_both. This specifies whether only the address mapping function of the nest, or the data mapping function, or both versus competing Accesses are to be blocked (continue can thus also the admissibility the hosted types of operations are tested). Adressmodifizierende Operations such as move can be handled by data-modifying operations how to decouple transfer. To make better use of this ability, For example, you can introduce another adr_time parameter, the the time stamp to be used for the address mapping independent of dictates the data mapping. In particular, such mandates can an undisturbed Access the nest addresses, which themselves are not address-modifying Perform operations; These mandates then the address mapping appears as "pinned", although they of other mandates on the virtual timeline may have been changed.

Für die Ortsangabe adr_set gilt ähnlich zu Abschnitt 3.3.5 die Regel, dass für das gleiche Mandat früher gesetzte Locks (egal wo sich diese auf der Zeit-Achse befinden) „verdeckt" werden können. Jedes Mandat hat zu jedem Zeitpunkt höchstens eine (eindeutige) Lock-Instanz-Zuordnung für jeden (Teil-)Orts-Bereich; diese eindeutige Zuordnung dient weiterhin der korrekten Versions-Zuordnung nachfolgender get- und transfer-Operationen. Die Eindeutigkeit wird dadurch erzielt, dass bei nochmals angeforderten Adressbereichen die alten Versionen bei Bedarf (d.h. nur bei geändertem Zeit-Bereich) ganz oder teilweise aufgegeben werden, d.h. aus der Eigentümer Zuordnung entfernt werden (wodurch sie quasi „Allgemeingut" werden). Aufgegebene Versionen, die nicht abgeschlossen sind, werden standardmäßig so behandelt, als würden sie atomar durch unlock mit Aktualitätsgrad act_invalid (bei nicht-transaktionalen Untermodellen evtl. auch mit act_freeze) freigegeben und sofort wieder an der neuen Zeit-Stelle neu gesetzt. Auf diese Weise ist sicher gestellt, dass Adressangaben bei get oder anderen Operationen stets eine eindeutig bestimmte Version eines Locks bezeichnen und das „Vererben" des Zeitstempels vom Container auf die beherbergten Operations-Instanzen eindeutig ist.For the location adr_set is similar to section 3.3.5 the rule that set earlier for the same mandate Locks (no matter where they are on the time axis) can be "hidden." Each Mandate has at most time at most a (unique) lock-instance mapping for each (sub) location area; this unique mapping continues to serve the correct version mapping subsequent get and transfer operations. The uniqueness will achieved in that again requested address ranges the old versions on demand (that is, only if the time range is changed) completely or partially abandoned, i. from the owner assignment be removed (which makes them "common property") Versions that are not completed are handled by default as would they atomically unlock by using the actual_activity_validid (for non-transactional Submodels may also be released with act_freeze) and immediately set again at the new time location. That way is made sure that address information is at get or other operations always designate a unique version of a lock and the "inheriting" of the timestamp from the container to the hosted Operations instances is.

Figure 00870001
Figure 00870001

Gegenüber read_lock kommt hier die direkte Angabe einer Menge (bzw. Liste oder Array) von Quadrupeln causal hinzu. Ein Quadrupel hat die Form (adr_search, min_act, stable, direct). Der Wert von adr_search spezifiert den Ort, an dem die kausal vorgehenden Read- oder Write-Locks liegen. Durch die Aufnahme von min_act, stable und direct in die Quadrupel lassen sich diese Eigenschaften für die funktionalen Abhängigkeiten in jedem Adressbereich einzeln einstellen164.Compared to read_lock, the direct specification of a set (or list or array) of quadruples causal is added here. A quadruple has the form (adr_search, min_act, stable, direct). The value of adr_search specifies the location where the causal read or write locks are located. By including min_act, stable and direct in the quadruples, these properties can be set individually for the functional dependencies in each address range 164 .

Falls im Suchbereich bereits ein Lock-Container mit Aktualitätsgrad act_close existiert, dessen bereits vorhandenen kausalen Abhängigkeiten eine kompatible Obermenge zu den geforderten darstellen und der selbst nicht an späteren kausalen Abhängigkeiten teil nimmt, dann darf dieser Container an Stelle einer Neuerzeugung eines Containers erneut geöffnet werden. Diese Optimierung braucht nicht in jeder Implementierung unterstützt zu werden; act_close darf beim unlock auch als act_freeze behandelt werden.
unlock(nest,mandate,adr_search,act)
If a lock container with actuality degree act_close already exists in the search area, whose already existing causal dependencies represent a compatible superset to the required ones and which itself does not take part in later causal dependencies, then this container may be reopened instead of recreating a container. This optimization does not need to be supported in every implementation; act_close may also be treated as act_freeze on unlock.
unlock (nest, mandate, adr_search, act)

Gegenüber der früheren Version aus Abschnitt 3.3.5 kommt hier lediglich der Aktualitätsgrad act hinzu, auf den die freizugebenden Locks gesetzt werden sollen. Es ist möglich, Locks mehrmals schrittweise auf immer höhere Aktualitätsgrade zu setzen, so dass eine korrekte Klammerung von lock/unlock-Paaren nicht mehr eingehalten werden muss.Opposite the earlier Version from section 3.3.5 comes here only the actuality degree act to which the locks to be released are to be set. It is possible, Locks several times gradually to ever higher levels of actuality to set, allowing a correct bracketing of lock / unlock pairs no longer needs to be respected.

Figure 00870002
Figure 00870002

Fordert eine (asynchrone) Rückgabe eines nicht-abgeschlossenen Locks. Neben der Rückgabe spekulativ vergrößerter Adressbereiche lässt sich über time_need auch die Verkleinerung von Zeit-Intervallen in verteilten Systemen konsistent durchführen, wenn die Konvention herrscht, dass nicht abgeschlossene Locks nur von ihrem Eigentümer verkleinert werden dürfen.urges an (asynchronous) return an unfinished lock. In addition to the return of speculatively enlarged address ranges can be over time_need also the reduction of time intervals in distributed systems perform consistently, if the convention prevails that unfinished locks only from their owner may be reduced.

7.8 Simulation einiger Transaktions-Strategien7.8 Simulation of some Transaction strategies

Verschiedene Varianten klassischer ACID-Transaktionen werden durch die soeben vorgestellten Lock-Operationen auf folgende Weise simuliert:
Jeder einzelnen Schreib- und Lese-Operation, die sich auf einen noch nicht gelockten Adressbereich bezieht, werden Locks vorangestellt. Read-Locks werden bei Bedarf dadurch in Write-Locks aufgewertet, dass auf dem gleichen Adressbereich die andere Lock-Art, jedoch mit dem gleichen Zeit-Intervall angefordert wird. Ansonsten werden einmal angeforderte Locks bis zum Transaktions-Ende nicht mehr frei gegeben (2-Phasen-Locking).
Different variants of classical ACID transactions are simulated by the just presented lock operations in the following way:
Each individual read and write operation, which refers to a not yet curled address range, is preceded by locks. If necessary, read-locks are upgraded to write-locks so that the same lock-type is requested on the same address range, but at the same time interval. Otherwise once requested locks are not released until the end of the transaction (2-phase-locking).

Die kausalen Abhängigkeiten werden nach der Grundidee der Herbrand-Semantik syntaktischer Transaktions-Modelle [VGH93] stets so gesetzt, dass sämtliche von einer Transaktion jemals angefassten Adressbereiche bei den Write-Locks angegeben werden müssen.The causal dependencies are based on the basic idea of the Herbrand semantics of syntactic transaction models [VGH93] always set so that all address ranges ever handled by a transaction in the Write locks must be specified.

Beim Commit werden alle gesetzen Locks atomar durch unlock auf dem gesamten Adressraum (d.h. man wählt adr_search = (0, ∞)) mit mindestens act = act_safe abgeschlossen (sofern die D-Eigenschaft von ACID ausdrücklich bei jedem einzelnen Commit gefordert wird); beim Rollback ist stattdessen act = act_invalid zu wählen.At the Commit all set locks atomically by unlocking on the whole Address space (i.e., one chooses adr_search = (0, ∞)) with at least act = act_safe completed (if the D property by ACID expressly is required at each commit); Rollback is instead to select act = act_invalid.

Bei den folgenden Simulationen konventioneller Transaktionen wird stets stable = true und direct = true gewählt. Die einzelnen Transaktions-Varianten unterscheiden sich dadurch, welche Zeit-Intervalle und min_act-Werte jeweils beim Setzen der Locks gewählt werden.at The following simulations of conventional transactions will always be stable = true and direct = true. The individual transaction variants differ by what time intervals and min_act values each time you set the locks are selected.

7.8.1 Timestamp-Ordering-Protokolle7.8.1 Timestamp Ordering Protocols

Bei der Simulation von Multiversion-Timestamp-Orderirig (MVTO) aus der Datenbank-Literatur [VGH93] wird die Serialisierbarkeit dadurch sicher gestellt, dass alle Operationen einer Transaktion als mit dem gleichen Zeitstempel durchgeführt gelten; dadurch entsteht eine virtuell zeitliche Totalordnung aller Operationen, die genau der Serialisierungs-Reihenfolge entspricht. Datenbanken benötigen hierzu ebenfalls die Fähigkeit zur Verwaltung mehrerer Versionen von Objekten (manchmal auch Time-Domain-Addressing genannt [GR93]). Der Zeitstempel wird bei Beginn der Transaktion oder beim ersten Zugriff einmal so bestimmt, dass jede Transaktion einen eindeutigen Zeitstempel besitzt, der nie mehr geändert wird.Simulation of Multiversion Timestamp Orderirig (MVTO) from the database literature [VGH93] ensures serializability by considering all operations of a transaction as having the same timestamp; This creates a virtual temporal total order of all operations which corresponds exactly to the serialization order. Databases also need the ability to manage multiple versions of objects (sometimes called time-domain addressing [GR93]). The timestamp is once determined at the beginning of the transaction or at the first access so that each transaction has a unique timestamp that is never changed.

Die Simulation von Schreib-Lese-Transaktionen durch multiversion-Nester ist relativ einfach: die Locks werden mit time_set = (start, 0) und act = act_tmp gesetzt, wobei start den einmal bei Beginn der Transaktion eindeutig vergebenen Zeitstempel bedeutet.The Simulation of read-write transactions by multiversion nests is relatively simple: the locks are set with time_set = (start, 0) and act = act_tmp, starting once at the beginning of the Transaction clearly assigned timestamp means.

Nur-Lese-Transaktionen lassen sich dadurch simulieren, dass bei Beginn der Transaktion abweichend von der oben beschriebenen allgemeinen Strategie ein einziger Read-Lock auf dem gesamten Adressbereich adr_set = (0, ∞) gesetzt wird, so dass die anschliessenden Lese-Operationen nicht mehr einzeln durch Read-Locks abgesichert werden müssen. Ein derartiger Read-Lock, der den gesamten Adressbereich umfasst, erzeugt einen Schnappschuss165 des gesamten Nestes.Read-only transactions can be simulated by setting a single read-lock on the entire address range adr_set = (0, ∞) at the beginning of the transaction, deviating from the general strategy described above, so that the subsequent read operations are no longer must be individually secured by read locks. Such a read-lock, which covers the entire address range, creates a snapshot 165 of the entire nest.

Da auch bei Schreib-Lese-Transaktionen sämtliche Read-Locks mit dem gleichen Zeitstempel gesetzt werden, lassen sich auch hier die individuellen Read-Locks durch einen Schnappschuss-Lock ersetzen; beim Schreiben werden dann einzelne Teile des Schnappschuss-Locks durchlöchert und zu Write-Locks aufgewertet.There also with read-write transactions all read-locks with the same time stamp can be set here, the individual Replace read locks with a snapshot lock; while writing then individual parts of the snapshot lock are perforated and upgraded to write-locks.

7.8.2 Striktes 2-Phasen-Locking7.8.2 Strict 2-phase locking

Bei der Simulation klassischer 2-Phasen-Locks [VGH93] wird das multiversion-Verhalten gar nicht ausgenutzt. Read- und Write-Locks werden auf dem Zeitintervall time_set = (now, ∞) gesetzt, wobei now der streng monoton fortschreitenden aktuellen realen Uhrzeit beim Aufruf entspricht. Bei Gewähren des Locks wird dieses Zeitintervall auf den Gewährungs-Zeitpunkt verkleinert, so dass nachfolgende Write-Locks auf der Zeitachse Platz finden. In den Quadrupeln der Write-Locks wird durch min_act = act_freeze sicher gestellt, dass zu jedem Zeitpunkt höchstens ein einziger nicht abgeschlossener Write-Lock auf überlappenden Adressen existiert.at the simulation of classical 2-phase locks [VGH93] becomes the multiversion behavior not used at all. Read and write locks are on the time interval time_set = (now, ∞) where now the strictly monotonously progressive current real time when called. Granting the lock will this Time interval on the grant date downsized, allowing subsequent write locks on the timeline Find a place. In the quads of the write-locks is min_act = act_freeze made sure that at most each time a single incomplete write lock on overlapping Addresses exists.

7.8.3 Weitere Arten von Serialisierbarkeit bzw. Konsistenzmodellen7.8.3 Other types of Serializability or consistency models

Es sind auch mehrere Write-Locks zum gleichen Real-Zeitpunkt möglich, die sich lediglich nicht auf der virtuellen Zeitachse überschneiden dürfen. Man könnte dies mit Multiversions-Locking bezeichnen. Die Möglichkeit, überlappende Adressbereiche zum gleichen Real-Zeitpunkt sperren zu können, geht jedoch über den Begriff „multiversion concurrency control166" [HR01] bzw. den Begriff der Multiversions-Konflikt-Serialisierbarkeit [VGH93] hinaus. Eventuell wäre Time-Domain-Locking eine gute Bezeichnung zumindest für die englischsprachige Literatur.There are also several write locks possible at the same real time, which may not just overlap on the virtual timeline. You could call that multiversion locking. The ability to lock overlapping address ranges at the same real time, however, goes beyond the term "multiversion concurrency control 166" [HR01] or the term multiversion conflict serializability [VGH93], which may include time domain locking a good name at least for the English-language literature.

Der verallgemeinerte Serialisierungs-Begriff aus [Vid87], der sowohl die Konflikt- als auch die MVTO-Serialisierbarkeit als Spezialfall enthält, dürfte sich durch die hier vorgestellte Nest-Schnittstelle ebenfalls simulieren lassen. Dies gilt ebenso für Protokoll-Familien wie MVSGT (Multiversions-Serialisationsgraphen-Tester), die sich als konkrete Strategien in Bausteinen realisieren lassen.Of the generalized serialization term from [Vid87], both the conflict as well as the MVTO serializability as a special case contains might also simulate themselves through the nest interface presented here to let. This also applies to Protocol families like MVSGT (multiversions serialization graph tester), which can be realized as concrete strategies in building blocks.

Geschachtelte Transaktionen lassen sich durch Bausteine realisieren, die Gruppen von Änderungs-Operationen nach aussen hin durch gesammelte Lock-Operationen weitergeben und dabei ggf. die Aktualitätsgrade in andere Werte transformieren.nested Transactions can be realized by building blocks, the groups of change operations to pass outwards through accumulated lock operations and if necessary, the actuality levels transform into other values.

Durch „überspringende" kausale Abhängigkeiten, Aufweichen der Herbrand-Semantik und Variation der min_act-, stable- und direct-Parameter lassen sich weitere Serialisierbarkeits-Begriffe bilden, deren systematische Untersuchung weiteren Arbeiten überlassen bleibt. Ein grosses Forschungs-Feld stellen Optimierungen bei sich widersprechenden Zielen dar, beispielsweise wenn spekulativ vergrößerte Lock-Bereiche nur mit „überspringenden" kausalen Abhängigkeiten oder geringerem Aktualitätsgrad erkauft werden können167 u.v.m. Through "skipping" causal dependencies, softening of the Herbrand semantics, and variation of the min_act, stable, and direct parameters, further concepts of serializability can be formed whose systematic investigation is left to further work For example, if speculative magnified lock areas can only be bought with "skipping" causal dependencies or less up-to-dateness 167 and much more

Durch gezieltes Freigeben einiger Locks vor Transaktions-Ende lassen sich beliebige Misch-Paradigmen zwischen vollkommener transaktionaler Isolation und wechselseitigem Ausschluss realisieren168. Der bisher in Betriebssystemen verwendete wechselseitige Ausschluss wird durch das Konzept der Aktualitätsgrade so orthogonal ergänzt, dass ein nachträgliches Rücksetzen schiefgegangener Berechnungen (die mit Berechnungen anderer Mandate nicht-serialisierbar verwoben sein können) möglich ist.By deliberately releasing a few locks before the end of the transaction, any mixing paradigm can be realized between perfect transactional isolation and mutual exclusion 168 . The mutual exclusion used until now in operating systems is supplemented orthogonally by the concept of actuality levels, so that a subsequent reset of failed calculations (which can be interwoven with computations of other mandates non-serializable) is possible.

7.8.4 Automatische Re-Evaluation7.8.4 Automatic re-evaluation

Die Idee besteht darin, in den Containern (gelegentlich oder teilweise auch in den gespeicherten kausalen Abhängigkeiten) nicht (nur) die Ergebnisse der von den Konsumenten generierten Zugriffs-Operationen zu beherbergen, sondern (zusätzlich) ihre Berechnungsvorschrift.The Idea consists in the containers (occasionally or partially also in the stored causal dependencies) not (only) the Results of consumer-generated access operations accommodate, but (additionally) their calculation rule.

Dadurch kann man die beherbergten Zugriffs-Operationen neu berechnen, wenn nachträgliche Änderungen bei einem der kausal vorgehenden Container oder nachträgliches Einschieben von Write-Locks in stabile kausale Abhängigkeits-Beziehungen zugelassen werden, wodurch die kausalen Abhängigkeiten auf die neuen Versionen abgeändert werden. Bei solchen Änderungen wird lediglich eine Neuberechnung des Container-Inhaltes aller transitiv kausal abhängigen Container angestossen; die Container selbst und ihre Position in der Raum-Zeit-Ebene bleiben erhalten.Thereby you can recompute the hosted access operations if subsequent changes in one of the causal preceding container or subsequent Pushing write locks into stable causal dependency relationships be allowed, thereby reducing the causal dependencies on the new versions amended become. With such changes is merely a recalculation of the container content of all transitive causally dependent Container triggered; the container itself and its position in the space-time level is preserved.

Eine Spezifikation der Berechnungsvorschrift kann durch Einführen eines geeigneten Interpreters und einer Interpreter-Sprache erfolgen, von der Programmstücke mittels einer Operation download bekannt gemacht werden (z.B. zur Addition von Zahlen-Werten oder Berechnung einer Summe). Das Herunterladen von ausführbarem Maschinencode ist prinzipiell ebenfalls möglich, hat jedoch Nachteile bei der Sicherheit (zu deren Lösung kann man spezielle Konventionen für die während der Evaluation aktiven Schutzbereiche einführen).A Specification of the calculation rule can be made by introducing a appropriate interpreter and an interpreter language, from the program pieces be made known by means of an operation download (e.g. Addition of number values or calculation of a sum). Downloading of executable Machine code is also possible in principle, but has disadvantages in safety (for their solution You can have special conventions for those active during the evaluation Introduce protection zones).

In beiden Fällen sollten möglichst alle Konsumenten ihre transfer-Operationen zum Ändern der Daten- und/oder Adressabbildung von Nestern durch download-Operationen ersetzen, damit nicht-reevaluierbare Container dieses Verfahren nicht stoppen können oder inkorrekt werden lassen.In both cases should be possible all consumers their transfer operations to change the data and / or address mapping from nests through download operations to replace non-reevaluable containers can not stop this procedure or incorrectly.

A Simulation von Vererbung durch GenerizitätA simulation inheritance through genericity

Zum Nachweis, dass sich Erweiterungs-Generizität mit Hilfe von Parametrischer Generizität ausdrücken läßt, simulieren wir die Kernidee der objektorientierten Vererbung durch Präprozessor-Makros der Sprache C:

Figure 00910001
Figure 00920001
To demonstrate that extension genericity can be expressed using Parametric Genericity, we simulate the core idea of object-oriented inheritance through preprocessor macros of language C:
Figure 00910001
Figure 00920001

Auf diese allgemeinen Deklarationen hin folgt nun die einmalige Angabe zweier Klassen A und B mittels Makro-Definitionen:

Figure 00920002
Figure 00930001
Following these general declarations, a one-time specification of two classes A and B follows by means of macro definitions:
Figure 00920002
Figure 00930001

Mit Hilfe der Unix-Kommandos gcc –E vererbung.c |grep –v '^#'| indent –bad –bap| indent –kr entsteht hieraus der folgende expandierte Quelltext:

Figure 00930002
Figure 00940001
Using the Unix commands gcc -Einerbung.c | grep -v '^ #' | indent -bad -bap | indent -kr results in the following expanded source code:
Figure 00930002
Figure 00940001

B Beispiel-Probleme der ObjektorientierungB example problems of object orientation

Ein Beispiel, bei dem die Mitvererbung von Datenstrukturen bzw. Repräsentationen zu einer kombinatorischen Explosion von Klassen führen kann:
Die Erweiterung einer abstrakten Basisklasse G solle auf zwei verschiedene voneinander unabhängige Arten stattfinden. Diesläßt sich relativ einfach durch zwei verschiedene abgeleitete abstrakte Basisklassen A und B durchführen. Aus jeder der beiden abstrakten Basisklassen seien verschiedene konkrete Klassen A1,..., An und B1,... Bm abgeleitet, deren Funktionalität jeweils benötigt werde. Nun komme die Anforderung hinzu, dass die Vereinigung beider Schnittstellen ebenfalls benötigt werde. Auf der Ebene der abstrakten Basisklassen ist dies sehr einfach durch eine weitere Basisklasse C zu bewerkstelligen, die ihre Schnittstelle aus A und B durch Mehrfachvererbung erhält. Dies bedeutet für die davon abgeleiteten konkreten Klassen Cij jedoch, dass nun das gesamte kartesische Produkt aus n·m abgeleiteten Klassen in Frage kommt und ggf. zu implementieren ist. Selbst wenn dabei keine neue Funktionalität mittels überschriebener Methoden-Implementierungen hinzukommen sollte, führt dies zu einer kombinatorischen Explosion der Klassen-Namen und zu einer Aufblähung des gesamten Systems. Nach meinem Dafürhalten taucht dieses Problem oft in der Praxis auf, ohne erkannt zu werden.
An example in which the co-inheritance of data structures or representations can lead to a combinatorial explosion of classes:
The extension of an abstract base class G should take place in two different independent ways. This can be done relatively easily by two different derived abstract base classes A and B. From each of the two abstract base classes we derive different concrete classes A 1 , ..., A n and B 1 , ... B m whose functionality is needed in each case. Now the requirement is added that the union of both interfaces is also needed. At the level of abstract base classes, this is very easy to accomplish by another base class C, which gets its interface from A and B through multiple inheritance. However, this means for the concrete classes C ij derived from them that the entire Cartesian product of n · m derived classes is now suitable and possibly to be implemented. Even if no new functionality should be added by means of overridden method implementations, this leads to a combinatory explosion of the class names and to a bloat of the entire system. In my opinion, this problem often crops up in practice without being recognized.

Für dieses Problem gibt es eine oft funktionierende Lösung, ohne das objektorientierte Paradigma verlassen zu müssen. Die Implementierung einer abgeleiteten Klasse Cij sollte nicht durch Mehrfachvererbung erfolgen, sondern durch Container-Instanzen cij ∈ Cij, die jeweils zwei Instanzen ai ∈ Ai und bj ∈ Bj enthalten (in Form einer has-a-Beziehung statt einer is-a-Beziehung). Man kann Cij auch als Proxy-Klasse bezeichnen. Dies bringt jedoch folgende Schwierigkeiten mit sich:

  • 1. Die bisherigen Attribute waren Mitglieder der alten Objektinstanz-Repräsentation; von der neuen Repräsentation werden sie entweder indirekt adressiert oder sie werden nochmals eingebettet. Dadurch wird Platz verschwendet.
  • 2. Die gemeinsame Oberklasse G kann Attribute enthalten, die bei der Mehrfachvererbung nur einmal gemeinsam instantiiert werden sollen.
  • 3. Der Namensraum wird nach wie vor durch n·m verschiedene Klassennamen verschmutzt.
There is an often-working solution to this problem without having to leave the object-oriented paradigm. The implementation of a derived class C ij should not be done by multiple inheritance, but by container instances c ij ∈ C ij , each containing two instances a i ∈ A i and b j ∈ B j (in the form of a has-a relationship instead an is-a relationship). One can also call C ij a proxy class. However, this entails the following difficulties:
  • 1. The previous attributes were members of the old object instance representation; they are either indirectly addressed by the new representation or re-embedded. This wastes space.
  • 2. The common superclass G can contain attributes that are to be instantiated only once in multiple inheritance.
  • 3. The namespace is still polluted by n · m different class names.

Das erste Problem ist lästig, gefährdet aber die Korrektheit nicht. Zur Lösung des zweiten Problems kann man eine dritte Komponente g ∈ G in die Container-Instanz einführen. Das dritte Problem ist nicht zu umgehen und belastet im günstigsten Fall nur den Compiler.The first problem is annoying endangered but the correctness is not. To solve the second problem can one gets a third component g ∈ G into the container instance. The third problem can not be avoided and charged in the cheapest Case only the compiler.

Es gibt jedoch noch eine weitere Lösung: man führt eine Klasse C ein, die die Summe der Schnittstellen enthält und ansonsten nur als trivialer Container fungiert, der die eigentliche Implementierung in G, A und B aufruft (was den Schnittstellen-Aufwand etwa verdoppelt). Damit betreibt man in der Objektorientierung jedoch letztlich die gleiche Art von Einbettung von Unterobjekt-Instanzen, wie sie in „konventionellen" Programmierparadigmen schon immer gehandhabt wurde; es wird lediglich ein Zusatz-Aufwand mit Duplizierung von Schnittstellen getrieben, um das objektorientierte Paradigma mittels Mehrfachvererbung an der Schnittstelle retten zu können. Es stellt sich die Frage, ob die konzeptuell durch Mehrfachvererbung entstandene Schnittstelle C, deren Implementierung allerdings keine (Mehrfach-)Vererbung benutzt, wirklich benötigt wird, oder ob die durchgehende Benutzung von A und B als Ersatz für C nicht unter dem Strich einfacher ist. Unabhängig davon sehe ich das für die Objektorientierung wesentliche Paradigma der Vererbung nicht mehr als tatsächlich benutzt, und ich stelle die Frage, ob man es nicht gleich von vornherein hätte weglassen können.It However, there is another solution: you lead a class C containing the sum of the interfaces and otherwise only acts as a trivial container, which is the actual implementation in G, A and B calls (which approximately doubles the interface overhead). However, in the object orientation this ultimately operates same kind of embedding of sub-object instances, as in "conventional" programming paradigms has always been handled; it will only be an additional expense driven by duplication of interfaces to the object-oriented Rescue paradigm using multiple inheritance at the interface to be able to. It raises the question of whether the conceptually through multiple inheritance resulting interface C, but their implementation no (Multiple) inheritance is used, really needed, or whether the through Use of A and B as a substitute for C not the bottom line is easier. Independently of I see that for the object orientation is not essential paradigm of inheritance more than actually used, and I ask the question if it is not right from the start should have omitted can.

Dies bedeutet nach meiner Ansicht nicht, dass die automatisierte Ableitung von objektorientierten Datenschemata aus Klassen-Schemata generell nutzlos ist, denn es gibt sehr wohl Anwendungsfelder, wo die automatische Ableitung immer wiederkehrende Arbeitsvorgänge rationalisiert.This in my opinion does not mean that automated derivation of object-oriented data schemas from class schemas in general is useless, because there are very application fields where the automatic Derivation of recurring operations streamlined.

Ich bin der Ansicht, dass die Objektorientierung ein oft nützliches Denkschema zum Entwurf von Schnittstellen ist; dass aber eine unreflektierte Umsetzung dieses Schemas in konkrete Datenstrukturen kostspielig oder sogar gefährlich werden kann, da die üblicherweise angebotenen Daten-Repräsentationen nicht für die Aufgabenstellung optimal zu sein brauchen.I I'm of the opinion that object orientation is often useful Scheme for designing interfaces; but that one unreflective Implementation of this scheme into concrete data structures costly or even dangerous Can be, as the usual offered data representations not for the task needs to be optimal.

Auf methodischer Ebene scheint mir das geschilderte Problem auch darin zu liegen, dass objektorientierte Entwurfs-Denkweise oftmals auf Biegen und Brechen versucht, alles mittels Erweiterungs-Generizität zu lösen. Die hier vorgeführte Problemstellung passt jedoch zur kompositorischen Generizität viel besser. Dieses Beispiel ist daher ein weiteres Argument für den von mir propagierten Vorrang kompositorischer Generizität vor Erweiterungs-Generizität.On methodically, the problem described also seems to me to be in this to lay that object-oriented design thinking often on Bending and Breaking tries to solve everything by extension genericity. The presented here Problem setting, however, fits much better with compositional genericity. This example is therefore another argument for that of I favored the priority of compositional generosity over enlargement genericity.

C Ansätze zur Vermeidung von WettrennenC approaches to Avoidance of races

  • 1. Man sorgt dafür, daß stets genügend Ressourcen vorhanden sind und ein Entzug daher niemals notwendig wird. Leider spricht die Realität oft dagegen, da Ressourcen stets endlich sind und nach einem Quasi-Naturgesetz oft nicht zur Deckung des Bedarfs ausreichen. Wenn der Bedarf limitiert ist oder wenn man bereits bei der Ausgabe von Ressourcen Limits einführt (z.B. Quota), kann man u.U. auf Rückforderungsmechanismen verzichten. Ebenfalls in diese Kategorie fällt z.B. der Tausch von gleichwertigen Ressourcen, bei dem ebenfalls eine Rückforderung in Zukunft ausgeschlossen werden kann. Im Sinne des Eigentum/Besitz-Modells (Abschnitt 5.1) bedeutet dies, dass echtes Eigentum (nicht nur bloßer Besitz) übertragen wird, das nie mehr zurückgefordert werden kann.1. Make sure there are always enough resources and withdrawal is therefore never necessary. Unfortunately, that speaks reality often against, because resources are always finite and according to a quasi-natural law often not sufficient to meet the needs. If the need is limited or if you are already in the process of issuing resource limits introduces (e.g. quota), u.U. refrain from reclaiming mechanisms. Also falls into this category e.g. the exchange of equivalent resources, in which as well a recovery can be excluded in the future. In the sense of the ownership / ownership model (Section 5.1) this means that real property (not just mere possession) is transferred will never be reclaimed can be.
  • 2. Man verlangt, daß Besitz grundsätzlich nur an hierarchisch tieferstehende Instanzen und nur für die Dauer der Bearbeitung einer Operation weitergegeben werden darf; damit würde das Konzept des logischen IO nicht mehr benutzt und das Modell eingeschränkt.2. One demands that possession in principle only to hierarchically lower-level instances and only for the duration may be disclosed to the processing of an operation; in order to that would be Concept of logical IO is no longer used and the model is restricted.
  • 3. Man erlaubt nur die Rückvergabe von solchem Unterbesitz an höhere Instanzen, der bereits einmal von der gleichen höheren Instanz als Hauptbesitz an die niedrigere vergeben wurde (transitive Rücklieferung von Unterobjekten). Damit gehört der Unterbesitz in Wirklichkeit stets der höheren Instanz; eine Rückforderung durch den Hauptbesitzer wird als unberechtigt klassifiziert und nicht ausgeführt bzw. gar nicht erst versucht. Diese Konstruktion erweitert das Modell gegenüber 2. ohne gravierende Nachteile einzuführen; daher gebe ich ihm den Vorzug gegenüber 2. Allerdings sehe ich es immer noch als relativ stark eingeschränkt an, insbesondere für Anwendungen in verteilten Systemen und Netzwerk-Betriebssystemen. Auf der konzeptuellen Ebene scheint mir eine Vertauschung von Etiketten statt zu finden, da in Wirklichkeit keine echte Delegation von Macht über den Besitz statt findet.3. It is only permissible to return such sub-possession to higher authorities, which has already been assigned once by the same higher authority as principal property to the lower one (transitive return delivery of sub-objects). In reality, the sub-possession always belongs to the higher authority; a recovery by the main owner is classified as unauthorized and not executed or even ver examined. This construction expands the model compared to 2 without introducing serious disadvantages; therefore, I prefer it over 2. However, I still see it as relatively limited, especially for distributed systems and network operating system applications. On the conceptual level, it seems to me that there is a mix-up of labels, because in reality there is no real delegation of power over ownership.
  • 4. Man vergibt Besitz an höhere Instanzen (ggf. auch an niedrigere Instanzen) grundsätzlich nur auf begrenzte (Real-)Zeit, innerhalb deren die Ressource entweder zurückgegeben oder die Verleihzeit verlängert werden muß; die Zeitschranke wird so bemessen, daß ein Verfall des Leihdatums im Normalbetrieb nicht stattfindet. Nach diesem Modell ist es die Pflicht eines jedes Ausleihers, entweder für rechtzeitige Rückgabe oder für Fristverlängerung zu sorgen (analog zum Ausleih-Verfahren einer Universitäts-Bibliothek). Wenn die Zeitschranke überschritten wird, dann liegt in diesem Sinne ein Fehlverhalten vor, und die Ressourcen können z.B. automatisch entzogen werden. Dieser Entzug hat jedoch wieder den Charakter eines asynchron auftretenden Signals, d.h. es ändert nichts am Prinzip der Rückgabe, nur am Auslöser. Dieses Modell eignet sich insbesondere für einige Anwendungen in verteilten Systemen, da eine nicht rechtzeitig erfolgte Rückgabe bzw. Verlängerung auch als Ausfall einer Instanz interpretiert werden kann, auf den dann z.B. mit automatischen Entzug des Ressourcen-Besitzes und Neuverteilung reagiert wird; falls die Instanz nicht tatächlich ausgefallen war, sondern nur die Kommunikationsverbindung, dann „weiß" die betroffene Instanz nach Ablauf der Frist, dass sie die Verlängerung nicht mehr rechtzeitig geschafft hat und dass sie daher nicht mehr „rechtmäßiger" Besitzer ist.4. One gives possession to higher ones Instances (possibly also to lower instances) basically only on limited (real) time, within which the resource either returned or the rental period will be extended got to; the Time limit is calculated so that a lapse of the loan date does not take place in normal operation. After this model it is the Duty of each borrower, either for timely return or for extension of time (similar to the lending procedure of a university library). When the time limit is exceeded is wrong, then there is a misconduct in this sense, and the Resources can e.g. be withdrawn automatically. However, this withdrawal has again the character of an asynchronous signal, i. it does not change anything the principle of return, only on the trigger. This model is particularly suitable for some distributed applications Systems, as a timely return or extension can also be interpreted as a failure of an instance on the then e.g. with automatic withdrawal of resource ownership and redistribution is reacted; if the instance had not actually failed, but only the communication connection, then the affected entity "knows" after expiration the deadline that they are renewing did not make it on time and that she is no longer a "legitimate" owner.
  • 5. Die Besitzvergabe an höhere Instanzen geschieht ausschließlich unter der vollen Kontrolle der niedrigeren Instanz, die vollständig bestimmen kann, was damit geschieht. Damit wird jedoch das Hierarchie-Modell auch im regulären Betrieb auf den Kopf gestellt; es würde sich die Frage stellen, ob es noch eine Berechtigung hat. Auch die Eignung für verteilte Systeme scheint mir höchst zweifelhaft.5. Ownership of higher Instances happens exclusively under the full control of the lower instance, which completely determine can what happens to it. This, however, also makes the hierarchy model in the regular Operation turned upside down; it would ask the question if it still has an authorization. Also the suitability for distributed Systems seems to me the most doubtful.

Keiner dieser Ansätze scheint mir geeignet, das Wettrenn-Problem (Kapitel 5) so aus der Welt zu schaffen, daß dadurch keine neuen Probleme entstehen und dass Anforderungen von verteilten Systemen ausreichend berücksichtigt werden. Eine Bewertung, welche dieser Probleme als gewichtiger zu betrachten ist, kann je nach Standpunkt des Bewerters und nach Anforderungen an das System unterschiedlich ausfallen (beispielsweise sehe ich bei extrem sicherheitskritischen Anwendungen Vorteile bei Modell 3). Es ist grundsätzlich möglich, eine konkrete Baustein-Hierarchie innerhalb der hier vorgestellten Architektur so zu gestalten, daß notify_*-Operationen und deren Wettrennen vermieden werden; dies sehe ich dort als erstrebenswert an, wo eine Vermeidung ohne weiteres möglich ist und nur geringe Kosten verursacht. Ich sehe jedoch geringe Chancen, Wettrennen in einem verteilten System so zu vermeiden, daß keine Performanz-Nachteile oder Abhängigkeiten von der Funktionsfähigkeit zentraler Instanzen entstehen.none these approaches seems appropriate for me, the race problem (Chapter 5) from the To create that world by that no new problems arise and that requirements of distributed Sufficiently considered systems become. An evaluation of which of these problems is more important Consider, depending on the position of the evaluator and according to requirements different from the system (for example, I see for extremely safety-critical applications model advantages 3). It is basically possible, a concrete building block hierarchy within the here presented To design architecture so that notify _ * operations and whose races are avoided; I see that as desirable where avoidance is readily possible and only low cost caused. However, I see little chance of racing in one distributed system so as to avoid any performance disadvantages or dependencies from the functionality central instances arise.

Literatur literature

  • [AB86] ARCHIBALD, JAMES und JEAN-LOUP BAER: Cache Coherence Protocols: Evaluation Using a Multiprocessor Simulation Model. Transactions on Computer Systems, 4(4):273-298, 1986.[AB86] ARCHIBALD, JAMES and JEAN-LOUP BAER: Cache Coherence Protocols: Evaluation Using a Multiprocessor Simulation Model. Transactions on Computer Systems, 4 (4): 273-298, 1986.
  • [Ant90] ANTONOV, VADIM G.: A Regular Architecture for Operating Systems. Operating System Reviews, 24(3):22-39, 1990.[Ant90] ANTONOV, VADIM G .: A Regular Architecture for Operating System. Operating System Reviews, 24 (3): 22-39, 1990.
  • [Ass96] ASSENMACHER, HOLGER: Ein Architekturkonzept zum Entwurf flexibler Betriebssysteme. Dissertation Universität Kaiserslautern, 1996.[ASS96] ASSENMACHER, HOLGER: An architecture concept to the design flexible operating systems. Dissertation University of Kaiserslautern, 1996th
  • [AW94] ATTIYA, HAGIT und JENNIFER L. WELCH: Sequential Consistency versus Linearizability. Transactions on Computer Systems, 12(2):91-122, 1994.[AW94] ATTIYA, HAGIT and JENNIFER L. WELCH: Sequential Consistency versus linearizability. Transactions on Computer Systems, 12 (2): 91-122, 1994th
  • [B+90] BERSHAD, BRIAN N. und OTHERS: Lightweight Remote Procedure Call. Transactions on Computer Systems, 8(1):37-5, 1990.[B + 90] BERSHAD, BRIAN N. and OTHERS: Lightweight Remote Procedure Call. Transactions on Computer Systems, 8 (1): 37-5, 1990.
  • [B+95] BERSHAD, BAIAN N. und OTHERS: SPIN – An Extensible Microkernel for Application-specific Operating System Services. Operating System Reviews, 29(1):74-77, 1995.[B + 95] BERSHAD, BAIAN N., and OTHERS: SPIN - An Extensible Microkernel for Application-specific Operating System Services. Operating System Reviews, 29 (1): 74-77, 1995.
  • [Bac86] BACH, MAURICE J.: The Design of the UNIX Operating System. Prentice Hall, 1986. [BHG87] BERNSTEIN, PILIP A., VASSOS HADZILACOS und NATHAN GOODMAN: Concurrency Control and Recovery in Database Systems. Addison-Wesley, 1987.[Bac86] BACH, MAURICE J .: The Design of the UNIX Operating System. Prentice Hall, 1986. [BHG87] AMBER, PILIP A., VASSOS HADZILACOS and NATHAN GOODMAN: Concurrency Control and Recovery in Database System. Addison-Wesley, 1987.
  • [BN84] BIRRELL, ANDREW D. und BRUCE JAY NELSON: Implementing Remote Procedure Calls. Transactions on Computer Systems, 2(1):39-56, 1984.[BN84] BIRRELL, ANDREW D. and BRUCE JAY NELSON: Implementing Remote Procedure Calls. Transactions on Computer Systems, 2 (1): 39-56, 1984th
  • [BPS81] BELADY, L. A., R. P. PARMELEE und C. A. SCALZI: The IBM History of Memory Management Technology. IBM Journal of Research and Development, 25(5):491-503, 1981.[BPS81] BELADY, L.A., R.P. PARMELEE and C.A. SCALZI: The IBM History of Memory Management Technology. IBM Journal of Research and Development, 25 (5): 491-503, 1981.
  • [BR76] BLEVINS, PARKER R. und C. V. RAMAMOORTHY: Aspects of a Dynamically Adaptive Operating System. Transactions on Computers, 25(7):713-725, 1976.[BR76] BLEVINS, PARKER R. and C.V. RAMAMOORTHY: Aspects of a Dynamically Adaptive Operating System. Transactions on Computers, 25 (7): 713-725, 1976.
  • [BS75] BERNSTEIN, ARTHUR 7. und PAUL SIEGEL: A Computer Architecture for Level Structured Systems. Transactions on Computers, 24(8):785-893, 1975.[BS75] BERNSTEIN, ARTHUR 7th and PAUL SIEGEL: A Computer Architecture for Level Structured Systems. Transactions on Computers, 24 (8): 785-893, 1975th
  • [BS96] BRUSTOLONI, JOSE CARLOS und PETER STEENKISTE: Effects of Buffering Semantics on I/O Performance. OSDI, Seiten 277-291, 1996.[BS96] BRUSTOLONI, JOSE CARLOS, and PETER STEENKISTE: Effects of Buffering Semantics on I / O Performance. OSDI, pages 277-291, 1996th
  • [BS02] BROY, MANFRED und JOHANNES SIEDERSLEBEN: Objektorientierte Programmierung und Softwareentwicklung. Informatik Spektrum, 25(1):3-11, 2002.[BS02] BROY, MANFRED and JOHANNES SIEDERSLEBEN: object-oriented Programming and software development. Computer Science Spectrum, 25 (1): 3-11, Of 2002.
  • [BSS91] BIRMAN, KENNETH, ANDRE SCHIPER und PAT STEPHENSON: Lightweight Causal and Atomic Group Multicast. Transactions on Computer Systems, 9(3):272-314, 1991. [BSS91] BIRMAN, KENNETH, ANDRE SCHIPER and PAT STEPHENSON: Lightweight Causal and Atomic Group Multicast. Transactions on Computer Systems, 9 (3): 272-314, 1991.
  • [C+94] CHASE, JEFFREY S. und OTHERS: Sharing and Protection in a Single-Address-Space Operating System. Transactions on Computer Systems, 12(4):271-307,1994.[C + 94] CHASE, JEFFREY S. and OTHERS: Sharing and Protection in a Single-Address Space Operating System. Transactions on Computer Systems, 12 (4): 271-307, 1994.
  • [Che87] CHERITON, DAVID R.: UIO: A Uniform I/O System Interface for Distributed Systems. Transactions on Computer Systems, 5(1):126, 1987.[Che87] CHERITON, DAVID R .: UIO: A Uniform I / O System Interface for Distributed Systems. Transactions on Computer Systems, 5 (1): 126, 1987th
  • [CJ75] COHEN, ELLIS und DAVID JEFFERSON: Protection in the Hydra Operating System. Symposium on Operating System Principles, Seiten 141-160, 1975.[CJ75] COHEN, ELLIS, and DAVID JEFFERSON: Protection in the Hydra Operating System. Symposium on Operating System Principles, pages 141-160, 1975.
  • [CL85] CHANDY, K. MANI und LESLIE LAMPORT: Distributed Snapshots: Determining Global States of Distributed Systems. Transactions on Computer Systems, 3(1):63-75, 1985.[CL85] CHANDY, K. MANI and LESLIE LAMPORT: Distributed Snapshots: Determining Global States of Distributed Systems. Transactions on Computer Systems, 3 (1): 63-75, 1985.
  • [Cla85] CLARK, DAVID D.: The Structuring of Systems Using Upcalls. Symposium on Operating System Principles, Seiten 171-180, 1985.[Cla85] CLARK, DAVID D .: The Structuring of Systems Using Upcalls. Symposium on Operating System Principles, pages 171-180, 1985.
  • [CLG+93] CHEN, PETER M., EDWARD K. LEE, GARTH GIBSON, RANDY H. KATZ and DAVID A. PATTERSON: RAID: High-Performance, Reliable Secondary Storage. Computing Surveys, 26(2):145-185, 1993.[CLG + 93] CHEN, PETER M., EDWARD K. LEE, GARTH GIBSON, RANDY H. KATZ, and DAVID A. PATTERSON: RAID: High-Performance, Reliable Secondary Storage. Computing Surveys, 26 (2): 145-185, 1993.
  • [CW85] CARDELLI, LUCA and PETER WEGNER: On Understanding Types, Data Abstraction, and Polymorphism. Computing Surveys, 17(4):471-522, 1985.[CW85] CARDELLI, LUCA and PETER WEGNER: On Understanding Types, Data Abstraction, and Polymorphism. Computing Surveys, 17 (4): 471-522, 1985th
  • [Dat95] DATE, C. J.: An Introduction to Database Systems. Addison Wesley, 1995.[Dat95] DATE, C.J .: An Introduction to Database Systems. Addison Wesley, 1995.
  • [Den68] DENNING, PETER J.: The Working Set Model for Program Behavior. CACM, 11(5):323-333, 1968.[Den68] DENNING, PETER J .: The Working Set Model for Program Behavior. CACM, 11 (5): 323-333, 1968.
  • [Den71] DENNING, PETER J.: Virtual Memory. Computing Surveys, 2(3):153-189,1971.[Den71] DENNING, PETER J .: Virtual Memory. Computing Surveys, 2 (3): 153 to 189.1971.
  • [DGMS85] DAVIDSON, SUSAN B., HECTOR GARCIA-MOLINA und DALE SKEEN: Consistency in Partitioned Networks. Computing Surveys, 17(3):341-370, 1985.[DGMS85] DAVIDSON, SUSAN B., HECTOR GARCIA-MOLINA and DALE SKEEN: Consistency in partitioned networks. Computing Surveys, 17 (3): 341-370, 1985th
  • [DH66] DENNIS, JACK B. und EARL C. VAN HORN: Programming Semantics for Multiprogrammed Computations. CACM, 9(3):143-155, 1966.[DH66] DENNIS, JACK B. and EARL C. VAN HORN: Programming Semantics for Multiprogrammed Computations. CACM, 9 (3): 143-155, 1966.
  • [Dij68] DIJKSTRA, EDSGER W.: The Structure of the "THE" Multiprogramming System. CACM, 11(5):341-346, 1968.[Dij68] DIJKSTRA, EDSGER W .: The Structure of the "THE" Multiprogramming System. CACM, 11 (5): 341-346, 1968.
  • [Dij71] DIJKSTRA, E. W.: Hierarchical Ordering of Sequential Processes. Acta Informatica, 1:115-138, 1971.[Dij71] DIJKSTRA, E.W .: Hierarchical Ordering of Sequential Processes. Acta Informatica, 1: 115-138, 1971.
  • [dJ93] JONGE, WIEBREN DE: The Logical Disk: A New Approach to Improving File Systems. Symposium on Operating System Principles, Seiten 15-28, 1993.[dJ93] JONGE, WILL DE: The Logical Disk: A New Approach to Improving File Systems. Symposium on Operating System Principles, Pages 15-28, 1993.
  • [Doe96] DOEPPNER, THOMAS W.: Distributed File Systems and Distributed Memory. Computing Surveys, 28(1):229-231, 1996. [Doe96] DOEPPNER, THOMAS W .: Distributed File Systems and Distributed Memory. Computing Surveys, 28 (1): 229-231, 1996.
  • [DS72] DENNING, PETER J. und STUART C. SCHWARTZ: Properties of the Working-Set Model. CACM, 15(3):191-198, 1972.[DS72] DENNING, PETER J. and STUART C. SCHWARTZ: Properties of the Working Set Model. CACM, 15 (3): 191-198, 1972.
  • [EKO95] ENGLER, DAWSON R., M. FRANS KAASHOEK und JAMES O'TOOLE: Exokernel: An Operating System Architecture for Application-Level Resource Management. Symposium on Operating System Principles, Seiten 251-266, 1995.[EKO95] ENGLER, DAWSON R., M. FRANS KAASHOEK and JAMES O'TOOLE: Exokernel: An Operating System Architecture for Application-Level Resource Management. Symposium on Operating System Principles, pages 251-266, 1995th
  • [Elmbe] ELMAGARMID, AHMED K.: Database Transaction Models For Advanced Applications. Morgan Kaufmann, ohne Jahresangabe.[Elmbe] ELMAGARMID, AHMED S .: Database Transaction Models For Advanced Applications. Morgan Kaufmann, without year.
  • [EN95] ELMASRI, RAMEZ und SHAMKANT B. NAVATHE: Fundamentals of Database Systems. Addison Wesley, 1995.[EN95] ELMASRI, RAMEZ and SHAMKANT B. NAVATHE: Fundamentals of Database Systems. Addison Wesley, 1995.
  • [Esk96] ESKICIOGLU, M. RASIT: A Comprehensive Bibliography of Distributed Shared Memory. Operating System Reviews, 30(1):71-96, 1996.[Esk96] ESKICIOGLU, M. RASIT: A Comprehensive Bibliography of Distributed shared memory. Operating System Reviews, 30 (1): 71-96, 1996th
  • [Fie88] FIELD, ANTHONY J.: Functional Programming. Addison-Wesley, 1988.[Fie88] FIELD, ANTHONY J .: Functional Programming. Addison-Wesley, 1988th
  • [Fot61] FOTHERINGHAM, JOHN: Dynamic Storage Allocation in the Atlas Computer, Including an Automatic Use of Backing Store. CACM, 4(10):43536, 1961.[PHOTHERINGHAM, JOHN: Dynamic Storage Allocation in the Atlas Computer, Including an Automatic Use of Backing Store. CACM, 4 (10): 43536, 1961.
  • [GC94] GOODHEART, BERNY und JAMES COX: The Magic Garden Explained – The Internals of UNIX System V Release 4. Prentice Hall, 1994.[GC94] GOODHEART, BERNY, and JAMES COX: The Magic Garden Explained - The Internals of UNIX System V Release 4. Prentice Hall, 1994.
  • [GR93] GRAY, JIM und ANDREAS REUTER: Transaction Processing: Concepts and Techniques. Morgan Kaufmann, 1993.[GR93] GRAY, JIM and ANDREAS REUTER: Transaction Processing: Concepts and Techniques. Morgan Kaufmann, 1993.
  • [Hab69] HABERMANN, A. N.: Prevention of System Deadlocks. CACM, 12(7):373-385, 1969.[Hab69] HABERMANN, A. N .: Prevention of System Deadlocks. CACM, 12 (7): 373-385, 1969.
  • [Haj00] HAJJI, FARID: Perl – Einführung, Anwendungen, Referenz. Addison Wesley, 2000.[Haj00] HAJJI, FARID: Perl - Introduction, Applications, Reference. Addison Wesley, 2000.
  • [Han70] HANSEN, PER BRINCH: The Nucleus of a Multiprogramming System. CACM, 13(4):238-250, 1970.[Han70] HANSEN, PER BRINCH: The Nucleus of a Multiprogramming System. CACM, 13 (4): 238-250, 1970.
  • [Han73] HANSEN, PER BRINCH: Concurrent Programming Concepts. Computing Surveys, 5(4):223-245, 1973.[Han73] HANSEN, PER BRINCH: Concurrent Programming Concepts. Computing Surveys, 5 (4): 223-245, 1973.
  • [Hoa74] HOARE, C. A. R.: Monitors: An Operating System Structuring Concept. CACM, 17(10):549-557, 1974.[Hoa74] HOARE, C.A.R .: Monitors: An Operating System Structuring Concept. CACM, 17 (10): 549-557, 1974.
  • [Hoa78] HOARE, C. A. R.: Communicating Sequential Processes. CACM, 21(8):666-677, 1978.[Hoa78] HOARE, C.A.R .: Communicating Sequential Processes. CACM, 21 (8): 666-677, 1978.
  • [HP94] HEIDEMANN, JOHN S. und GERALD J. POPEK: File-System Development with Stackable Layers. Transactions on Computer Systems, 12(1):58-89, 1994.[HP94] HEIDEMANN, JOHN S. and GERALD J. POPEK: File System Development with Stackable Layers. Transactions on Computer Systems, 12 (1): 58-89, 1994.
  • [HP95] HEIDEMANN, JOHN und GERALD POPEK: Performance of Cache Coherence in Stackable Filing. Symposium on Operating System Principles, Seiten 127-142, 1995. [HP95] HEIDEMANN, JOHN and GERALD POPEK: Performance of Cache Coherence in Stackable Filing. Symposium on Operating System Principles, Pages 127-142, 1995.
  • [HR83] HÄRDER, THEO und ANDREAS REUTER: Principles of Transaction-Oriented Database Recovery. Computing Surveys, 15(4):287-317, 1983.[HR83] HARDENERS, THEO and ANDREAS REUTER: Principles of Transaction-Oriented Database Recovery. Computing Surveys, 15 (4): 287-317, 1983.
  • [HR01] HÄRDER, THEO und ERHARD RAHM: Datenbanksysteme- Konzepte und Techniken der Implementierung. Springer-Verlag, 2. Auflage Auflage, 2001.[HR01] HARDENERS, THEO and ERHARD RAHM: Database Systems Concepts and Techniques of Implementation. Springer-Verlag, 2nd edition edition, 2001.
  • [Hur] The GNU Hurd – GNU Project – Free Software Foundation (FSF). http://www.gnu.org/software/hurd/hurd.html.[Hur] The GNU Hurd - GNU Project - Free Software Foundation (FSF). http://www.gnu.org/software/hurd/hurd.html.
  • [HW90] HERLIHY, MAURICE P. und JEANNETTE M. WING: Linearizability: A Correctness Condition for Concurrent Objects. Transactions on Programming Languages and Systems, 12(3):46392, 1990.[HW90] HERLIHY, MAURICE P. and JEANNETTE M. WING: Linearizability: A Correctness Condition for Concurrent Objects. Transactions on Programming Languages and Systems, 12 (3): 46392, 1990.
  • [Jef85] JEFFERSON, DAVID R.: Virtual Time. Transactions on Programming Languages and Systems, 7(3):40425, 1985.[Jef85] JEFFERSON, DAVID R .: Virtual Time. Transactions on Programming Languages and Systems, 7 (3): 40425, 1985.
  • [JH02] JÄHNICHEN, STEFAN und STEPHAN HERRMANN: Was, bitte, bedeutet Objektorientierung? Informatik Spektrum, 25(4):266-275, 2002.[JH02] JOHN, STEFAN and STEPHAN HERRMANN: What, please, does object orientation mean? Computer Science Spectrum, 25 (4): 266-275, 2002.
  • [Jon80] JONES, ANITA K.: Capability Architecture Revisited. Operating System Reviews, 14(3):33-35, 1980.[Jon80] JONES, ANITA K .: Capability Architecture Revisited. Operating System Reviews, 14 (3): 33-35, 1980.
  • [Jür73] JÜRGENS, JÜRN: Synchronisation paralleler Prozesse anhand von Zuständen. Doktorarbeit, Technische Universität München, 1973.[Jür73] JÜRGENS, JÜRN: Synchronization parallel processes based on states. Doctoral thesis, Technical university Munich, 1,973th
  • [K+81] KAHN, KEVIN C. und OTHERS: iMAX: A Multiprocessor Operating System for an Object-Based Computer. Symposium on Operating System Principles, Seiten 127-136, 1981.[K + 81] KAHN, KEVIN C., and OTHERS: iMAX: A Multiprocessor Operating System for an Object-Based Computer. Symposium on Operating System Principles, pages 127-136, 1981.
  • [K+91] KARLIN, A. und OTHERS: Empirical Studies of Competitive Spinning for a Shared-Memory Multiprocessor. Symposium on Operating System Principles, Seiten 41-55, 1991.[K + 91] KARLIN, A. and OTHERS: Empirical Studies of Competitive Spinning for a Shared-Memory Multiprocessor. Symposium on Operating System Principles, pages 41-55, 1991.
  • [K+97] KAASHOEK, M. FRANS und OTHERS: Application Performance and Flexibility on Exokernel Systems. Symposium on Operating System Principles, Seiten 52-65, 1997.[K + 97] KAASHOEK, M. FRANS, and OTHERS: Application Performance and Flexibility on Exokernel Systems. Symposium on Operating System Principles, pages 52-65, 1997.
  • [KE95] KLEIMAN, STEVE und JOE EYKHOLT: Interrupts as Threads. Operating System Reviews, 29(2):21-26, 1995.[KE95] KLEIMAN, STEVE and JOE EYKHOLT: Interrupts as Threads. Operating System Reviews, 29 (2): 21-26, 1995.
  • [Knu94] KNUTH, DONALD E.: The TEXbook. Addison Wesley, 1994.[Knu94] KNUTH, DONALD E .: The T E Xbook. Addison Wesley, 1994.
  • [LA93] LIM, BENG-HONG und ANANT AGARWAL: Waiting Algorithms for Synchronization in Large-Scale Multiprocessors. Transactions on Computer Systems, 11(3):253-294, 1993.[LA93] LIM, BENG-HONG and ANANT AGARWAL: Waiting Algorithms for Synchronization in Large-Scale Multiprocessors. Transactions on Computer Systems, 11 (3): 253-294, 1993.
  • [Lag78] LAGALLY, K.: Synchronization in a Layered System. In: FLYNN, M. J. und OTHERS (Herausgeber): Operating Systems, An Advanced Course, Band 60 der Reihe Lecture Notes in Computer Science, Seiten 253-281. Springer-Verlag, 1978. [Lag78] LAGALLY, K .: Synchronization in a Layered System. In: FLYNN, M.J. and OTHERS (Editor): Operating Systems, An Advanced Course, Volume 60 of the series Lecture Notes in Computer Science, pages 253-281. Springer-Verlag, 1978.
  • [Lam74] LAMPORT, LESLIE: A New Solution of Dijkstra's Concurrent Programming Problem. CACM, 17(8):453-455; 1974.[Lam74] LAMPORT, LESLIE: A New Solution to Dijkstra's Concurrent Programming Problem. CACM, 17 (8): 453-455; 1974th
  • [Lam78] LAMPORT, LESLIE: Time, Clocks, and the Ordering of Events in a Distributed System. CACM, 21(7):558-565, 1978.[Lam78] LAMPORT, LESLIE: Time, Clocks, and the Ordering of Events in a Distributed System. CACM, 21 (7): 558-565, 1978.
  • [Lam84] LAMPORT, LESLIE: Using Time Instead of Timeout for Fault-Tolerant Distributed Systems. Transactions on Programming Languages and Systems, 6(2):254-280, 1984.[Lam84] LAMPORT, LESLIE: Using Time Instead of Timeout for Fault-Tolerant Distributed Systems. Transactions on Programming Languages and Systems, 6 (2): 254-280, 1984.
  • [Lan81] LANDWEHR, CARL E.: Formal Models for Computer Security. Computing Surveys, 13(3):247-278, 1981.[Lan81] LANDWEHR, CARL E .: Formal Models for Computer Security. Computing Surveys, 13 (3): 247-278, 1981.
  • [LCC+75] LEVIN, R., E. COHEN, W. CORWIN, F. POLLACK und W. WULF: Policy/Mechanism Separation in Hydra. Symposium on Operating System Principles, Seiten 132-140, 1975.[LCC + 75] LEVIN, R., E. COHEN, W. CORWIN, F. POLLACK and W. WULF: Policy / Mechanism Separation in Hydra. Symposium on Operating System Principles, pages 132-140, 1975.
  • [LH89] LI, KAI und PAUL HUDAK: Memory Coherence in Shared Virtual Memory Systems. Transactions on Computer Systems, 7(4):321-359, 1989.[LH89] LI, KAI, and PAUL HUDAK: Memory Coherence in Shared Virtual Memory Systems. Transactions on Computer Systems, 7 (4): 321-359, 1989th
  • [Lie95a] LIEDTKE, JOCHEN: Address Space Sparsity and Fine Granularity. Operating System Reviews, 29(1):87-90, 1995.[Lie95a] LIEDTKE, JOCHEN: Address Space Sparsity and Fine Granularity. Operating System Reviews, 29 (1): 87-90, 1995.
  • [Lie95b] LIEDTKE, JOCHEN: On μ-Kernel-Construction. Symposium on Operating System Principles, Seiten 237-250, 1995.[Lie95b] LIEDTKE, JOCHEN: On μ-Kernel-Construction. Symposium on Operating System Principles, pages 237-250, 1995.
  • [Lio96] LIONS, JOHN: Lions' Commentary on UNIX 6th Edition with Source Code. Peer-to-Peer Communications, 1996.[Lio96] LIONS, JOHN: Lions' Commentary on UNIX 6th Edition with Source Code. Peer-to-peer communications, 1996th
  • [LS87] LOCKEMANN, P. C. und J. W. SCHMIDT: Datenbank-Handbuch. Springer-Verlag, 1987.[LS87] LOCKEMANN, P.C. and J.W. SCHMIDT: Database Manual. Springer-Verlag, 1987.
  • [LS94] LIN, TEIN-HSIANG und KANG G. SHIN: An Optimal Retry Policy Based on Fault Classification. Transactions on Computers, 43(9):1014-1025, 1994.[LS94] LIN, TEIN-HSIANG and KANG G. SHIN: To Optimal Retry Policy Based on Fault Classification. Transactions on Computers, 43 (9): 1014-1025, 1994th
  • [McK96] MCKUSICK, MARSHALL KIRK: Secondary Storage and Filesystems. Computing Surveys, 28(1):217-219, 1996.[McK96] MCKUSICK, MARSHALL KIRK: Secondary Storage and Filesystems. Computing Surveys, 28 (1): 217-219, 1996.
  • [Mey88] MEYER, BETRAND: Objektorientierte Software-Entwicklung. Prentice Hall, 1988.[Mey88] MEYER, BETRAND: Object-oriented software development. Prentice Hall, 1988.
  • [MJLF84] MCKUSICK, MARSHALL K., WILLIAM N. JOY, SAMUEL J. LEFFLER und ROBERT S. FABRY: A Fast File System for UNIX. Transactions on Computer Systems, 2(3):181-197, 1984.[MJLF84] MCKUSICK, MARSHALL K., WILLIAM N. JOY, SAMUEL J. LEFFLER and ROBERT S. FABRY: A Fast File System for UNIX. Transactions on Computer Systems, 2 (3): 181-197, 1984.
  • [MP81] MILLER, BARTON und DAVID PRESOTTO: XOS: An Operating System for the X-Tree Architecture. Operating System Reviews, 15(2):21-32, 1981.[MP81] MILLER, BARTON and DAVID PRESOTTO: XOS: An Operating System for the X-Tree Architecture. Operating System Reviews, 15 (2): 21-32, 1,981th
  • [NW74] NEEDHAM, R. M. und M. V. WILKES: Domains of protection and the management of processes. Computer Journal, 17(2):117-120, 1974. [NW74] NEEDHAM, R.M. and M.V. WILKES: Domains of protection and the management of processes. Computer Journal, 17 (2): 117-120, 1974th
  • [NW77] NEEDHAM, R. M. und R. D. H. WALKER: The Cambridge CAP Computer and its protection system. Symposium on Operating System Principles, Seiten 1-10, 1977.[NW77] NEEDHAM, R.M. and R.D. H. WALKER: The Cambridge CAP Computer and its protection system. Symposium on Operating System Principles, pages 1-10, 1977.
  • [OpL] Opportunistic Locks. http: //msdn.microsoft.com/library/default.asp? url=/library/en-us/fileio%/base/opportunistic_locks.asp http://msdn.microsoft.com/library/default.asp?url=/library/ en-us/fileio%/base/opportunistic_lock_examples.asp http://msdn.microsoft.com/library/default.asp?url=/library/ en-us/fileio%/base/how_to_request_an_opportunistic_lock.asp http://msdn.microsoft.com/library/default.asp?url=/library/ en-us/fileio%/base/breaking_opportunistic_locks.asp.[OpL] Opportunistic Locks. http: //msdn.microsoft.com/library/default.asp? url = / library / en-us / fileio% / base / opportunistic_locks.asp http://msdn.microsoft.com/library/default.asp?url=/library/ en-us / fileio% / base / opportunistic_lock_examples.asp http://msdn.microsoft.com/library/default.asp?url=/library/ en-us / fileio% / base / how_to_request_an_opportunistic_lock.asp http://msdn.microsoft.com/library/default.asp?url=/library/ en-us / fileio% / base / breaking_opportunistic_locks.asp.
  • [Opl65] OPLER, ASCHER: Procedure-Oriented Language Statements to Facilitate Parallel Processing. CACM, 8(5):306-307, 1965.[Opl65] OPLER, ASCHER: Procedure-Oriented Language Statements to Facilitate Parallel Processing. CACM, 8 (5): 306-307, 1965.
  • [Org72] ORGANICK, ELLIOT I.: The Multics System: An Examination of Its Structure. MIT Press, 1972.[Org72] ORGANICK, ELLIOT I .: The Multics System: An Examination of Its Structure. MIT Press, 1972.
  • [Par72] PARNAS, D. L.: On the Criteria To Be Used in Decomposing Systems into Modules. CACM, 15(12):1053-1058, 1972.[Par72] PARNAS, D.L .: On the Criteria To Be Used in Decomposing Systems into Modules. CACM, 15 (12): 1053-1058, 1972.
  • [Par78] PARNAS, DAVID L.: The Non-Problem of Nested Monitor Calls. Operating System Reviews, 12(1):12-18, 1978.[Par78] PARNAS, DAVID L .: The Non-Problem of Nested Monitor Calls. Operating System Reviews, 12 (1): 12-18, 1978.
  • [PC75] PRUITT, J. L. und W. W. CASE: Architecture of a Real Time Operating System. Symposium on Operating System Principles, Seiten 51-59, 1975.[PC75] PRUITT, J.L. and W.W. CASE: Architecture of a Real Time Operating System. Symposium on Operating System Principles, Pages 51-59, 1975.
  • [PDZ99] PAI, VIVEK S., PETER DRUSCHEL und WILLY ZWAENEPOEL: IO-Liter A Unified UO Buffering and Caching System. OSDI, Seiten 15-28, 1999.[PDZ99] PAI, VIVEK S., PETER DRUSCHEL and WILLY ZWAENEPOEL: IO-liter A Unified UO Buffering and Caching System. OSDI, pages 15-28, 1999.
  • [PDZ00] PAI, VIVEK S., PETER DRUSCHEL und WILLY ZWAENEPOEL: IO-Liter A Unified UO Buffering and Caching System. Transactions on Computer Systems, 18(1):37-6, 2000.[PDZ00] PAI, VIVEK S., PETER DRUSCHEL and WILLY ZWAENEPOEL: IO-liter A Unified UO Buffering and Caching System. Transactions on Computer Systems, 18 (1): 37-6, 2000.
  • [RK79] REED, DAVID P. und RAJENDRA K. KANODIA: Synchronization with Eventcounts and Sequencers. CACM, 22(2):115-123, 1979.[RK79] REED, DAVID P. and RAJENDRA K. KANODIA: Synchronization with event counts and sequencers. CACM, 22 (2): 115-123, 1979.
  • [R091] ROSENBLUM, MENDEL und JOHN K. OUSTERHOUT: The Design and the Implementation of a Log-Structured File System. Symposium on Operating System Principles, Seiten 1-15, 1991.[R091] ROSENBLUM, MENDEL and JOHN K. OUSTERHOUT: The Design and the implementation of a log-structured file system. symposium on Operating System Principles, pages 1-15, 1991.
  • [Ros94] ROSCOE, TIMOTHY: Linkage in the Memesis Single Address Space Operating System. Operating System Reviews, 28(4):48-55, 1994.[Ros94] ROSCOE, TIMOTHY: Linkage in the Memesis Single Address Space Operating System. Operating System Reviews, 28 (4): 48-55, 1994.
  • [RT74] RITCHIE, DENNIS M. und KEN THOMPSON: The UNIX Time-Sharing System. CACM, 17(7):365-375, 1974. [RT74] RITCHIE, DENNIS M. and KEN THOMPSON: The UNIX Time Sharing System. CACM, 17 (7): 365-375, 1974.
  • [Smi88] SMITH, JONATHAN M.: A Survey of Process Migration Mechanisms. Operating System Reviews, 22(3):280, 1988.[Smi88] SMITH, JONATHAN M .: A Survey of Process Migration Mechanisms. Operating System Reviews, 22 (3): 280, 1988.
  • [Str78] STROUSTRUP, BJARNE: On Unifying Module Interfaces. Operating System Reviews, 12(1):90-98, 1978.[Str78] STROUSTRUP, BJARNE: On Unifying Module Interfaces. operating System Reviews, 12 (1): 90-98, 1978.
  • [Szy98] SZYPERSKI, CLEMENS: Component Software. Addison-Wesley, 1998.[Szy98] SZYPERSKI, CLEMENS: Component Software. Addison-Wesley, 1998th
  • [T+90] TANENBAUM, ANDREW S. und OTHERS: Experiences with the Amoeba Distributed Operating System. CACM, 33(12):47-63, 1990.[T + 90] TANENBAUM, ANDREW S. and OTHERS: Experiences with the Amoeba Distributed Operating System. CACM, 33 (12): 47-63, 1990.
  • [TA90] TAY, B. H. und A. L. ANANDA: A Survey of Remote Procedure Calls. Operating System Reviews, 24(3):68-79, 1990.[TA90] TAY, B.H. and A.L. ANANDA: A Survey of Remote Procedure Calls. Operating System Reviews, 24 (3): 68-79, 1990.
  • [Tho96] THOMPSON, SIMON: Haskell: The Crafi of Functional Programming. Addison-Wesley, 1996.[Tho96] THOMPSON, SIMON: Haskell: The Crafi of Functional Programming. Addison-Wesley, 1996.
  • [TL93] THEKKATH, CHANDRAMOHAN A. und HENRY M. LEVY: Limits to Low-Latenct Communication on High-Speed Networks. Transactions on Computer Systems, 11(2):179-203, 1993.[TL93] THEKKATH, CHANDRAMOHAN A. and HENRY M. LEVY: Limits to Low-latency communication on high-speed networks. Transactions on Computer Systems, 11 (2): 179-203, 1993.
  • [TSF90] TAM, MING-CHIT, JONATHAN M. SMITH und DAVID J. FARBER: A Taxonomy-Based Comparison of Several Distributed Shared Memory Systems. Operating System Reviews, 24(3):40-67, 1990.[TSF90] TAM, MING-CHIT, JONATHAN M. SMITH and DAVID J. FARBER: A Taxonomy-Based Comparison of Multiple Distributed Shared Memory System. Operating System Reviews, 24 (3): 40-67, 1990.
  • [Vah96] VAHALIA, URESH: UNIX Internals. Prentice Hall, 1996.[Vah96] VAHALIA, URESH: UNIX Internals. Prentice Hall, 1996.
  • [VGH93] VOSSEN, GOTTFRIED und MARGRET GROS-HARDT: Grundlagen der Transaktionsverarbeitung. Addison-Wesley, 1993.[VGH93] VOSSEN, GOTTFRIED and MARGRET GROS-HARDT: Basics the transaction processing. Addison-Wesley, 1993.
  • [Vid87] VIDYASANKAR, K.: Generalized Theory of Serializability. Acta Informatica, 24:105-119, 1987.[Vid87] VIDYASANKAR, K .: Generalized Theory of Serializability. Acta Informatica, 24: 105-119, 1987.
  • [Y+90] YOKOTE, YASUHIKO und OTHERS: The Muse Object Architecture: A New Operating Systems Structuring Concept. Operating System Reviews, 25(2):226, 1990.[Y + 90] YOKOTE, YASUHIKO, and OTHERS: The Muse Object Architecture: A New Operating Systems Structuring Concept. Operating System Reviews, 25 (2): 226, 1990.

AnmerkungenRemarks

1Der übliche Weg besteht in der Erfassung von Anforderungen vor dem Beginn jeglicher Entwurfs-Arbeiten. Wenn dies nicht möglich ist, könnte man der Versuchung erliegen, auf Anforderungen einfach nicht zu achten. Dies kann schwerwiegende Nachteile zur Folge haben. Es geht mir daher nicht darum, eine Anforderungs-Analyse abzuschaffen, sondern diese in spätere Entwurfs-Phasen, insbesondere dden Detail-Entwurf konkreter Baustein-Typen, zu verschieben. 1 The usual way is to capture requirements before starting any design work. If this is not possible, one could succumb to the temptation to simply ignore requirements. This can result in serious disadvantages. It is therefore not my intention to abolish a requirement analysis, but this in later design phases, in particular the detailed design concrete block types, to move.

2Dieser Effekt ist nicht auf objektorientierte Systeme beschränkt; er scheint mir ein soziologisches und psychologisches Problem bei jeglicher Software-Entwicklung mit vielen Beteiligten zu sein, und dürfte daher auch für die hier vorgestellte Architektur ab einer gewissen Größenordnung relevant werden (Conway's Law: „systems mirror the structure of organizations producing them"). Das objektorientierte Paradigma wird jedoch manchmal so gelehrt, als wäre die Erweiterung bestehender Schnittstellen ein Allheilmittel gegen die Problematik jeglicher Veränderungen von Anforderungen. Diese oft nur unterschwellig vorhandene Einstellung führt zusammen mit der durch die objektorientierten Sprachen stark erleichterten Handhabung der Erweiterungsmechanismen sehr leicht zur Ausuferung von Klassenhierarchien (bzw. bei konventionellen Entwürfen zum Anflanschen von "Balkonen") und damit zur vermeidbaren Reduplikation von implementierter Funktionalität. 2 This effect is not limited to object-oriented systems; It seems to me to be a sociological and psychological problem in any software development with many involved, and therefore should be relevant for the architecture presented here beyond a certain size (Conway's Law: "Systems mirror the structure of organizations producing them"). However, the object-oriented paradigm is sometimes taught as if broadening existing interfaces is a panacea to the problem of any change in requirements.This often subliminal attitudes, along with the ease of handling extensibility facilitated by the object-oriented languages, can easily lead to the proliferation of class hierarchies (Or in conventional designs for flanging "balconies") and thus avoidable reduplication of implemented functionality.

3Über die in dieser Arbeit untersuchten Spielarten von Generzität hinaus kann es auch noch weitere geben. 3 There may also be more than the varieties of generosity examined in this work.

4Insbesondere Vergleich zu den Möglichkeiten der Textersetzung durch Makro-Prozessoren scheint Meyers Begriff von Generizität deutlich enger gefasst zu sein als der hiesige Begriff der parametrischen Generizität. 4 In particular, compared to the possibilities of macro-processor text replacement, Meyer's concept of genericity appears to be much narrower than the term "parametric genericity".

5Meyer meint in den Kapiteln 6 und 19, dass (parametrische) Generizität ohne Typprüfung sinnlos wäre. Dem widerspricht jedoch u.a. die Lisp-Tradition seit den 1960er Jahren, in der parametrische Generizität ohne automatisierte Typprüfungen benutzt wurde. Man muss lediglich die Typprüfungen notfalls „von Hand" zur Laufzeit machen, wenn man das Konzept der parametrischen Polymophie in solchen Sprachen wie der Urform von Lisp nutzen will. Vielleicht kommt dieses Missverständnis auch daher, dass der nackte Begriff der Generizität oftmals synonym für den vergleichweise eingeschränkten Begriff der parametrischen Polymorphie verwendet wird. Diese eingeschränkte Verwendung verstellt den Blick für die wesentlich weiter reichenden Möglichkeiten von Generizität im Sinne von Mechanismen zur Reduktion von Redundanz. 5 Meyer states in Chapters 6 and 19 that (parametric) genericity without type testing would be pointless. However, this contradicts, among others, the Lisp tradition since the 1960s, in which parametric genericity was used without automated type tests. If you want to use the concept of parametric polymorphism in such languages as the original form of Lisp, you just have to make the type checks "by hand" if necessary, perhaps because of the misunderstanding that the naked term genericity is often synonymous with the equivalent This limited use obscures the much wider possibilities of genericity in the sense of redundancy reduction mechanisms.

6Einige Beispiele sollen kurz verdeutlichen, dass Makro-Prozessoren trotz ihrer geringeren Sicherheit gegen versehentliche Fehlbenutzung einige nützliche Anwendungen von parametrischer Generizität ausführen können, die mittels parametrischer Polymorphie nicht auf einfache Weise simulierbar sind:
Beispielsweise kann man mittels Makro-Prozessoren die Felder von Strukturen (Records oder Klassen-Mitglieder) alphabetisch nach dem Namen oder nach kombinierten Schlüsseln wie (Typ, Name) sortieren. Man kann die Namen der Mitglieder einem bestimmten Namens-Schema unterziehen oder die Einhaltung eines bestimmten Namens-Schemas überprüfen, beispielsweise indem die Namen aller Mitglieder einer Klasse A die Form A_* haben müssen. In statisch typisierten Sprachen wie Eiffel oder C++ lassen sich statisch auswertbare Iteratoren über Klassen-Mitglieder definieren, die ansonsten nur in typlosen Sprachen wie Smalltalk auf einfache Weise generisch realisierbar sind. Mittels genügend mächtiger Makro-Sprachen wie beispielsweise TeX, die vom Typ Chomsky-0 sind, kann man theroretisch sogar automatische Typ-Inferenz zwischen Klassen betreiben und abstrakte Basisklassen aus einem gegebenen Klassenschema automatisch extrahieren. Derartige Techniken könnten beispielsweise zur Entdeckung bisher unentdeckt gebliebener Redundanz in großen Software-Projekten dienen.
6 Some examples are intended to illustrate briefly that despite their lesser security against accidental misuse, macro-processors can perform some useful applications of parametric genericity that are not easily simulated by parametric polymorphism:
For example, you can use macro processors to sort the fields of structures (records or class members) alphabetically by name or by combined keys such as (type, name). It is possible to subject the names of the members to a specific naming scheme or to check compliance with a particular naming scheme, for example by having the names of all members of a class A of the form A_ *. In statically typed languages such as Eiffel or C ++, statically evaluable iterators can be defined via class members, which otherwise can only be implemented generically in non-typed languages such as Smalltalk. By means of sufficiently powerful macro languages such as TeX, which are of the type Chomsky-0, one can theoretically even operate automatic type inference between classes and automatically extract abstract base classes from a given class schema. Such techniques could, for example, serve to discover previously undiscovered redundancy in large software projects.

7Übermäßiger von Generizität kann auch die Redundanz erhöhen, die Durchschaubarkeit von Software verschlechtern, die Performanz verschlechtern, und damit zu negativen Effekten führen. Eine objektiv exakte Einschätzung und Abwägung der Einsatzstellen scheint schwierig und ist daher oftmals der subjektiven Einschätzung des jeweiligen Entwerfers unterworfen. 7 Excessive of genericity can also increase redundancy, impair the transparency of software, degrade performance, and therefore lead to negative effects. An objectively exact assessment and weighing of the employment agencies seems difficult and is therefore often subject to the subjective assessment of the respective designer.

8Dieses widerspricht nicht der scheinbar genau umgekehrten Aussage von Meyers Analyse in [Mey88, Abschnitt 19.3]. Meyer verwendet den Begriff der Generizität synonym zu einer Ausprägung von parametrischer Polymorphie, wie sie speziell in Ada auftritt. Im Gegensatz dazu verstehe ich unter parametrischer Generizität ein sehr viel allgemeineres Konzept, unter Generizität schlechthin sogar eine nochmals allgemeinere Denk-Kategorie. Man muss sich diese unterschiedlichen Begriffsbildungen vor Augen halten, wenn man die Aussagen miteinander vergleicht. Das hier vorgestellte Beispiel stützt jedoch die hier vorgeschlagene Begriffsbildung. 8 This does not contradict the seemingly inverse statement of Meyer's analysis in [Mey88, Section 19.3]. Meyer uses the notion of genericity synonymous with an expression of parametric polymorphism, as occurs specifically in Ada. By contrast, I understand parametric genericity to be a much more general concept, and genericity is an even more general category of thinking. One has to keep these different concepts in mind when comparing the statements with each other. However, the example presented here supports the concept formation proposed here.

9Die [HP94] vorgestellte hierarchische Modularisierung von Dateisystemen verwendet einige der hier vorgestellten Konzepte, beschränkt sich jedoch nicht nur auf die Funktionalität von Dateisystemen und verwendet deren aufwendigere Schnittstellen (insbesondere zum Management von Dateisystem-Unterbäumen), sondern basiert auch inhärent auf konventionellen Dateisystem-Konzepten und -Abstraktionen wie vnodes, vnode-Operationen und vfs, die in der vorliegenden Arbeit keine Rolle spielen. 9 The hierarchical modularization of file systems presented in [HP94] uses some of the concepts presented here, but is not limited to the functionality of file systems and uses their more elaborate interfaces (especially for the management of file system subtrees), but is also inherently based on conventional file systems. Concepts and abstractions such as vnodes, vno de-operations and vfs, which play no role in the present work.

10Auch universelle Generizität läßt sich durch parametrische Generizität ausdrücken. Die Unterscheidung der verschiedenen Arten von Generizität ist daher letzlich nur ein menschlicher Verstehensansatz, der eine bestimmte Denkweise beim Entwurf kommunizierbar machen soll. 10 Also universal genericity can be expressed by parametric genericity. The distinction between the different types of genericity is therefore ultimately only a human understanding approach that should make a certain way of thinking communicable in the design.

11Die Problematik bei einer formaleren Fassung des Begriffes der universellen Generizität besteht darin, was man unter einfach verstehen soll. Lässt man „komplizierte" Simulationen zu, dann kann man wesentliche Teile der Funktionalität in der Abbildung auf das zu simulierende Konzept verstecken, anstatt es im benutzten Grundkonzept zu, lösen. Die „Einfachheit" einer Simulation lässt sich auf mehrere verschiedene Weisen formal fassen; da es mir bei dieser Diskussion nur um Denk-Kategorien während der Entwurfs-Phase geht, habe ich auf formale Fassungen all dieser Begriffe verzichtet. 11 The problem with a more formal version of the concept of universal genericity is what should be understood by simply. If you allow "complicated" simulations, then you can hide significant parts of the functionality in the figure on the concept to be simulated instead of solving it in the basic concept used.The "simplicity" of a simulation can be formalized in several different ways; Since this discussion is only about categories of thinking during the design phase, I have renounced formal versions of all of these terms.

12Ausnahmen hiervon gibt es nur bei Untersuchungen über konkrete Alternativ-Mechanismen bei speziellen wohldefinierten Teilproblemen. 12 Exceptions to this rule only exist in investigations of concrete alternative mechanisms for specific well-defined subproblems.

13In dem anscheinend wenig beachteten Artikel [Ant90] beschreibt Antonov, leider in teilweise sehr schwer zu verstehendem und manchmal nicht eindeutig zu interpretierendem Englisch, eine „reguläre Architektur", die trotz anderer formeller Darstellung dem Kerngedanken der hier vorgestellten Architektur sehr nahe kommt, dabei jedoch auf Erweiterungs-Generizität und weniger auf kombinatorische Generizität ausgelegt ist. Im Detail gibt es weitere gravierende Unterschiede; so etwa bei der enormen Anzahl von Schnittstellen-Funktionen, bei den Instantiierungs-Mechanismen, den fest eingebauten Schutzmechanismen, und möglicherweise auch bei der Anzahl der „Ausgänge" pro „Baustein" (in allen Beispielen kommt immer nur ein einziger Ausgang vor; einen grammatisch klaren expliziten Hinweis auf mehrere „Ausgänge" konnte ich nicht finden). Weiterhin fehlt bei Antonov der hier vorgestellte Ersatz von Dateisystemen durch dynamische hierarchische Instantiierung von Bausteinen; eine Unterscheidung verschiedener Betriebsarten oder Betriebsmodelle ist ebenfalls nicht zu erkennen. 13 In the seemingly unnoticed article [Ant90], Antonov describes, unfortunately in partly very difficult to understand and sometimes not unambiguously interpretable English, a "regular architecture" which, despite its formal presentation, comes very close to the core idea of the architecture presented here However, there are further major differences in detail, such as the huge number of interface functions, the instantiation mechanisms, the built-in protection mechanisms, and possibly the number of interoperable generators "Outputs" per "block" (in all examples there is always only one output, a grammatically clear explicit reference to several "outputs" I could not find). Furthermore, Antonov lacks the replacement of file systems introduced here by dynamic hierarchical instantiation of building blocks; a distinction between different operating modes or operating models is also not apparent.

14Eine Ausnahme ist [Str78], wo Stroustrup die Unabhängigkeit und Austauschbarkeit der Implementierungsparadigmen von den Modulschnittstellen aufzeigt, und damit den Architekturbegriff ebenfalls weiter auffasst. Leider scheint dieser grundlegende Artikel wenig Beachtung in der Betriebssystem-Literatur gefunden zu haben, da auch Jahrzehnte später die Verwendung fester Implementierungsparadigmen immer noch zum Stand der Technik zu gehören scheint. 14 An exception is [Str78], where Stroustrup points out the independence and interchangeability of the implementation paradigms from the module interfaces, thus further understanding the architectural notion. Unfortunately, this basic article seems to have received little attention in operating system literature, as decades later the use of fixed implementation paradigms still seems to be state of the art.

15Dies gilt nur für Entwurfs-Entscheidungen, die innerhalb der hier vorgestellten Architektur offengelassen und daher parametrisierbar sind; auf der Ebene der Meta-Architektur selbst werden jedoch auch von mir feste Entscheidungen gefällt, die prinzipiell (wie auch bei bisherigen Architekturen) der oben genannten Kritik unterliegen und im Einzelfall weiterer Evaluation und ggf. einer Revision bedürfen. 15 This applies only to design decisions that are left open within the architecture presented here and therefore can be parameterized; However, at the level of the meta-architecture itself, I also make firm decisions that in principle (as with previous architectures) are subject to the above-mentioned criticism and in individual cases require further evaluation and, if necessary, a revision.

16Dieser Begriff wird in der Praxis meist mit der Objektorientierung verknüpft (vgl. z.B. [JH02, S. 273]: „Frameworks stellen komplexe, partielle Programme dar, deren Instantiierung zu einer Applikation ohne Vererbung nicht denkbar wäre"), bis hin zur Bezeichnung einer konkreten Implementierung einer Sammlung von abstrakten Basisklassen, und könnte daher zu Missverständnissen führen. Eigentlich würde der Begriff Framework gut auf die hier vorgestellte Architektur passen, wenn er nicht bereits auf die zitierte Art eingeschränkt wäre. Eventuell wäre es sinnvoll, über eine Erweiterung dieses Begriffs nachzudenken; darüber sollte jedoch ein weitgehender Konsens erzielt werden. 16 In practice, this term is usually associated with object orientation (cf., eg, [JH02, p. 273]: "Frameworks are complex, partial programs whose instantiation to an application without inheritance would be inconceivable"), right through to designation Thus, the term framework would fit well with the architecture presented here, if it were not already restricted in the manner cited, and it might make sense to expand on that term However, a broad consensus should be reached on this.

17Zum aktuellen Diskurs zwischen Broy/Sindersleben [BS02] und Jähnichen/Herrman [JH02] über Wesen, Vor- und Nachteile der Objektorientierung, insbesondere zum Zusammenhang zwischen Komponenten und Objektorientierung, kann die vorliegende Arbeit eine Erweiterung der Perspektive beitragen. Man könnte die hier vorgestellte Architektur ohne weiteres als Komponenten-Architektur bezeichnen, obwohl sie nicht unbedingt auf der Objektorientierung aufbaut und damit von der vorherrschenden Meinung in dieser Hinsicht abweicht. Wie in Abschnitt 6.2 gezeigt wird, wird objektorientierte Vererbung von der hier vorgestellten Architektur ermöglicht, aber nicht zur zwingenden Voraussetzung erhoben. Ich habe in den Beispielen des Kapitels 4 besonderen Wert darauf gelegt, die Grundfunktionalität eines Betriebssystems möglichst nur mit Hilfe kompositorischer Generizität zu realisieren und Erweiterungs-Generizität praktisch vollständig zu vermeiden. Damit existiert ein Beispiel, das eine Komponenten-Architektur ohne feste Verknüpfung mit einer wesentlichen Grundidee der Objektorientierung (egal ob man sie nun mit „Vererbung" oder als Spezialfall einer „Delegation" bezeichnet) realisiert. Damit dürfte genügend Substanz zur Erhärtung der These vorgebracht worden sein, dass Komponenten-Architekturen als weitgehend orthogonal zur Anwendung spezifisch objektorientierter Entwurfs-Methoden betrachtet werden können. Eine solche Betrachtung hängt allerdings von der Definition von „Objektorientierung" ab; je nach Geschmack oder Herkunft aus einer bestimmten Schule kann man die jeweiligen Begriffe so definieren, dass Objektorientierung einen Oberbegriff darstellt, unter den auch Komponenten-Achitekturen als ergänzende Anwendung des Prinzips der kompositorischen Generizität fallen, oder genau umgekehrt, oder dass zwei zueinander orthogonale Begriffe entstehen. Ich plädiere aus Gründen der methodischen Sparsamkeit für die dritte Variante. 17 On the current discourse between Broy / Sindersleben [BS02] and Jähnichen / Herrman [JH02] on the nature, advantages and disadvantages of object orientation, in particular the connection between components and object orientation, the present work can contribute to broadening the perspective. One could simply call the architecture presented here a component architecture, although it does not necessarily build on the object orientation and thus deviates from the prevailing opinion in this regard. As shown in section 6.2, object-oriented inheritance is made possible by the architecture presented here, but not imposed as a mandatory requirement. In the examples in Chapter 4, I have emphasized the importance of realizing the basic functionality of an operating system only with the help of generosity of composition and avoiding extensiveness of generosity almost completely. Thus, there is an example that realizes a component architecture without a fixed link to a fundamental idea of object orientation (no matter whether you call it "inheritance" or a special case of "delegation"). Thus, sufficient substance has been put forward to support the thesis that component architectures are largely orthogonal to the application of object-oriented Ent throwing methods can be considered. However, such consideration depends on the definition of "object orientation," and depending on the taste or origin of a particular school, one can define the terms in such a way that object orientation is a generic term, including component architectures as a complementary application of the principle of compositional Genericity fall, or vice versa, or that two mutually orthogonal concepts arise.I argue for reasons of methodological thrift for the third variant.

18Vgl. [Szy98, Abschnitt 4.1.8]. Das vermutete Phänomen „maximizing reuse minimizes use" scheint mir auf der impliziten Annahme von Erweiterungs-Generität als Maximierungs-Strategie über Komponenten-Grenzen hinweg zu beruhen; dieses Phänomen wird durch das Konzept der kompositorischen Generizität und der universellen Generizität in sein Gegenteil verkehrt. 18 Cf. [Szy98, Section 4.1.8]. The supposed phenomenon of "maximizing reuse minimizes use" seems to me to be based on the implicit assumption of extension-generation as a maximization strategy across component boundaries, a phenomenon that is reversed by the concept of generational generationality and universal genericity.

19Szyperski [Szy98] betont mehrmals (Abschnitte 1.5, 4.1.1), dass die Instantiierung von Komponenten wegen der Statuslosigkeit sinnlos wäre. Im Unterschied dazu haben beispielsweise mehrfache Instanzen von dir_*-Bausteinen durchaus Sinn, da es durchaus auf die Stellung in einer Baustein-Hierachie bzw. auf den Verdrahtungs-Kontext ankommt. 19 Szyperski [Szy98] emphasizes several times (Sections 1.5, 4.1.1) that the instantiation of components would be pointless because of statelessness. In contrast to this, multiple instances of you _ * blocks, for example, make perfect sense, since the position in a block hierachy or the wiring context definitely matters.

20Eine ähnliche Auffassung vertritt Parnas in [Par78]. 20 A similar view is made by Parnas in [Par78].

21Hiervon unabhängig sind wiederum die Warte-Strategien mehrerer eintrittswilliger Prozesse wie beispielsweise die FIFO-Strategie (als interessantes Realisierungsbeispiel hierzu siehe [RK79]). 21 Independent of this, again, are the waiting strategies of several processes willing to enter such as the FIFO strategy (as an interesting implementation example, see [RK79]).

22In der Praxis ist dieser Vorsatz nicht immer konsistent durchzuhalten, vor allem in größeren Projekten mit vielen Beteiligten, die unterschiedliche Interessen verfolgen. So könnte es beispielsweise vorkommen, dass eine Interessengruppe die Programmiersprache Ada bevorzugt, die andere die Sprache C (Argumente für die jeweiligen Positionen sind sattsam bekannt: Ohne Zweifel ist Ada die sicherere, produktivere und wartungsärmere Sprache, der Großteil bereits existierender und ausgetesteter Software ist jedoch in C oder C++ geschrieben, zu der unbedingt Kompatibilität zu wahren ist). Prinzipiell lässt sich die hier vorgestellte Architektur nicht nur einheitlich in einer der beiden Sprachen realisieren, sondern auch bausteinweise in beliebigen Mischungen, sofern die Aufruf-Konventionen der jeweiligen Sprachen und Compiler zueinander kompatibel sind. Da dies nicht nur die Redundanz, sondern auch den Integrationsaufwand und mögliche Fehlerquellen erhöhen kann, sollte dies möglichst vermieden, auf jeden Fall aber sehr gut überlegt und begründet werden. 22 In practice, this intent is not always consistent, especially in larger projects involving many stakeholders with different interests. For example, one interest group might prefer the programming language Ada, the other the language C (Arguments for the respective positions are well known: Without a doubt, Ada is the safer, more productive and less serviceable language, but the majority of already existing and tested software is written in C or C ++, which must be compatible). In principle, the architecture presented here can not only be implemented uniformly in one of the two languages, but also block by block in arbitrary mixtures, provided the calling conventions of the respective languages and compilers are compatible with one another. Since this can increase not only the redundancy, but also the integration effort and possible sources of error, this should be avoided as far as possible, but in any case very well thought out and justified.

23Wie [Mey88] und viele andere Autoren bemerken, verlaufen die Haupt-Auseinandersetzungen um Strukturierungs-Kriterien hauptsächlich entlang der Demarkations-Linien „Strukturierung nach Daten" versus „Strukturierung nach Kontrollfluss" (vgl. [Par72]). Die von mir propagierte Strukturierung nach Verantwortungsbereichen nimmt demgegenüber eine übergeordnete Perspektive ein: Verantwortung ist fast immer an Datenstrukturierung und nur selten an Kontrollflüsse gekoppelt. Die Abstraktionsebene ist jedoch von konkreten Datenstrukturen abgekoppelt: bei hoher Abstraktionsebene kann sich Verantwortung auf Mengen von Datenstrukturen erstecken, im anderen Extrem aber auch bis auf Teil-Datenstrukturen verfeinert werden. 23 As [Mey88] and many other authors note, the main arguments about structuring criteria are mainly along the demarcation lines "structuring by data" versus "structuring by control flow" (see [Par72]). By contrast, the structuring of areas of responsibility that I propagate takes on a higher-level perspective: responsibility is almost always linked to data structuring and only rarely to control flows. The level of abstraction, however, is decoupled from concrete data structures: at a high level of abstraction, responsibility can extend to sets of data structures, but at the other extreme, they can be refined down to partial data structures.

24Heute wird unter Prozess meist ein in Ausführung befindliches Programm verstanden, das eine Menge von Ressourcen allokiert hat und mindestens einen Kontrollfluss (thread) besitzt. In den 1960er und 1970er Jahren waren teilweise noch einfachere Definitionen üblich, die mit dem heutigen Begriff des Kontrollflusses (thread) zusammenfallen. 24 Today, process is usually understood as a program in progress that has allocated a set of resources and has at least one thread of control. In the 1960s and 1970s were sometimes even simpler definitions common, coinciding with the current term of the control thread (thread).

25Es muß nicht unbedingt ein tatsächlich neuer Kontrollfluss im physischen Sinne entstehen: Bei der Implementierung von Bausteinen als Server-Prozesse (vgl. [Han70, Hoa78]) bleibt die Anzahl physischer Kontrollflüsse im Regelfall konstant. Die im Nachrichtensystem gepufferte Nachricht stellt im logischen Sinne einen logischen Kontrollfluss dar, der von einem physischen Kontrollfluss simuliert wird, sobald die Nachricht bearbeitet wird. Solche Systeme sind für den Fall gebaut, dass mehr logische als physische Kontrollflüsse auftreten können, und beschränken daher die theoretisch mögliche maximale Parallelität auf künstliche Weise. Falls jedoch genügend physische Kontrollflüsse vorhanden wären, um alle eingehenden Nachrichten eines Bausteins sofort bearbeiten zu können, wäre die Pufferung von Nachrichten überflüssig. In der Praxis ist die Bevorratung von Kontrollflüssen mit hohem Overhead verbunden; wenn man deswegen die Bevorratung von Kontrollflüssen durch dynamische Erzeugung und Destruktion von Kontrollflüssen (vgl. historisches Beispiel [Op165]) ersetzt, landet man wieder beim allgemeinen asynchronen Modell, dessen Parallelitätsgrad theoretisch nicht beschränkt ist. 25 There is no need to create a new control flow in the physical sense: When implementing building blocks as server processes (see [Han70, Hoa78]), the number of physical control flows usually remains constant. The message buffered in the message system logically represents a logical control flow that is simulated by a physical control flow as the message is processed. Such systems are built in the event that more logical than physical control flows can occur, and thus artificially restrict the theoretically possible maximum parallelism. However, if there were enough physical control flows to process all incoming messages from a block immediately, buffering of messages would be superfluous. In practice, the stocking of control flows is associated with high overhead; If, therefore, the supply of control fluxes is replaced by the dynamic generation and destruction of control flows (see historical example [Op165]), one returns to the general asynchronous model, whose degree of parallelism is theoretically not limited.

26Mittels Code-Generierung, wie sie z.B. bei Java bei der Umsetzung von Byte-Code in Zielplattform-Maschinencode eingesetzt wird, kann man prinzipiell auch die Bindung von Prozeduraufrufen zu allen genannten Mechanismen zur Laufzeit durchführen. Es wäre ein interessantes Forschungsprojekt, dies nicht nur aus dem Quelltext oder aus Zwischencode-Darstellungen heraus, sondern auch aus bereits vollständig compiliertem Code heraus (der ggf. Zusatzinformationen enthalten müsste) zu bewerkstelligen. 26 By means of code generation, as with Java, for example, when converting bytecode to targetplate In principle, it is also possible to bind procedure calls to all the mechanisms mentioned at runtime. It would be an interesting research project to do this not only from the source code or from intermediate code representations, but also from already fully compiled code (which might have to contain additional information).

27Auch im singleuser-Modell (Abschnitt 3.2) können asynchrone Kontrollflüsse durch notify_*-Operationen (Kapitel 5) entstehen. 27 Even in the single-user model (Section 3.2), asynchronous control flows can result from notify _ * operations (Chapter 5).

28Falls man_code_nolock mit (L)RPC kombiniert, braucht man selbstverständlich keine Lock-Operationen einzufügen, da es dann ja nur einen einzigen (automatisch eingefügten und bei der Initialisierung gestarteten) Kontrollfluss gibt; durch einheitliche Verwendung dieser Konfiguration bei allen Bausteinen erhält man das klassische CSP-Modell, das zu Zwecken der Fehlersuche und -Eingrenzung deutliche Vorteile bringt, ansonsten aber die potentielle Parallelität unnötig einschränkt. Die Kombination von code_reentrant mit (L)RCP stellt insofern eine gewisse Verschwendung dar. 28 If man_code_nolock with (L) RPC combined, you need of course no lock operations insert as it then yes but one are (automatically inserted and during initialization started) control flow; Consistent use of this configuration across all building blocks provides the classic CSP model, which provides significant benefits for debugging and confinement, but otherwise unnecessarily restricts potential parallelism. The combination of code_reentrant with (L) RCP represents a certain amount of waste.

29Hierbei (interne) Bezeichner (bzw. zu internen Bezeichnern werdende ursprünglich öffentliche Bezeichner) mit einem Versions-Kennzeichen zu verändern, um die mehrfache Instantiierung desselben Baustein-Typs in einem Kombi-Baustein möglich zu machen. Details werden in dieser Arbeit nicht behandelt. 29 Change (internal) identifiers (or original public identifiers to internal identifiers) with a version identifier in order to enable multiple instantiation of the same component type in a combo module. Details are not covered in this work.

30Ob und in welchen Fällen Untermandate vorteilhafte Beschreibungen darstellen, dürfte eine interessante zu untersuchende Frage sein. Strukturell sind Untermandate zwar ähnlich zu Gruppen von Subjekten, die Erzeugung von Untermandaten kann jedoch rein dynamisch zur Laufzeit geschehen, die wiederum in weitere Untermandate zersplittert werden könnten. Ob und wie weit solche Modelle vorhersagbares und intuitiv für Menschen leicht begreifbares Verhalten zeigen, muss noch untersucht werden.Represent 30 whether and in which cases under mandates advantageous descriptions, probably to be examined an interesting question. Structurally, sub mandates are similar to groups of subjects, but submandate creation can be done dynamically at runtime, which in turn could be fragmented into more subordinates. Whether and to what extent such models are predictable and intuitively easy to understand for humans has yet to be investigated.

31Nach Maßstäben sind hierzu mindestens 64 Bit reservierter Platz erforderlich. 31 After standards are necessary for that purpose at least 64 bits reserved space.

32Das klassische Konzept der Rechte-Tabellen läßt sich als Spezialfall einer Schutzmenge darstellen:
man bilde die Menge aller Tripel (op,subject,object), die durch eine Subjekt-Objekt-Zuordnungstabelle beschrieben wird, und fülle gegebenenfalls durch die Tablle nicht beschriebene weitere Parameter-Komponenten der Operationen mit der Menge aller möglichen Werte auf.
32 The classical concept of the rights tables can be described as a special case of a protected set:
Form the set of all triples (op, subject, object) described by a subject-object mapping table and fill in any further parameter components of the operations with the set of all possible values, which may not be described by the tableau.

33In neuerer Zeit haben Performanz-Fragen ein erhöhtes Interesse in der Literatur gefunden. Trotz des Bemühens um Vergleichbarkeit verschiedener Architekturen und Vorschläge ist diese nicht immer gegeben; das Stichwort des Vergleiches zwischen Äpfeln und Birnen findet sich nicht nur in [Lie95b]. 33 In recent times, performance issues have found increased interest in the literature. Despite the efforts to compare different architectures and proposals, this is not always the case; the keyword of the comparison between apples and pears is found not only in [Lie95b].

34Missachtung kann jedoch teilweise erhebliche Einbußen bei der Performanz nach sich ziehen. Wenn es dagegen auf schnelle Implementierung neuer Funktionalität ankommt, ermöglicht das Weglassen von Bündeln sogenanntes „rapid prototyping". However, disrespect can sometimes lead to considerable performance losses. On the other hand, if fast implementation of new functionality is required, the omission of bundles allows so-called "rapid prototyping".

35Noch größere logische Adressräume, etwa mit 128 Bit oder mehr, haben durchaus praktische Anwendungen: das bekannte Segmentierungs-Modell (vgl. Mullics [Org72] oder die Speichermodelle von Intel-Prozessoren) läßt sich durch einen linearen logischen Adressraum darstellen, indem man ein (Segmentselektor, Offset)-Paar bildet, das insgesamt als logische Adresse eines (löchrigen) linearen Adressraums interpretiert wird. Wenn der Segmentselektor beispielsweise 64 Bit und der Offset ebenfalls 64 Bit umfasst, dann reicht ein logischer Adressraum von 128 Bit für eine äquivalente Darstellung des Segmentierungs-Modells durch den linearen Adressraum (vgl. auch das Thunk-Modell von Microsoft beim Übergang vom 16Bit-MSDOS-Speichermodell auf 32 Bit). 35 yet larger logical address spaces, such as 128-bit or more, well have practical applications: the well-known segmentation model (. See Mullics [Org72] or the memory models of Intel processors) can be achieved by a linear logical address space represented by a (Segment selector, offset) pair, which is interpreted as the logical address of a (holey) linear address space. For example, if the segment selector is 64-bit and the offset is 64-bit, then a 128-bit logical address space will suffice for an equivalent representation of the segmentation model through the linear address space (see also the Microsoft Thunk model for the 16-bit MSDOS transition Memory model to 32 bits).

36In früheren Zeiten war der Begriff Byte mehrdeutig, da er auch andere Bitfolgen als das Oktett bezeichnen konnte. Der Begriff ist inzwischen standardisiert und bezeichnet genau 8 Bit. 36 In the old days, the term byte was ambiguous, as it could denote sequences of bits other than the octet. The term is now standardized and denotes exactly 8 bits.

37Zum besseren Verständnis kann man hilfsweise den Begriff der „Folge von Operations-Aufrufen" einführen. Dann ist die Folge der Operations-Ausführungen eine Permutation der Folge der Operations-Aufrufe, die folgende weitere Bedingung erfüllt: wenn man die beiden Folgen zu einer gemeinsamen Folge vereinigt, dann liegt jeder ursprüngliche Operations-Aufruf vor seiner zugehörigen Operations-Ausführung. Dieses Modell ist jedoch nur als Hilfskonstrukt zum besseren Verständnis zu verwenden. Realiter braucht man den Begriff der Folge von Operations-Aufrufen nicht einzuführen, sondern es genügt, von Operations-Aufrufen schlechthin zu sprechen, ohne dass diese in eine Folge gebracht werden müssen. Der Grund hierfür ist nicht, weil das Herstellen dieser Folge insbesondere in verteilten Systemen gewisse bekannte Schwierigkeiten macht (vgl: [AW94]), sondern weil man es zur Beschreibung der Semantik eines rein asynchronen Modells nicht benötigt. 37 For better understanding, one may alternatively introduce the notion of "sequence of operation calls." Then the sequence of operations is a permutation of the sequence of operation calls satisfying the following condition: if the two sequences become one Following this, each original op call comes before its associated operation execution, but this model is to be used only as an aid construct for better understanding.realiter, one does not need to introduce the notion of sequence of ops invocations, but suffice to say of operations The reason for this is not because making this sequence makes certain known difficulties, especially in distributed systems (cf. [AW94]), but because it is not needed to describe the semantics of a purely asynchronous model.

38Im Gegensatz zum Konsistenzmodell der Linearisierbarkeit wird hier nicht eine spezielle Speicher-Semantik unterstellt, denen die Lese- und Schreiboperationen unbedingt gehorchen müssen. Weiter unten werden beispielsweise Lese-Operationen behandelt, die ausdrücklick die Auslieferung veralteter Versionen zulassen und daher im konventionellen Modell der Linearisierbarkeit nicht enthalten sind. 38 In contrast to the consistency model of linearizability is not subject to a special memory semantics here, which must necessarily obey the read and write operations. Below, for example, read operations are treated which expressly permit the delivery of obsolete versions and are therefore not included in the conventional model of linearizability.

37Im ist die Disjunktheit der betroffenen Adressbereiche für die Kommutation von Operations-Ausführungen hinreichend, aber nicht notwendig. So genannte „semantische Modelle" versuchen, die Auswirkungen normalerweise nicht kommutierbarer Operationen nachträglich so zu interpretieren oder zu korrigieren, dass im Sinne irgendwelcher semantischer Anforderungen oder Bedingungen ein „korrektes" Ergebnis herauskommt. Ein derartiger Korrektheitsbegriff muß nicht notwendigerweise in allen möglichen Ausführungsfolgen den geleichen Endzustand erreichen. In Abgrenzung zum Kommutierbarkeits-Begriff möchte ich dies Quasi-Kommutierbarkeit nennen. 37 Im the disjointness of the affected address ranges is sufficient for the commutation of operations executions, but not necessary. So-called "semantic models" try to subsequently interpret or correct the effects of normally non-commutatable operations in such a way that a "correct" result emerges in the sense of any semantic requirements or conditions. Such a correctness concept does not necessarily have to reach the same end state in all possible execution sequences. In contrast to the concept of commutability, I would like to call this quasi-commutability.

40Der lokal bezieht sich hierbei auf eine Eigenschaft des Nestes, nämlich seinen Adressbereich, und nicht auf eine bestimmte physische Verteilung auf Rechnerknoten oder dergleichen. 40 The local refers to a property of the nest, namely its address range, and not to a specific physical distribution on computer nodes or the like.

41Dieser Begriff soll zur Unterscheidung von den Begriffen Determiniertheit und Determinismus dienen. Ich verwende den Begriff Nichtdeterminismus nicht, da sein Gegenteil, der Determinismus, in einem asynchronen Modell nicht auftritt (bzw. nur als Spezialfall auftritt). Determiniertheit ist auch nicht gegeben, weil i.a. die Reihenfolge der Ausführung mehrerer paralleler Operationen nicht fest liegt. Determinanz ist ein Begriff, der eine Zwischenstufe zwischen Determinismus und Nichtdeterminismus ausdrücken soll: es entsteht zwar eine „deterministische" Folge der voneinander funktional abhängigen Zustände, doch diese Entstehung geschieht auf nichtdeterministische Weise aus Operations-Aufrufen, für die keine Ordnung voraus gesetzt wird. 41 This term is intended to distinguish the terms determinism and determinism. I do not use the term nondeterminism, because its opposite, determinism, does not occur in an asynchronous model (or occurs only as a special case). Determination is also not given because in general the order of execution of several parallel operations is not fixed. Determinacy is a term used to express an intermediate level between determinism and nondeterminism: while creating a "deterministic" sequence of mutually functionally dependent states, this emergence occurs nondeterministically from operations calls for which order is not preceded.

42Die einzelnen Elementaroperationen müssen natürlich trotzdem die „Korrektheit" oder besser die „Validität" auf ihrer jeweiligen Abstraktionsebene bzw. Zugriffs-Granularität erfüllen. 42 The individual elementary operations must of course still better meet the "correctness" or the "validity" on their respective level of abstraction or access granularity.

43Die der Nester gibt jedenfalls keine Zusicherungen über „Korrektheit", sondern höchstens über die (Nicht-)Kommutierbarkeit von Elementaroperationen. Den Aufrufern wird überlassen; welche Semantik sie implementieren wollen; dabei dürfen und sollen sie sich jedoch auf die Zusicherungen der Nest-Implementierung abstützen. In any case, the nests do not give assurances about "correctness", but at most about the (non-) commutability of elementary operations, leaving the callers to decide what semantics they want to implement, while allowing and relying on the assertions of the nest implementation support.

44Neuere Buffer-Caches wie beispielsweise [PDZ99] vereinheitlichen zwar das Caching in einem System auf ähnliche Weise wie hier, führen jedoch ihre eigene Schnittstelle ein. Im Gegensatz dazu verlangt das Prinzip der universellen Generizität (Abschnitt 2.1.4), dass die Nest-Schnittstelle nicht verändert wird, wenn Caching irgendwo eingeführt oder nicht mehr benutzt wird. 44 Newer buffer caches, such as [PDZ99], although unifying caching in a system in a similar way as here, introduce their own interface. In contrast, the principle of universal genericity (Section 2.1.4) requires that the nesting interface is not altered when caching is introduced or discontinued.

45In historischen Entwicklung erfolgreicher Betriebssystem-Kerne wie der UNIX-Familie wurden immer wieder so genannte „Balkone" an die vorhandenen Konzepte angebaut, um mit geänderten und erweiterten Anforderungen Schritt halten zu können. Balkone widersprechen der Forderung nach möglichst geringer Redundanz eines Entwurfs. Die hier vorgeschlagenen Schnittstellen-Konzepte und Abstraktionen versuchen das Ideal von universeller Generizität anzunähern, um auch zukünftige unvorhersehbare Anforderungen mit etwas Glück ohne Balkone nachrüsten zu können. 45 In the historical development of successful operating system kernels such as the UNIX family, so-called "balconies" have been continually added to the existing concepts in order to keep up with changed and extended requirements, while balconies contradict the demand for the lowest possible redundancy of a design Proposed interface concepts and abstractions try to approximate the ideal of universal genericity in order to be able to retrofit future unpredictable requirements with a little luck without balconies.

46Falls fortgeschrittene Konzepte der Implementierung von Datenbank-Systemen [HR01] nicht ausreichend berücksichtigt sein sollten, darin hoffe ich, dass sich diese Mechanismen ebenfalls in die vorgestellte Architektur mit geringem Aufwand integrieren lassen. 46 If advanced concepts of implementing database systems [HR01] are not sufficiently considered, I hope that these mechanisms can also be integrated into the presented architecture with little effort.

47Dies auch für die bekannte Multiprozessor-Problematik (SMP) und die bisher durch Unterbrechungs-Sperren gelösten Synchronisationsprobleme, die durch geeignet implementierte Elementaroperationen lock und unlock lösbar sind, sofern man Unterbrechungen als vollwertige Kontrollflüsse implementiert (vgl. [KE95]). 47 This also applies to the well-known multiprocessor problem (SMP) and the synchronization problems solved by interrupt locks, which can be solved by suitably implemented elementary operations lock and unlock, provided that interrupts are implemented as fully valid control flows (see [KE95]).

48Umgekehrt wird jedoch ebenfalls nicht garantiert, dass kein Alias entsteht. 48 Conversely, however, also does not guarantee that no alias is created.

49Dies ist in Verteilten Systemen im allgemeinen schlicht unmöglich. 49 In general this is simply impossible in distributed systems.

50Interferenzen brauchen nicht generell zu entstehen; beispielsweise könnten externe Absprachen zwischen mehreren Schreibern bestehen, dass diese nur auf zueinander disjunkte Bereiche eines physischen Datenblocks ändernd zugreifen; ein typischer Anwendungsfall dafür ist z.B. ein Nachrichtenpuffer zur wechselseitigen Publikation von irgendwelchen Status-Informationen, die keinen Einfluss auf die Korrektheit haben, sondern z.B. zur Lastbalancierung genutzt werden. Die hier vorgestellte Architektur möchte die Lösung von Interferenz-Problemen durch Baustein-Implementierungen ermöglichen und unterstützen, aber nicht erzwingen, insbesondere denjenigen Implementierern keine Hemmschuhe in den Weg legen, die „wissen was sie tun" und die nicht für Performanz-Overhead durch höherwertige Zusicherungen bezahlen möchten. Im übrigen lassen sich höherwertige Zusicherungen jederzeit durch geeignete Bausteine nachrüsten. 50 Interferences do not generally need to be created; for example, external collusion between multiple writers that they only access mutually disjoint areas of a physical data block; A typical application for this is, for example, a message buffer for the mutual publication of any status information that has no influence on the correctness, but is used, for example, for load balancing. The architecture presented here seeks to enable and support, but not enforce, the solution of interference problems through building block implementations, especially those implementers who "know what they are doing" and not for performance overhead through higher level assurances Incidentally, higher-quality assurances can be retrofitted at any time using suitable modules.

51Interferenzen sind auch zwischen Nur-Lesern und einem Schreiber möglich. Die Nest-Implementierung übernimmt dafür keine Verantwortung. In Abschnitt 3.3.5 wird beschrieben, wie Baustein-Implementierungen durch Locks für die Vermeidung von Interferenzen sorgen können. 51 Interference is also possible between read-only readers and a writer. The Nest implementation does not take responsibility for this. Section 3.3.5 describes how block implementations through locks can help prevent interference.

52Bei Betriebssystem-Schnittstellen wird zwischen den Locking-Arten mandatory und advisory unterschieden. Die hier verwendeten Locks gehören zu keiner dieser beiden Arten. Es wird zwar ähnlich wie beim advisory locking niemand gezwungen, Locks zu verwenden; falls jedoch eine Aufrufer-Instanz einen Lock erhält, dann wird seine Einhaltung auch zugesichert, und zwar auch dann, wenn sich andere Instanzen „nicht an die Regeln halten". Im Gegensatz zum advisory locking wird eine Umgehung des Locks durch nicht-konformes Verhalten anderer Instanzen verhindert. 52 For operating system interfaces between the locking kinds mandatory and advisory distinction is. The locks used here belong to neither of these two types. Although similar to the advisory locking nobody is forced to use locks; however, if a caller instance gets a lock then its compliance is also guaranteed, even if other instances "do not follow the rules." Unlike advisory locking, the lock is bypassed by non-conforming behavior of others Instances prevented.

53Vgl. Semantik von File-Locking in neueren Unix-Abkömmlingen [Vah96], die sowohl die Semantik von Mutex-Semaphoren als auch von read/write-Locks aus der Datenbank-Welt als Spezialfall umfasst 53 Cf. Semantics of File-Locking in Newer Unix Descendants [Vah96], which includes both the semantics of mutex semaphores and of read / write locks from the database world as a special case

54Im Fachgebiet der Datenbanken wird diese Eigenschaft als repeatable read bezeichnet. 54 In the domain of databases this property is called repeatable read.

55Falls mehrere Instanzen jeweils einen erfolgreichen Read-Lock auf derselben Version halten, dann kann nur eine einzige von ihnen diesen erfolgreich in einen Write-Lock umwandeln, da ansonsten der Schutz gegen Modifikation durch andere Instanzen (repeatable read) verloren gehen müsste. Bei klassischen Transaktionen stört dies nicht grundlegend, da die anderen Transaktionen, die dies ebenfalls versuchen, einfach mittels Rollback abgebrochen werden. Ausserhalb von Transaktionen besteht jedoch das Problem, dass ein Update auf die neueste Version nicht durch Transaktions-Abbruch erfolgen kann, sondern „von Hand" erledigt werden muss (i.d.R. durch Freigabe des inzwischen veralteten Read-Locks, erneutem Lock und transfer im read-Modus). Wer diesen Modus einsetzt, muss also damit rechnen, dass er nicht immer funktioniert, weil es genau genommen eine Spekulation darstellt, bei der darauf spekuliert wird, dass niemand ausser der eigenen Instanz eine Modifikation der gesperrten Daten vornehmen wird. Diese Spekulation lässt sich sicherlich auch ausserhalb von Transaktionen vorteilhaft zur Erhöhung der potentiellen Parallelität einsetzen, dies wird jedoch durch erhöhte Komplexität der Programm-Logik erkauft. 55 If each successful read lock hold multiple instances of the same version, then only one of them convert this success into a write lock, otherwise would have lost the protection against modification by other instances (repeatable read). This does not fundamentally interfere with traditional transactions as the other transactions that try to do so are simply rolled back. Outside of transactions, however, there is the problem that an update to the latest version can not be done through transaction abort, but must be done "by hand" (usually by releasing the now outdated read-lock, re-lock and transfer in read mode Anyone using this mode must therefore reckon with the fact that it does not always work because, in fact, it is a speculation that speculates that no-one other than himself will modify the blocked data certainly also outside of transactions advantageous to increase the potential parallelism, but this is paid for by increased complexity of the program logic.

56Andernfalls stellt es einen (ggf. erkennbaren und per Fehlercode sanktionierbaren) Fehler dar. 56 Otherwise, it is a (possibly recognizable and sanctionable by error code) errors.

57Ein so genannter „Wraparound" des zirkulären Puffers läßt sich auch durch Einschieben einer move-Operation vermeiden, sobald der Platz am Ende des Puffers nicht mehr reicht. 57 A so-called "wraparound" of the circular buffer can also be avoided by inserting a move operation as soon as the space at the end of the buffer is no longer sufficient.

58Getrennte Adressbekanntgabe ermöglicht u.a. eine einfache Lösung für ein Problem, das insbesondere bei Unix zu einer Aufblähung der Systemschnittstellen geführt hat: wenn ein Konsument unter Unix wissen möchte, ob Daten an einem IO-Kanal anliegen, kann er dies mit Hilfe der Systemaufrufe select bzw poll erfahren; i.a. kann er jedoch nicht die Größe der Daten erfahren; eine Ausnahme ist lediglich die Socket-Schnittstelle, die Lookahead auf Datenpakete unter gewissen Umständen ermöglicht. Diese historisch später nachgerüstete Funktionalität zeigt ein offenbar vorhandenes Bedürfnis nach dieser Funktionalität auf. 58 Separate address announcement enables, among other things, a simple solution to a problem that has led to a bloat in the system interfaces, especially in Unix: if a consumer wants to know under Unix, if data is present at an IO channel, he can do so with the help of the system calls select resp poll; generally, however, he can not know the size of the data; The only exception is the socket interface, which allows Lookahead to access data packets under certain circumstances. This historically later upgraded functionality reveals an apparent need for this functionality.

Man kann unter Unix nicht ohne weiteres Daten „auf Verdacht" oder mehrmals inspizieren (Lookahead), um dann aufgrund ihres Inhaltes zu entscheiden, ob man sie wirklich „konsumieren" oder zur Verarbeitung durch eine andere Instanz im Puffer belassen will. Dass eine solche Funktionalität auch auf regulären Dateien und Pipes gebraucht wird, ist daran zu sehen, dass sie in der Standard-Benutzerbibliothek libc teilweise angeboten wird. Wenn diese Funktionalität nicht erst dort simuliert würde, sondern bereits im Kern integriert wäre, dann würden gewisse durch die doppelte Pufferung im Kern und Benutzer-Adressraum bedingte Anomalien nicht auftreten. Dazu gehört beispielsweise, dass ein Lookahead nicht zwischen verschiedenen Prozessen funktioniert, die aus der gleichen Pipe lesen wollen.you Unix can not readily inspect data "on suspicion" or several times under Unix (Lookahead), to then decide on the basis of their content you really "consume" them or process them wants to leave it in the buffer by another instance. That one functionality also on regular Files and pipes is needed to see that they are in the standard user library libc is offered in part. If this functionality would not be simulated there first, but already integrated in the core, then some would be through the double Buffering in the core and user address space does not cause conditional anomalies occur. This includes for example, that a lookahead is not between different Processes that want to read from the same pipe work.

59Die atomare Reservierung führt dies jedenfalls nicht selbsttätig aus. Es ist Sache des Aufrufers, wofür er den reservierten Bereich benutzt. 59 The atomic reserve not does this automatically anyway. It is up to the caller where for him the reserved area used.

60Beispielsweise zur Verwaltung von IO-Aufträgen für Festplatten-Gerätetreiber, wo Umordnungen der Reihenfolge zur Durchsatzsteigerung eingesetzt werden. 60 For example, to manage hard disk device driver IO jobs, where rearrangement order is used to increase throughput.

61so genannte Objekt-Caches lassen sich sehr einfach dadurch realisieren, dass man die Objekt-Größe als transfe_size benutzt. 61 so-called object caches can be realized very simply by using the object size as transfe_size.

62Mit get_map(s) sei das zu einem beliebigen Nest s gehörige adjungierte Nest notiert. Die n-fache Komposition der get_map-Funktion mit sich selbst sei mit get_mapn notiert. Dann gilt für n > 2: get_mapn(s) = get_mapn+1(s). Das dreifach adjungierte Nest beschreibt sich also selbst.With 62 get_map (s) is listed at an arbitrary nest s corresponding adjoint nest. The n-fold composition of the get_map function with itself is noted with get_map n . Then for n> 2: get_map n (s) = get_map n + 1 (s). The triple adjoint nest thus describes itself.

63Das von BSD stammende Socket-Konzept und seine Schnittstelle ist heute in praktisch allen bedeutenden Betriebssystemen realisiert, auch in den Betriebssystemen von Microsoft, in allen modernen Unix-Varianten, und ist selbst in neueren Versionen von IBM-Großrechner-Betriebssystemen nachgerüstet worden. Da Sockets je nach Modus und Umständen das Lesen von Paketen sowohl mit Beachtung der beim Schreiben vorgegebenen Paketgrenzen, als auch nach dem Unix-Paradigma mit aufgelösten Paketgrenzen als unabhängige Folge von Teilblöcken unterstützen und verlangen, kommen ernsthafte Betriebssystem-Entwürfe im Endeffekt nicht darum herum, beide Paradigmen zu unterstützen. Wenn man schon beide Paradigmen unterstützen muss, dann sollte dies auf einheitliche Weise, bei möglichst vielen Arten von Nestern und auf möglichst allen Ebenen geschehen. 63 Dating from BSD socket concept and its interface is now implemented in almost all operating systems, even in the operating systems of Microsoft, in all modern Unix variants, and has itself been upgraded in recent versions of IBM mainframe operating systems. Since sockets support and demand packet readings as both an independent subset of subblocks, depending on the mode and circumstances, both with respect to the packet boundaries specified in writing, and the Unix paradigm with resolved packet boundaries, serious operating system designs ultimately do not come around to support both paradigms. If you have to support both paradigms, then this should be done in a consistent way, in as many species of nests as possible, and at all possible levels.

64Dieser Mechanismus kann auch dazu dienen, File-Paradigmen aus anderen (meist älteren) Betriebssystemen nachzubilden, die nicht das Unix-Paradigma vom File als Folge von Bytes verfolgen. 64 This mechanism can also be used to file paradigms replicate from other (mostly older) operating systems that do not follow the Unix paradigm from the file as a sequence of bytes.

65In diesem Fall gilt bereits für n > 1: get_mapn(s) = get_mapn+1(s).Get_map n (s) = get_map n + 1 (s): 65 In this case already for n> first

66Eine Variante von move könnte den überdeckten Bereich des Zielgebietes in den gleichgroßen freigewordenen Bereich des Quellgebietes in einer einzigen atomaren Operation verschieben, so dass im Endeffekt eine An „Rotationsoperation" ohne jeglichen Verlust von Daten ausgeführt wird. Damit läßt sich insbesondere eine Vertauschung von Adressbereichen realisieren. Im Moment sehe ich für diese Variante nur geringe praktische Notwendigkeit, jedoch bildet diese Variante von move zusammen mit clear und delete eine Algebra von Operationen auf Adressräumen mit sehr schönen mathematischen Eigenschaften. 66 A variant of move could move the covered area of the target area into the equal-size vacant area of the source area in a single atomic operation, effectively effecting a "rotation operation" without any loss of data, in particular swapping address ranges At the moment I see little practical necessity for this variant, but this variant of move together with clear and delete forms an algebra of operations on address spaces with very nice mathematical properties.

67Würde man ∞ als zulässige Quell- und Ziel-Angaben für die Verschiebung einführen, könnte man damit nebenbei auch die Semantik von clear und delete erfüllen. 67 If you were to introduce ∞ as valid source and destination information for the shift to the semantics could so casually by clear and delete meeting.

68Dies hat hohe Ähnlichkeit mit einem Schichtenmodell. Ein reinrassiges Schichtenmodell läßt sich z.B. durch eine Kette von Baustein-Instanzen nachbilden. Im Unterschied zu Schichtenmodellen werden auch neben-läufige Hierarchien und graphenartige Strukturen unterstützt, die von einer Baumstruktur abweichen. Im Allgemeinen sind jedoch keine zyklischen Verdrahtungen erlaubt. 68 This is very similar to a layered model. For example, a purebred layer model can be modeled by a chain of building block instances. In contrast to layer models, secondary hierarchies and graph-like structures that deviate from a tree structure are also supported. Generally, however, no cyclic wiring is allowed.

69Wenn ein neu entwickelter Baustein im singleuser-Modus stabil läuft, dann kann er schrittweise bis zur multiversion-Kompetenz bzw. -Verhalten erweitert werden. 69 If a newly developed device runs stably in single-user mode, then it can be gradually extended to multiversion competence or behavior.

70Dies eine konzeptuell vereinfachende Darstellung. Konkrete Hardware besitzt oft eine innere Hierarchie, etwa Peripherie-Busse wie PCI oder Geräte-Busse wie SCSI. Zur Realisierung deren (Unter-)Treiber eignen sich prinzipiell ebenfalls die Abstraktionen Nest und Baustein, so dass der „eigentliche" Geräte-Treiber auch einen oder mehrere Eingänge haben kann, mit denen er an die weitere Unter-Treiber-Infrastruktur angeschlossen wird. Weiterhin möchte ich darauf hinweisen, dass sich auch Hardware-Konzepte wie Memory-Mapped-IO, Grafikkarten-Framebuffer und dergleichen leicht und effizient durch die Abstraktion der Nester darstellen lassen. 70 This is a conceptually simplistic presentation. Concrete hardware often has an internal hierarchy, such as peripheral buses such as PCI or device buses such as SCSI. In principle, the abstractions nest and building block are also suitable for the realization of their (sub-) drivers, so that the "actual" device driver can also have one or more inputs with which it is connected to the further sub-driver infrastructure I would like to point out that even hardware concepts such as Memory-Mapped-IO, graphics card framebuffer and the like can be easily and efficiently represented by the abstraction of the nests.

71Auf dem Gebiet der Storage Area Networks (SAN) könnte die Einführung multiuser-fähiger Treiber durchaus Vorteile bringen, insbesondere für höhere Redundanz und Ausfallsicherheit sorgen, eventuell auch die Last besser verteilen. Allerdings muss dazu das Verhalten der restlichen Komponenten der beteiligten Betriebssysteme mitspielen. 71 In the field of storage area networks (SAN) could be beneficial to introduce multi-user capable driver quite particular ensure higher redundancy and reliability, and possibly the load better distributed. However, the behavior of the remaining components of the participating operating systems must play a role.

72Eine Hardware-Architekturen wie z.B. die IBM z-Serie erlauben den Austausch von Speichermodulen zur Laufzeit. Dies lässt sich dadurch modellieren, dass der Urverwalter die Anzahl seiner Ressourcen ändert. Dazu muss er notfalls bereits vergebene Ressoucen wieder zurückfordern; siehe Kapitel 5. 72 Hardware architectures such as the IBM z-series allow the replacement of memory modules at runtime. This can be modeled by the fact that the primary administrator changes the number of resources changed. If necessary, he must reclaim already assigned resources; see chapter 5.

73Eine Verklemmung des Gesamtsystems durch im Normalbetrieb nicht zurückforderbare (quasi-persistente) Datenblöcke muss vermieden werden. Eine einfache Lösung dafür ist die Forderung, dass die Summe der Maximallängen aller device_ramdisk-Instanzen den verfügbaren Hauptspeicher nicht überschreiten darf. Alternativ dazu kann auch das Verfahren von Habermann [Hab69] angewandt werden, mit dem eine Überbuchung der vorhandenen Hauptspeicher-Ressourcen prinzipiell möglich ist (jedoch wegen des damit verbundenen Wartens unakzeptable Auswirkungen auf das von Benutzern erwartete Verhalten von interaktiven Anwendungen oder von Realzeit-Anwendungen haben kann). 73 It is important to avoid jamming of the entire system due to the (quasi-persistent) blocks of data which can not be reused in normal operation. A simple solution to this is the requirement that the sum of the maximum lengths of all device_ramdisk instances must not exceed the available main memory. Alternatively, the method of Habermann [Hab69] can be used, which in principle allows overbooking of existing main memory resources (but because of the associated waiting have unacceptable effects on the user-expected behavior of interactive applications or real-time applications can).

74Früher galt die Grundregel: je mehr Kapazität ein Peripheriegerät bereitstellt, desto langsamer ist es:
Zum Zeitpunkt der Niederschrift dieser Arbeit haben billige als Massenprodukte hergestellte Festplatten die 100-GByte-Grenze durchbrochen und damit die gleiche Größenordnung wie Bandlaufwerke erreicht (vielleicht noch mit Ausnahme weniger sehr teurer High-End-Modelle). Auch die Medienkosten pro GByte nähern sich langsam derselben Größenordnung. Ich erwarte, dass sich ähnliche Verschiebungen der momentan herrschenden Speicher-Hierarchien auch in Zukunft ereignen werden.
74 The basic rule was: the more capacity a peripheral provides, the slower it is:
At the time of writing this paper, cheap mass-produced hard drives broke through the 100-gigabyte limit, the same size as tape drives (perhaps with the exception of a few very expensive high-end models). The media costs per GB are also slowly approaching the same magnitude. I expect that similar shifts in the current memory hierarchies will continue in the future.

75Die von multiuser-Eingängen ist möglich, aber je nach gewählter interner Struktur u.U. aufwendig. Auch bei Client-Server-Anwendungen ist es sinnvoll, ein statisches Nest erst mittels map_* in ein dynamisches umzuwandeln, bevor es z.B. mittels remote exportiert wird. 75 The use of multiuser inputs is possible, but depending on the selected internal structure may be costly. Even with client-server applications, it makes sense to first transform a static nest into a dynamic one using map_ *, before it is exported, for example, remotely.

76Diese Erwartungshaltung ist bei genauer Betrachtung letztlich nur durch die Tatsache gerechtfertigt, dass die heutige Externspeicher-Technik, vor allem diejenige von Festplatten, schlechte Lokalitätseigenschaften aufgrund der mechanisch bewegten Teile besitzt (siehe auch die in der Literatur ausführlich diskutierte so genannte „Speicherlücke"). In absehbarer Zukunft werden hoch-kapazitive Externspeicher mit nicht nur deutlich höheren Datentransferraten und geringeren Latenzzeiten, sondern auch besseren Lokalitätseigenschaften zu konkurrenzfähigen Preisen verfügbar sein, beispielsweise holographische Speicher oder auf Magnet- oder Quanteneffekten beruhende hoch-kapazitive Halbleiterspeicher. Aus diesem Grund dürfte die Diskussion zur Behebung des Fragmentierungs-Problems nur begrenzte Bedeutung haben. 76 This expectation is ultimately justified on closer examination only by the fact that the current external memory technology, especially that of hard disks, poor locality properties due to the moving parts has (see also the discussion in the literature so-called "memory space") In the foreseeable future, high-capacity external memories will be available with not only much higher data transfer rates and lower latency, but also better locality characteristics at competitive prices, such as holographic memories or high-capacitive semiconductor memories based on magnetic or quantum effects have only limited relevance to the fragmentation problem.

77Hierunter fallen z.B. Verschiebungen um konstante Offsets, wie sie auf jeden Fall notwendig werden, wenn für die Übersetzungstabelle beispielsweise am Anfang des Eingangs-Nestes Platz reserviert wird. Ich möchte hier keine saubere mathematische Definition solcher Abbildungen geben, sondern eine Charakterisierung von Eigenschaften, die für den Architektur-Entwurf relevant sind. 77 This includes, for example, shifts by constant offsets, which are necessary in any case, if, for example, space is reserved for the translation table at the beginning of the entrance nest. I do not want to give a clean mathematical definition of such mappings, but a characterization of properties that are relevant to the architectural design.

78Unabhängig davon sollte map_simple_delta nur bei solchen Last-Charakteristiken angewandt werden, bei denen nur relativ selten Verschiebe-Operationen angefordert werden (was bei vielen Anwendungen durchaus erwartet werden kann), oder aber bei denen umgekehrt extrem häufige Verschiebungen, dafür aber nur relativ wenige Adress-Zugriffe vorkommen, so dass der Adressübersetzungs-Aufwand bei den amortisierten Kosten nur wenig ins Gewicht fällt. 78 Regardless thereof should map_simple_delta only when such a load characteristics are applied, where only relatively rare shift operations are required (which can be quite expected in many applications), or where conversely extremely frequent shifts, but only relatively few address Access, so that the address translation effort at the amortized cost is of little importance.

79Eine weitere Lösung, nämlich die Konsistenzprüfung nach Abstürzen, halte ich wegen ihrer schlechten Reparatur-Eigenschaften und vor allem wegen ihrer Komplexität für unpraktikabel (als Standard-Mittel zur Behebung der Effekte von Abstürzen; in absoluten Notsituationen sieht es dagegen anders aus). Die Komplexität einer Konsistenzprüfung kann wegen der möglichen Zersplitterung eines Nestes in sehr viele kleine Flicken nach Art eines Schweizerkäses sehr groß werden. 79 Another solution, Crash Consistency Checking, is impractical because of its poor repair characteristics and complexity, as a standard means of remedying the effects of crashes, but in an emergency it looks different). The complexity of a consistency test can be very large because of the possible fragmentation of a nest in many small patches in the manner of a Swiss cheese.

80Konzeptionell entspricht diese Einschränkung dem auch bei konventionellen Dateisystemen vorkommenden Zwang, dass die Summe des Platzbedarfs aller abgespeicherten Dateien nicht die Gesamtgröße des Dateisystems übersteigen darf. Falls in einer dir_*-Hierarchie sehr große dünn-besetzte Nester vorkommen, deren Nutzungsgrad eine heuristisch bestimmte Schranke unterschreitet (was bei häufigem Vorkommen zum Problem führen kann, dass ein Adressraum mit 64 Bit Breite nicht mehr für die Summe aller vorkommenden Adressraum-Größen ausreicht), dann kann eine Verkleinerung der virtuellen Adressraum-Größen durch einen zwischengeschalteten map_*-Baustein erreicht werden. 80 Conceptually, this restriction corresponds to a chemical also in conventional file systems compulsory that the sum of the space required may not exceed the total size of the file system of all stored files. If there are very large sparsely populated nests in a dir_ * hierarchy whose utilization falls below a heuristically determined threshold (which, in the case of frequent occurrences, can lead to the problem that an address space with 64-bit width is no longer sufficient for the sum of all occurring address space sizes ), then a reduction of the virtual address space sizes can be achieved by an intermediate map _ * block.

81In Wirklichkeit hat er auch einen Ausgang, nämlich den virtuellen Benutzer-Adressraum. Dieser hat jedoch aus Hardwaregründen nicht mehr dieselbe Schnittstelle mit den hier vorgestellten Grundoperationen. Im abstrakten Sinne führt ein Prozessor-MMU-Gespann dennoch die gleichen Grundoperationen aus: Hauptspeicher-Zugriffe des Prozessors lassen sich als Kombinationen von get- und put- mit transfer-Operationen modellieren; eine MMU betreibt abstrakt gesehen eine eingeschränkte Art der Virtualisierung, wie sie ein dynamisches Nest bereitstellt. 81 In fact, he also has an output, namely the virtual user address space. For hardware reasons, however, this no longer has the same interface with the basic operations presented here. In the abstract sense, a processor-MMU team still performs the same basic operations: main memory accesses of the processor can be modeled as combinations of get and put with transfer operations; an MMU abstractly operates a limited type of virtualization, such as a dy Namish nest provides.

82Falls der logische Adressraum eines Nestes größer als der virtuelle Adressraum eines Prozesses ist (z.B. bei 32Bit-Hardware), dann wird nur ein Teil des logischen Nest-Adressraums für den direkten Zugriff durch Maschinenbefehle umgesetzt. 82, if the logical address space of a cavity is larger than the virtual address space of a process is implemented (for example, 32-bit hardware), then only a portion of logical address space nest for direct access by machine instructions.

83Üblicherweise benötigt MMU-Hardware einen Hilfsspeicher für die Seitentabellen. Dieser ist hier nicht als eigener Eingang ausgeführt, da eine andere Verdrahtung als mit device_mem aus Hardwaregründen meist nicht möglich ist. 83 usually requires MMU hardware an auxiliary storage for the page tables. This is not executed here as a separate input, because a different wiring than with device_mem for hardware reasons is usually not possible.

84Trotz der Notwendigkeit, Hilfsspeicher für die Seitentabellen einzusetzen, arbeitet eine mmu_*-Instanz logisch gesehen statuslos: man kann jederzeit die gesamte Seitentabelle freigeben, ohne dass ein Schaden (außer evtl. Performanz-Verschlechterung) eintritt, da die danach unweigerlich auftretenden Seitenfehler den Status der Tabelle wieder aus dem Eingangs-Nest soweit notwendig rekonstruieren werden.Use 84 Despite the need for auxiliary storage for the page tables working, a mmu _ * - Instance logically stateless: you can always share the entire page table, without a loss (except possibly performance degradation) occurs because the page fault then inevitably encountered the Status of the table again from the entrance nest to reconstruct as necessary.

85Nur diese Stelle hat die volle Übersicht über die momentane Speichersituation und kann einigermaßen verlässlich einschätzen, wie hoch zukünftige Speicher-Anforderungsraten ausfallen könnten oder ob die Situation unkritisch ist. Die Rückforderungen auf Verdacht lassen sich damit den aktuellen Lastverhältnissen anpassen, so dass unnötiger Overhead minimiert wird. 85 Only this place has the full overview of the current storage situation and can reasonably estimate reliably how high future memory request rates could fail or whether the situation is critical. The recoveries on suspicion can be adapted to the current load conditions, so that unnecessary overhead is minimized.

86Im Vergleich zu konventionellen Strategien, die mit der Auslagerung oftmals erst bei bereits eingesetzter Speicherknappheit beginnen, führt dies zu potentiell erhöhtem IO-Verkehr. Da dieser jedoch mit Hintergrund-Priorität abgewickelt wird, stört er laufende Aktivitäten so gut wie gar nicht. 86 Compared to conventional strategies, which often start with the outsourcing only when already inserted memory shortage, leading to potentially increased IO traffic. However, since this is done with background priority, it bothers ongoing activities as good as not.

87Ein konventionelles Paging auf Hintergrundspeicher stellt bei der hier vorgestellten Architektur kein eigenständiges Konzept dar. Private Segmente werden stets als temporäre Nester ausgeführt, die auf Massenspeicher gehalten werden. Im Falle von Stack-Segmenten sind sie am Anfang (beinahe) leer; bei wachsender Größe wird neuer Platz mittels clear nachgefordert; die Auslagerung ihres Inhaltes kann spekulativ durch Background-IO erfolgen. 87 A conventional paging on background storage is not an independent concept in the architecture presented here. Private segments are always executed as temporary nests that are kept on mass storage. In the case of stack segments, they are (almost) empty at the beginning; with increasing size new space is requested by means of clear; the outsourcing of their content can be done speculatively by Background-IO.

88Mitte 1990er Jahre wurden im Fachgebiet der Betriebssysteme besonders viele Diskussionen um Kern-Größen und um Grenzen zwischen Kern und „Benutzerbereich" geführt. Ich vermeide den Begriff eines Betriebssystem-Kerns, da er oft mit monolithischen Strukturen assoziiert wird. In der hier vorgestellten Architektur kann es mehrere Kerne im konventionellen Sinn geben: beispielsweise kann die Anbindung an die MMU-Hardware getrennt von der Kontrollfluss-Verwaltung erfolgen, ggf. auch in unterschiedlichen Schutzbereichen erfolgen. Wenn von einem bestimmten Hardware-Mechanismus in einem System nur ein einziges Exemplar vorhanden ist (beispielsweise eine gemeinsame Unterbrechungs-Sprungtabelle in einem Multiprozessor-System), dann ergibt sich für die zugehörige Verwaltungs-Software auf natürliche Weise nur eine einzige Verwaltungs-Instanz. Bei prinzipiell voneinander unabhängigen Hardware-Einheiten kann es jedoch durchaus mehrere verschiedene Verwaltungs-Instanzen geben, die man in konventioneller Teminologie mehrere voneinander unabhängige Mikro-Kerne nennen könnte. Eine derartige Modularisierung bringt insbesondere bei der Anpassung an geänderte oder erweiterte Hardware-Komponenten Vorteile. Diese Problematik tritt insbesondere durch die fortschreitende technische Entwicklung bei Gerätetreibern auf und wird bei vielen Minimalisierungs-Ansätzen von Kernen wie z.B. der Exokernel-Architektur [EKO95] nur unzureichend gelöst. In the mid-1990s, there was a great deal of discussion about kernel sizes and boundaries between core and "user space" in the operating system domain, avoiding the notion of an operating system kernel, as it is often associated with monolithic structures There can be several cores in the conventional sense: for example, the connection to the MMU hardware can take place separately from the control flow administration, if necessary also take place in different protection areas If only one copy of a given hardware mechanism exists in a system (For example, a common interrupt jump table in a multiprocessor system), then there will naturally be only a single management instance for the associated management software, but with hardware units that are independent of one another, there may well be several different management instances that you in ko could call conventional non-self-contained micro-nuclei. Such modularization brings advantages in particular when adapting to changed or extended hardware components. This problem occurs in particular due to the advancing technical development of device drivers and is insufficiently solved in many minimalization approaches of cores such as the Exokerel architecture [EKO95].

89Dies zeigt eine gewisse Ähnlichkeit zu den opportunistischen Locks, die insbesondere von Microsoft eingesetzt werden [OpL]. Opportunistische Locks brauchen jedoch nicht unbedingt gewährt zu werden, und sie werden bei Bedarf gebrochen, d.h. sie werden mit brutaler Gewalt entzogen. Das in Abschnitt 5.3 propagierte Modell ermöglicht dies in Extremfällen zwar auch, verfolgt aber im Normalfall die Idee, dass ein Konsens über die Verteilung von Locks hergestellt werden sollte. Opportunistische Locks stellen dagegen ein eigenständiges Konzept dar, das neben den „normalen" Locks alternativ oder zusätzlich zur Performanz-Steigerung existiert. In dieser Hinsicht unterscheidet sich der hier vorgestellte Ansatz zu dem von Microsoft grundlegend. 89 This shows a certain similarity to the opportunistic locks used by Microsoft in particular [OpL]. However, opportunistic locks do not necessarily have to be granted, and they are broken if necessary, ie they are withdrawn with brutal force. Although the model propagated in section 5.3 does allow for this in extreme cases, it usually pursues the idea that a consensus should be reached on the distribution of locks. Opportunistic locks, on the other hand, represent an independent concept that exists alongside or in addition to the "normal" lock as an alternative to performance enhancement, and in this respect, the approach presented here differs fundamentally from Microsoft's.

90Ein Ansatz zur Vermeidung von Deadlocks in Datenbanken ist konservatives Locking (siehe z.B. [GR93, VGH93]), bei dem alle von einer Transaktion benutzten Ressourcen einmalig am Anfang atomar angefordert werden müssen (vgl. auch das „Handwerker-Problem" in [Jür73], das eine Verallgemeinerung des bekannten Philosophen-Problems [Lam74] darstellt); dies setzt jedoch entweder genaue a-priori-Kenntnisse über das zukünftige Verhalten voraus, oder es schränkt die Parallelität extrem stark durch unnötige Spekulationen auf später meistens doch nicht wirklich genutzte Ressourcen ein. Bei vorher nicht bekanntem Verhalten der Transaktionen führen inkrementell nach tatsächlichem Bedarf gesetzte 2-Phasen-Sperren zu einem Deadlock-Problem, das sich a priori nicht vermeiden läßt (die posteriori-Erkennung ist dagegen relativ einfach; damit werden jedoch unvorhersehbare Rollbacks in Kauf genommen). Deadlocks lassen sich zwar durch halbgeordnetes (zyklenfreies) Setzen von Locks vermeiden, doch auch dafür muss man das zukünftige Verhalten der Transaktionen a priori kennen, was in der Praxis nur selten gegeben sein dürfte. Wenn man Rollbacks wie bei einigen Betriebssystem-Anwendungen unbedingt vermeiden muss, und/oder wenn man das zukünftige Verhalten von Konsumenten nicht kennt, dann hilft im allgemeinen nur, das Scheduling durch Anfordern eventuell später doch nicht wirklich benötigter Locks einzuschränken, d.h. den möglichen Parallelitätsgrad zu senken. Daher ist es von immenser Wichtigkeit, solche Locks zu verwenden, die sich gegenseitig möglichst wenig stören. Das multiversion-Modell (Kapitel 7) kann hierzu ebenfalls einen Beitrag leisten. 90 One approach to avoiding deadlocks in databases is conservative locking (see eg [GR93, VGH93]), where all resources used by a transaction must be requested atomically once at the beginning (see also the "Craftsman Problem" in [Jür73 ], which is a generalization of the well-known philosopher problem [Lam74]), but this either requires accurate a-priori knowledge of future behavior, or it restricts parallelism to a great extent by unnecessary speculation on later mostly unused resources With previously unknown behavior of the transactions, incremental real-time 2-phase locks result in a dead Lock problem that can not be avoided a priori (the posteriori detection, however, is relatively simple, but so that unpredictable rollbacks are accepted). Although deadlocks can be avoided by semi-ordinarily (cycle-free) setting of locks, one must also know the future behavior of the transactions a priori, which is seldom the case in practice. If you absolutely have to avoid rollbacks as in some operating system applications, and / or if you do not know the future behavior of consumers, then in general only helps to limit the scheduling by requesting eventually not really needed locks, ie the possible degree of parallelism reduce. Therefore, it is of immense importance to use such locks that disturb each other as little as possible. The multiversion model (Chapter 7) can also contribute to this.

91Deadlocks können nicht nur bei Transaktionen, sondern auch bei multiuser- oder multiversion-Verhalten von Anwendungen auftreten, die mit der Anwesenheit paralleler Aktivitäten umgehen können (z.B. code_reentrant aus Abschnitt 2.6). Ich sehe Deadlocks nicht als dem Transaktions-Paradigma inhärent, sondern der Parallelverarbeitung auf gemeinsamen Daten schlechthin. Im Unterschied zum klassischen Transaktions-Paradigma, das die Auswirkungen und Folgen von Parallelverarbeitung vor den Konsumenten zu verstecken sucht, macht das singleuser- und multiuser-Modell diese Problematik explizit. Dies stellt zwar höhere Anforderungen an die Programmierer, ermöglicht aber feiner gesteuerte Reaktionen auf Fälle von Deadlocks, z.B. indem ein Prozess ein Signal erhält oder zur Rückgabe eines einzelnen Locks gebeten oder gezwungen wird, ohne dass deswegen gleich der Totschlag-Hammer eines Rollbacks geschwungen werden muss. 91 deadlocks can not only transactions, but also in multi-user or multi occur version behavior of applications that can bypass the parallel with the presence of activities (eg code_reentrant in Section 2.6). I do not see deadlocks inherent in the transaction paradigm, but parallel processing on common data. In contrast to the classical transaction paradigm, which tries to hide the effects and consequences of parallel processing from the consumers, the singleuser and multiuser model makes this problem explicit. While this places greater demands on the programmers, it allows for finer-controlled responses to deadlocks, such as requiring a process to receive a signal or being asked or forced to return a single lock, without having to roll the manslaver of a rollback ,

92Ich halte Transaktionen nicht deswegen für sehr nützlich, weil sie eine singleuser-Illusion ermöglichen, sondern weil sie den Parallelitätsgrad im Sinne einer optimistischen Strategie steigern können und die Rollback-Funktionalität explizit anbieten; diese ist auch bei multiuser-Verwendung von Transaktionen sehr nützlich. 92 I do not think that transactions are very useful because they allow for a single-user illusion, but because they can increase the degree of parallelism in terms of an optimistic strategy and offer the rollback functionality explicitly; This is also very useful for multiuser transactions.

93Ausnahmen mit „krummen" Sektorgrößen kommen vor, z.B. ältere Platten-Geräte und einige moderne dazu kompatible Spezial-Festplatten von IBM, die zur Abspeicherung von ISAM-Informationen gedacht sind. Ferner gibt es in den CD-ROM-Standards einige krumme Sektorformate, auf die von aktuellen Betriebssystemen nur der rohe ungepufferte Zugriff unterstützt wird. 93 exceptions with "crooked" sector sizes occur, such as older disk devices and some modern compatibles special hard drives from IBM that are intended for storing ISAM information. Further, in the CD-ROM standard, some crooked sector formats, to the current operating systems only the raw unbuffered access is supported.

94Das Konzept der Nester unterstützt ausdrücklich völlig beliebige Transfergrößen. Wer allerdings Primzahlen als Transfergröße benutzt, der ist selbst schuld und darf in der Folge keine besonders gute Performanz erwarten. 94 The concept of the nests expressly supports completely any transfer sizes. However, if you use primes as a transfer size, it is your own fault and can not expect a particularly good performance in the episode.

95Da es vermutlich doch relativ häufig vorkommt, dass im Einzelfall entweder nur ein einziger Konsument gerade Datenblöcke hält, oder dass eine Rückforderung mittels der später besprochenen notify_*-Operationen möglich ist, dürften Verschiebungen in vielen Fällen lohnend sein. Dazu müssen aber die Operationen auf Nestern in irgend einer Weise um einen Verschiebemechanismus auf physischer Adressebene erweitert werden, was ich hier nicht im Detail durchführen möchte. Eine Möglichkeit dazu wäre eine Verschiebeoperation try_move, mit der der Konsument aufgefordert werden kann, eine Verschiebung durchzuführen, sofern sie ohne Nebeneffekte auf andere Benutzer möglich ist. Alternativ dazu könnte die get-Operation um Parameter erweitert werden, die einen Allokationswunsch ausdrücken, dem der Produzent aber nicht zwingend nachkommen muss. 95 As it probably still relatively frequently happens that on the case, only one consumer just keeps data blocks, or that a recovery by the later discussed notify _ * - operations is possible shifts are likely to be worthwhile in many cases. But to do this, the operations on nests have to be extended in some way by a physical-level displacement mechanism, which I will not describe in detail here. One way to do this would be to use try_move, a shift operation that prompts the consumer to perform a move, provided that it has no side effects on other users. Alternatively, the get operation could be extended by parameters that express an allocation request to which the producer but does not necessarily have to comply.

96Dieses Argument läuft parallel zu demjenigen aus der Theorie über Kompressionsverfahren, das besagt, dass eine verlustfreie Datenkompression von n Ausgangs-Bits stets Kodierungen enthalten muss, die länger als n sind, wenn einige Kodierungen kürzer als n ausfallen sollen. Dies liegt daran, dass es insgesamt 2n verschiedene Eingangs-Kodierungen gibt, die in 2n verschiedene Ausgangs-Kodierungen zu übersetzen sind, da die Kompression in allen Fällen wieder rückgängig machbar sein soll.This argument 96 runs parallel to that of the theory of compression method, which states that a lossless data compression of n output bits always contain encodings must longer than n, if some codes are shorter than n fail. This is because there are a total of 2 n different input encodings to be translated into 2 n different output encodings since the compression should be reversible in all cases.

97Wovon der wichtigste meiner Ansicht nach die weitgehende Vermeidung von Verschnitt darstellt. 97 Of which, in my opinion, the most important is the avoidance of waste.

98Zur Nachbildung eines n-fachen Hardlinks muss dieser Baustein n-fach instantiiert werden, außerdem muss noch eine Verwaltungslogik für die Freigabe hinzukommen, die beispielsweise von einem gesonderten Verwaltungsbaustein erledigt werden kann, der sozusagen die „Aufsicht" über alle Namensänderungen und Verschiebungen aller beteiligten Namen übernimmt. Alternativ dazu kann dieser Baustein auch so ausgeführt werden, dass er n Steuer-Eingänge hinzu-bekommt, die zusammen diese Aufgabe übernehmen. 98 To simulate an n-fold hardlink, this block must be instantiated n-fold, and there must also be added a management logic for the release, which can be done, for example, by a separate management module, which, so to speak, the "supervision" of all name changes and shifts of all involved Alternatively, this block can also be executed in such a way that it receives n control inputs, which together take over this task.

99Hierfür gibt es reizvolle Anwendungen, sofern Methoden zur Reintegration von Splits vorhanden sind. Beispiele für Splits treten u.a. bei Versions-Verwaltungssystemen für Software-Quelltexte auf. 99 There are attractive applications for this, as long as there are methods for reintegrating splits. Examples of splits occur, for example, in software source code version management systems.

100Für besondere Anwendungen, beispielsweise extrem hoher Ausfallsicherheit, könnte diese Idee eventuell trotz ihrer hohen Kosten interessant sein. 100 For special applications, such as extremely high reliability, this idea might be interesting, despite its high cost.

101Welche Auswirkungen dies auf die Performanz haben kann, ist eine andere Frage. Im Prinzip haben wir damit eine NUMA-Architektur in Software realisiert. 101 What impact this can have on performance is another question. In principle, we have implemented a NUMA architecture in software.

102Nach dem Urstart müssen bereits Bausteine vorhanden sein, damit das System in Betrieb gehen kann (unverzichtbare Gerätetreiber und Äquivalent eines Root-Dateisystems). 102 After initial start blocks (indispensable device drivers and equivalent of a root file system) must already be present for the system to go into operation.

103Diese Trennung bewirkt u.a., dass sich die Abstraktionen Nest und Baustein in uniformer Weise auch in konventionellen „Benutzerprozessen" verwenden lassen, eventuell sogar in sogenannten „Anwendungs-Programmen" – es besteht überhaupt kein prinzipieller Unterschied zwischen „Kern"- und „Benutzer"-Adressräumen bzw. -Schutzbereichen. 103 This separation causes, among other things, that the abstractions nest and building block can be used in a uniform manner in conventional "user processes", possibly even in so-called "application programs" - there is absolutely no fundamental difference between "core" and "user" Address spaces or protection areas.

104Im Extremfall kann das gesamte Betriebssystem in einem einzigen Adressraum ablaufen, was z.B. bei Echtzeit-Steuerungen Performanz-Vorteile bringt. Falls Schutzbereiche genutzt werden, läßt sich trotzdem ein brauchbarer Zugriffsschutz realisieren (vgl. [C+94]). Im Unterschied zu bekannten Architekturen (vgl. [K+97]) erlaubt die hier vorgestellte Trennungsmöglichkeit beliebige Zwischenstufen zwischen reinen Single-Address-Space-Modellen und vollkommener Aufplitterung aller Funktionen in jeweils getrennte mmu_*-Instanzen. 104 In extreme cases, the entire operating system can run in a single address space, which, for example, provides performance advantages in the case of real-time controllers. If protected areas are used, a usable access protection can still be realized (see [C + 94]). In contrast to known architectures (see [K + 97]), the separation option presented here allows arbitrary intermediate stages between pure single-address-space models and complete fragmentation of all functions into separate mmu_ * instances.

105Die Benutzung eines einzigen virtuellen Adressraums im gesamten System läßt sich dadurch modellieren, daß nur eine einzige mmu_*-Instanz vorhanden ist, in der das gesamte System abläuft. Obwohl diese Strategie in letzter Zeit hohe Aufmerksamkeit in der Literatur erhalten hat [C+94, Ros94, Ass96], sehe ich darin keinen grundlegenden Vorteil. Die Umschaltung einer Standard-MMU auf verschiedene Schutzbereiche kostet (mit wenigen Ausnahmen) im Worst Case größenordnungsmäßig ebenso viel wie die Umschaltung zwischen verschiedenen Adressräumen; lediglich der Best Case geht u.U. effizienter. In welcher Größenordnung sich dieser mögliche Performanz-Gewinn auf das Gesamtsystem auswirkt, und ob Effekte gleicher Größenordnung nicht auch durch andere architekturelle Maßnahmen erzielbar sind, sind genauer zu untersuchende Fragen. Meiner Ansicht nach stellt die Einengung auf ein festes Single-Space-Modell eine Einschränkung dar, die mit der hier vorgestellten Architektur aufgebrochen werden kann. 105. The use of a single virtual address space in the entire system can be characterized model that only a single mmu _ * - instance exists, in which the entire system running. Although this strategy has received much attention in the literature lately [C + 94, Ros94, Ass96], I see no fundamental advantage in it. Switching a standard MMU to different protection zones costs (with a few exceptions) in the worst case the same order of magnitude as switching between different address spaces; only the best case may be more efficient. The extent to which this possible performance gain affects the overall system, and whether effects of the same magnitude can not be achieved by other architectural measures, are questions to be examined more closely. In my opinion, the restriction to a fixed single-space model is a limitation that can be broken with the architecture presented here.

106Die einfachste Lösung hierfür besteht darin, dass der tmp-Eingang bereits bei der „Ur-Instantiierung" das richtige Prozessabbild mit der Baustein-Konfiguration enthält, mit dem zu starten ist. Wenn dieses auch die steuernde control-Instanz enthält, entsteht automatisch die Selbstverwaltung. Bei der Systemgenerierung eines bootfähigen Systems wird auf einem (fremden) Rechner ein entsprechendes Prozessabbild mit allen zum Urstart notwendigen Instanzen erstellt; dieses kann dann mit konventionellen Ladern analog wie klassische Unix-Kerne geladen werden. 106 The simplest solution for this is that the tmp input has been in the "Ur-instantiation" the right process image with the block configuration, is to start with. If this control instance includes the controlling automatically creates the Self-administration: When system generation of a bootable system, a corresponding process image is created on a (foreign) computer with all instances required for the initial start, which can then be loaded with conventional loaders in the same way as classic Unix cores.

107Hierbei kann es i.A. zu Problemen mit Rekursion kommen, wenn derartige Auftraggeber sich selbst betreffende Operationen in Auftrag geben. 107 This may iA be problems with recursion if such clients give yourself operations in question in order.

108Alternativ zu diesen Ein- und Augängen könnte man auch LRPC-Varianten von remote benutzen; damit müßten keine Verdrahtungsleitungen zwischen Kommunikationskanälen auf demselben Rechner verwaltet werden. Mir scheint jedoch die explizite Verwaltung von Leitungen durch eine übergeordnete Instanz sicherer zu sein, da eine Leitung bereits eine rudimentäre Form von Authentifizierung bereit stellt, die bei geeigneter Abschottung der Subsysteme (z.B. Partitionierung in Schutzbereiche) von einem vertrauenswürdigen „logischen Supervisor" einbruchssicher gemacht werden kann, ohne zu aufwenigeren Massnahmen wie Verschlüsselung beim LRPC greifen zu müssen. 108 As an alternative to these inputs and outputs, you could also use remote LRPC variants; so no wiring lines between communication channels would have to be managed on the same computer. However, the explicit management of lines by a higher-level entity seems to me to be more secure, since a line already provides a rudimentary form of authentication which, with suitable partitioning of the subsystems (eg partitioning into protection areas), is burglar proofed by a trusted "logical supervisor" can, without having to resort to less extensive measures such as encryption in the LRPC.

109Dies ist nicht nur zur Herstellung mehrerer virtueller Rechner-Partitionen interessant oder zu deren Kommunikation über gemeinsame Daten wie „Dateisysteme", sondern beispielsweise auch zum Checkpoint/Restart einer einzigen Betriebssystem-Instanz, wenn man beispielsweise vor tmp eine transaction-Instanz vorschaltet. Eine weitere Anwendung wäre beispielsweise das Vorhalten eines kompletten Ersatz-Betriebssystem-Abbildes, das bei Störungen einspringen kann. 109 This is not vorschaltet only for the production of multiple virtual machine partitions interesting or to their communication on common information, such as "file systems", but also for example for Checkpoint / Restart a single operating system instance, if you tmp for example, before a transaction instance. A Another application would be, for example, the provision of a complete replacement operating system image, which can intervene in case of interference.

110Um reibungslose Re-Instantierungen bzw. Re-Konstruktionen zu garantieren, darf der Inhalt von code zur Laufzeit nur um neue Baustein-Typen bzw. um neue (fehlerbereinigte) Versionen erweitert werden, nicht jedoch abgeändert werden. 110 To smooth re-Instantierungen or guarantee reconstructions, the contents of code at runtime just to new device types or new (bug-free) versions can be extended, but not modified.

111Bei sicherheitskritischen Anwendungen kann die Ausführung von Instantüerungs- und Konstruktor-Routinen durch die control-Instanz eine Gefährdung darstellen, insbesondere wenn den in der nachgeschalteten mmu_*-Instanz ablaufenden Aktivitäten oder dem Inhalt von code nicht zu trauen ist. In diesem Fall sollte der Aufruf durch LRPC stattfinden und im Kontext der nachgeschaltenen mmu_* ausgeführt werden. 111 In safety-critical applications running Instantüerungs- and constructor routines may present a risk, especially when the in the downstream mmu _ * by the control instance - instance running activities or the content of code can not be trusted. In this case, the call should be made by LRPC and executed in the context of the downstream mmu_ *.

112Durch zwischen geschaltete remote-Bausteine dürften sich auch bei den klassischen Einsatzgebieten von Datenbanken neue Konfiguationsmöglichkeiten ergeben, die bei bisherigen Datenbank-Architekturen nicht einfach zu realisieren waren. Zu nennen ist hier insbesondere die Einbeziehung des Verhaltens von Flaschenhälsen wie remote-Instanzen in rechnerübergreifende Query-Optimierungs-Strategien; es kann beispielsweise in manchen Szenarien durchaus vorteilhaft sein, Tabellen erst mittels remote auf Client-Rechner zu exportieren und dort mittels buffer zu cachen, bevor umfangreiche Joins oder andere Produkte daraus hergestellt werden. 112 through intermediate remote devices should provide new databases Konfiguationsmöglichkeiten Also in the classical application areas that were not easy to implement in existing database architectures. Particularly noteworthy here is the inclusion of the behavior of bottlenecks as remote entities in cross-computer query optimization strategies; For example, in some scenarios, it may be beneficial to export tables to client machines remotely and cache them there before committing large joins or other products.

113Durch derartige Verbindungen könnte man beispielsweise Pfadnamen durch SQL-Abfragen ersetzen. 113 Through such compounds could be, for example, pathname by replacing SQL queries.

114Dieser Ansatz geht über die Integration von Dateien in Datenbanken (vgl. [HR01, Abschnitt 3.5]) weit hinaus, da man sowohl Dateien als auch Datenbank-Datensätze jeweils sowohl über SQL als auch über Verzeichnis-Pfade zugreifbar machen kann; bei dieser Stufe der Integration verschwimmen die konventionellen Unterschiede zwischen Datenbanken und Betriebssystemen völlig. 114 This approach goes far beyond integrating files into databases (see [HR01, Section 3.5]), as both files and database records can be accessed through both SQL and directory paths; At this level of integration, the conventional differences between databases and operating systems are blurring completely.

115Die einzige Ausnahme ist der Tod eines Eigentümers. 115 The only exception is the death of an owner.

116Beispielsweise kann auch in einer absoluten Monarchie ein Untertan Eigentum erwerben, auf das der König keinen Zugriff hat. Wenn dies nicht möglich wäre, müssten die Untertanen verhungern, da sie ohne Zustimmung des Königs kein Eigentum und keinen Besitz an Lebensmitteln erwerben könnten, auch nicht an solchen Lebensmitteln, die sie selbst hergestellt haben. 116 For example, purchase property, on which the king does not have access in an absolute monarchy a subject. If this were not possible, the subjects would starve to death because without the King's consent they would not be able to acquire property or possession of food, including food they themselves produced.

117Beim Start des Betriebssystems gehört sämtlicher Speicher einem Urbesitzer, der ihn dann an andere Instanzen wie Caches oder device_ramdisk „ausleiht". 117 At the start of the operating system of all the memory owned by a Urbesitzer, which then "borrow" it to other instances such as caches or device_ramdisk.

118Wenn man Kopien herstellt, dann betreibt man letzlich eine Mischform der Zuordnung von Eigentumsrechten an verschiedene Instanzen. Die „Originale" werden unten in der Hierarchie verwaltet (siehe MMU-freies Ur-Unix mit Buffer-Cache in [Lio96]), die Kopien entstehen dann implizit z.B. bei read- oder write-Operationen. 118 When producing copies, then ultimately operates a hybrid of the assignment of ownership of different instances. The "originals" are managed at the bottom of the hierarchy (see MMU-free original Unix with buffer cache in [Lio96]), the copies then arise implicitly, eg during read or write operations.

119Wieviel Sinn dies macht, ist eine andere Frage. Theoretisch kann ein MMU-freier Prozess schneller laufen, da der Hardware-Aufwand zur Adressübersetzung wegfällt, und garantiert keine Verzögerungen durch Seitenfehler-Unterbrechungen auftreten. Letzterer Effekt wird in echtzeitfähigen Betriebssystemen jedoch auch durch vorgeladene und nicht auslagerbare Speicherseiten erzielt. 119 How much sense does it, is another question. Theoretically, an MMU-free process can run faster, eliminating the hardware overhead of address translation, and guaranteeing no delays due to page fault interruptions. The latter effect is achieved in real-time operating systems but also by preloaded and non-pageable memory pages.

120Wenn der Empfänger z.B. in eine Endlosschleife geht oder z.B. bei der Ausführung der notify_*-Operation in einen Deadlock gerät oder wenn z.B. im RPC-Modell der Bearbeiter-Kontrollfluss verstirbt, kann eine „Weigerung" auch schlicht darin bestehen, dass nichts geschieht. Da interne Angelegenheiten eines Bausteins nicht von außen „aufgemischt" werden sollten, bleibt zur Lösung dieses Problems letztlich nur das Setzen einer Zeitschranke, deren Ablauf als „Weigerung" interpretiert wird. 120 If the recipient eg goes into an infinite loop or, for example in the execution of the notify _ * - operation in a deadlock device or if, for example in the RPC model, the processor control flow passes away, a "refusal" may also simply be that nothing happens. Since internal matters of a building block should not be "mixed up" from the outside, the only solution to this problem is to set a time limit whose sequence is interpreted as a "refusal".

121Sofern sie nicht durch andere Instanzen wie z.B. Wächter daran gehindert wird. Dies ist jedoch kein Gegenargument, da eine Wächter-Instanz konsistenterweise auch die Rückforderungen überwachen sollte, so daß unter dem Strich eine Aufteilung der Macht auf mehrere Instanzen erfolgt (gegenseitige Überwachung). 121 Unless otherwise prevented by other authorities, such as security guards. However, this is not a counter-argument, as a guardian instance should also consistently monitor the recovery, so that the bottom line is a division of power to multiple instances (mutual monitoring).

122Microsofts opportunistische Locks sind stellen eine eigene Locking-Art dar, die von anderen Locking-Arten unabhängig sind. Dies erhöht nicht nur die Komplexität der Schnittstellen, sondern kann z.B. zu der Situation führen, dass eine maliziöse Anwendung, die einen opportunistischen Lock entzogen bekommen hat, mittels regulärer Locks das System dennoch lahm legen kann. 122 Microsoft's opportunistic locks are their own locking-type, independent of other locking types. This not only increases the complexity of the interfaces, but may, for example, lead to the situation that a malicious application, which has been deprived of an opportunistic lock, can still shut down the system by means of regular locks.

123Das häüfig angeführte Problem der Ausfallsicherheit sehe ich nicht als spezifisch für verteilte Systeme an, obwohl eine brauchbare Lösung dort von besonderer Wichtigkeit ist. Konzepte zur Erzielung von Ausfallsicherheit sollten für alle Bausteine uniform sein, unabhängig von der konkreten physischen Verteilung. 123 I do not consider the common problem of reliability to be specific to distributed systems, although a viable solution is of particular importance there. Failover security concepts should be uniform across all building blocks, regardless of physical distribution.

124Die Fortschritte bei den Kommunikationstechniken gehen jedoch in die Richtung, dass die Best-Case-Annahmen immer besser durch verbesserte Technik angenähert werden. 124 Advances in communication technologies, however, go in the direction that the best-case assumptions are always better approximated by improved technology.

125Damit ist nicht die Granularität einzelner Schreibe-Maschinenoperationen gemeint, sondern eine „zeitnahe" Meldung in der Größenordnung der Kommunikations-Latenzen. 125 This does not mean the granularity of individual write machine operations, but rather a "timely" message in the order of the communication latencies.

126Falls die Annahme disjunkter Working Sets doch nicht zutreffen sollte, liegt bei der hier vorgestellten Betrachtungsweise die „Schuld" nicht bei den Caches, sondern beim Verhalten der Endkonsumenten. 126 If the assumption of disjoint working sets is not correct, the "guilt" is not the caches, but the behavior of the end consumer.

127Nachrichten dienen zur Übertragung von Information (umgekehrt kann jedoch auch das Nicht-Senden oder das Nicht-Ankommen einer Nachricht eine Information darstellen, z.B. beim Ablaufen eines Timeouts; vgl. [Lam84]). Eine Übertragung von Information muss nicht unbedingt durch Herstellen einer Kopie erfolgen; beispielsweise stellt auch die Benutzung eines gemeinsamen Puffers durch mehrere Instanzen eine Realisierung einer Nachrichten-Übertragung dar. 127 Messages are used to transmit information (conversely, non-transmission or non-arrival of a message may also constitute information, eg when a timeout expires, see [Lam84]). Transmission of information need not necessarily be done by making a copy; For example, the use of a shared buffer by multiple instances represents a realization of a message transmission.

128Dies ließe sich durch Benutzung von get_ops(get_ops(s)), also Einführen eines Operations-Nestes zum Operations-Nest vermeiden. 128 This could be avoided by using get_ops (get_ops (s)), ie inserting an Operations nest into the Operations nest.

129In letzterem Fall ist ein asynchroner Aufruf möglich. Wie viel Sinn dies macht, sei dahingestellt, da die Elementaroperationen eigens zur Darstellung von Asynchronität entwickelt wurden. 129 In the latter case, an asynchronous call is possible. How much sense this makes is obvious, since the elementary operations were developed especially for the representation of asynchrony.

130Das beim RPC oft als notwendig betrachtete Marshaling (Umwandlung zwischen inkompatiblen Datenformaten) wird hier nicht in die Grundmechanismen hineingesteckt, sondern kann bei Bedarf durch Anpassungsbausteine implementiert werden, die verschiedene Datenformate ineinander umwandeln. 130 The necessary considered marshaling the RPC often (conversion between incompatible data formats) is not inserted here into the basic mechanisms, but can be implemented by adapting modules as needed, convert the various data formats into each other.

131Bei genauer Betrachtung aktueller monolithischer Kern-Implementierungen im Unix-Umfeld fällt auf, dass diese exzessiven Gebrauch von dynamischen Typprüfungen machen. Dies wird z.B. durch die Existenz der Fehler-Rückmeldung EINVAL (Invalid Argument) in Unix belegt. Es gibt kaum Systemaufrufe, die Parameter verlangen, wo statt der Bearbeitung eines Aufruf-Auftrages nicht dieser Fehlercode als Rückmeldung zurückkommen kann. A closer look at current monolithic core implementations in the Unix environment reveals that they make excessive use of dynamic type checks. This is evidenced, for example, by the existence of the error response EINVAL (Invalid Argument) in Unix. There are hardly any system calls that require parameters where instead of processing a call job, this error code can not come back as feedback.

132Damit sind Typ-Inferenzsysteme jedoch nicht generell ausgeschlossen: die Abschnitt 4.2.2 vorgestellten strategy_*-Bausteine können nicht nur Laufzeit-Test auf Typkompatibilität auszuführen, sondern im Prinzip beliebige Folge-Instantiierungen mit beliebigen Parametern auslösen. Damit sollte es theoretisch möglich sein, sogar ein Hindley-Milner-Typsystem zu realisieren. 132 This type inference systems are not generally excluded: the Section 4.2.2 presented strategy _ * - modules can not only carry out run-time test for type compatibility, but trigger in principle any subsequent instantiations with any parameters. This should theoretically make it possible to realize even a Hindley-Milner type system.

133Diese werden z.B. in Unix zur Unterscheidung der durchzuführenden Operationen bei ioctl und fcntl eingesetzt. Über die damit verbundenen Probleme und Auswirkungen ist bereits genügend in der Folklore-Literatur diskutiert worden. Bei der Geschwindigkeit heutiger Prozessoren kann der minimal größere Aufwand beim Zugriff auf Zeichenketten gegenüber dem Zugriff auf ein Maschinenwort kein schlagendes Argument mehr sein, vor allem, wenn man den Zugewinn an Komfort dagegen stellt. 133 These are used for example in Unix to differentiate the operations to be performed with ioctl and fcntl. Enough has already been discussed in folklore literature about the problems and implications. At the speed of today's processors, the minimal overhead involved in accessing strings over access to a machine word can no longer be a beating argument, especially if you sacrifice comfort.

134Man könnte theoretisch sogar noch die Liste der Operationsnamen weglassen. Der Bearbeiter kann dann zwar das Datenformat aller eingehenden Aufträge selbst prüfen, der Aufrufer ist in diesem Falle aber vollkommen „blind" und kann die Operations-Namen nur erraten, wenn er sie nicht aus einer anderen externen Quelle (wie z.B. eine Schnittstellen-Definition) weiß. Wenn überhaupt keine Typinformation kommuniziert wird, dann handelt es sich nicht um ein Typsystem im eigentlichen Sinne. In theory, one could even omit the list of operation names. Although the processor can then check the data format of all incoming jobs themselves, the caller in this case is completely "blind" and can only guess the operation name if he does not use it from another external source (such as an interface definition). If no type information is communicated at all, then it is not a type system in the true sense.

135Diese Problematik taucht in Betriebssystemen immer wieder auf, und zwar nicht nur in solchen, die Objektorientierung als Leitmotiv angeben. Microsoft hat beispielsweise den Begriff der „DLL-Hölle" geprägt. Damit sind zueinander inkompatible Versionen von Systembibliotheken gemeint, die aufgrund intern geänderter Schnittstellen nicht zusammenpassen. 135 This issue surfaced in operating systems again and again, not only in those that specify object orientation as a leitmotif. For example, Microsoft coined the term "DLL hell" to mean incompatible versions of system libraries that do not match because of internally changed interfaces.

136Beispiele für die konkrete Syntax von system-übergreifenden Schnittstellen finden sich u.a. in den Internet-RFCs (Request For Comments). Datenformate werden dort fast durchwegs durch kontextfreie Grammatiken in einer zur Backus-Naur-Form ähnlichen Notation angegeben. 136 examples of the concrete syntax of system-wide interfaces, among other things found in the Internet RFCs (Request For Comments). Data formats are almost always indicated by context-free grammars in a notation similar to the Backus-Naur form.

137Ein Beleg hierfür sind die formalen Spezifikationen von Netzwerk-Protokollen und -Datenformaten in den Internet-RFCs. Diese scheinen mir allesamt in der Klasse LL(k) zu liegen. 137 Evidence of this are the formal specification of network protocols and -Datenformaten in Internet RFCs. These all seem to me to be in the class LL (k).

138Bei der Greibach-Normalform müssen alle Produktionsregeln die Form X → aα haben, wobei X ein Nichtterminalsymbol, a ein Terminalsymbol, und α eine beliebige Zeichenfolge aus Terminal- oder Nichtterminalsymbolen ist. 138 In the Greibach Normal Form all production rules have the form X → have aα, wherein X, a is a terminal symbol, and α an arbitrary string of terminal or non-terminal symbols is a non-terminal symbol.

139Typische Vertreter von Sequenzen sind Arrays und Records. 139 Typical members of sequences are arrays and records.

140Bei allgemeinen kontextfreien Grammatiken können Alternativ-Regeln mehrere logische Alternativen repräsentieren, die logische Alternativen zu verschiedenen Themen darstellen und nichts im logischen Sinne miteinander zu tun haben brauchen. 140 In general, context-free grammars alternative rules can represent multiple logical alternatives represent logical alternatives on various issues and nothing to do with each other in a logical sense have need.

141Dieses Konzept taucht z.B. in den Tags von varianten Records von Pascal-ähnlichen Programmiersprachen auf; in Ada ist die Verwendung eines Tag-Feldes sogar Pflicht. For example, this concept appears in the tags of variant records of Pascal-like programming languages; In Ada, the use of a tag field is even mandatory.

142Dies schließt nicht die Verwendung eines Prä-Compilers aus, der immer wiederkehrende Teile der Interpretation einmal vorweg berechnet (sog. Precomputing). 142 This does not preclude the use of a pre-compiler, which calculates recurring parts of the interpretation once in advance (so-called pre-computing).

143Ob die Vorübersetzung in ausführbare Maschinenbefehle ("just-in-time compiler") weitere Vorteile bringen kann, wäre zu untersuchen. 143 Whether the pre-translation into executable machine instructions ( "just-in-time compiler") can bring additional benefits would be to investigate.

144Dieses Konzept taucht in Compilern als Token-Klasse auf, z.B. die Token-Klasse aller Identifier oder aller Zeichenketten. 144 This concept appears in compilers as a token class, eg the token class of all identifiers or all character strings.

145Eine Verkleinerung läßt sich dadurch erzielen, dass Attribute und Methoden in den jeweiligen Meta-Nestern nicht mehr erscheinen, so dass sie aus dem Typsystem ausgeblendet erscheinen. Einbesserer Zugriffsschutz läßt sich dadurch realisieren, dass bei der Transformation auch Ausblendungen in den jeweiligen adjungierten Nestern vorgenommen werden. 145 A reduction can be achieved in that the attributes and methods will no longer appear in the meta nests so that they appear from the hidden type system. Improved access protection can be realized by the fact that in the transformation also fades in the respective adjoint nests are made.

146Eine Ausnahme ist Smalltalk, wo Methoden-Änderungen oder sogar Klassen-Änderungen zur Laufzeit prinzipiell möglich sind, da alle Strukturen dynamisch angelegt sind. 146 An exception is Smalltalk, where methods changes or even classes changes at runtime are possible in principle, since all structures are created dynamically.

147Beispiele sind Pipe-Operationen in Linux, deren Semantik vom Modus abhängt, in dem die Pipe geöffnet wurde. Es gibt Implementierungen, die jeden Modus als eigene Prozedur realisieren und über eine einheitliche generische Schnittstelle verfügbar machen. 147 examples are Pipe operations in Linux, whose semantics is dependent on the mode in which the pipe was opened. There are implementations that implement each mode as a separate procedure and make it available through a single generic interface.

148Übliche Schutzkonzepte von objektorientierten Programmiersprachen wie C++ oder Java sehen eine global gültige Unterteilung in private und öffentliche Regionen vor. Demgegenüber erlaubt das Konzept der adjungierten Nester auch Sichten, die für jede Teilnehmer-Instanz anders ausfallen können. 148 Usual safety concepts of object-oriented programming languages such as C ++ or Java provide a globally valid division into private and public areas. In contrast, the concept of adjoint nests also allows views that may be different for each participant instance.

149Bei der objektorientierten Vererbung werden Methoden-Schnittstellen stets nur erweitert. Bausteine lassen hingegen auch das Verdecken bisheriger Attribute oder Methoden zu. Ich halte dies für sehr nützlich, weil es das Steigern der Abstraktionsstufe in einer Baustein-Hierarchie ermöglicht: logisch betrachtet handelt es sich nach einer Steigerung der Abstraktionsstufe zwar immer noch um dieselbe Objekt-Instanz, die Zugriffsmethoden werden jedoch „abstrakter". Man kann Benutzern der höheren Abstraktionsstufen untersagen, diese mit Methoden niedrigerer Stufe gemischt zu verwenden, um beispielsweise die Umgehung von erst weiter oben gegebenen Zusicherungen zu unterbinden („schwärze Schnittstellen"). 149 In object-oriented inheritance, method interfaces are always only extended. On the other hand, blocks also allow the masking of previous attributes or methods. I think this is very useful because it makes it possible to increase the level of abstraction in a building block hierarchy: logically speaking, after increasing the level of abstraction, it is still the same object instance, but the accessors become more abstract prohibit the higher levels of abstraction from using them mixed with lower-level methods, for example, to prevent the circumvention of assurances given above ("black interfaces").

150Ein klassiches Beispiel universeller Interpreter-Konstrukte höherer Ordnung ist der #!-Operator zusammen mit der Argumentübergabe an Prozesse in Unix, mit dem sich beliebige Interpreter starten lassen, die ihrerseits wieder beliebige weitere Operationen auf beliebigen Daten ausführen können. Eine Nachbildung durch Bausteine ist leicht möglich. 150 A classic example of universal higher-level interpreter constructs is the #! Operator, along with the argument passed to processes in Unix, which can be used to start arbitrary interpreters, which in turn can perform arbitrary operations on arbitrary data. A simulation by building blocks is easily possible.

151Mehrere Tabellen, Indizes etc. sollten sich durch Vorreservierung genügend grosser Adressbereiche aus mindestens 64 Bit Adressraum-Gesamtgröße herausschneiden lassen, so dass Verschiebungen ganzer Tabellen gar nicht oder nur extrem selten benötigt werden. 151 Several tables, indexes, etc. should be cut out by reservation sufficiently large address ranges from a minimum of 64 bit address space overall size so that displacement of entire tables are not at all or only extremely rarely needed.

152Eventuell wäre es eine gute Idee, adjungierte Nester zum adjungierten Nest einzuführen. Das adjungiert-adjungierte Nest enthält dann die Beschreibung ganzer Tabellen und Indizes, das einfach adjungierte Nest die konkrete Beschreibung der jeweiligen Tabelle. 152 Possibly it would introduce a good idea adjoint nests for adjoint nest. The adjoint-adjoint nest then contains the description of whole tables and indices, the simple adjoint nest the concrete description of the respective table.

153Bekannte Realisierungen sind z.B. die Logs von Datenbanken, die gelegentlich vollständig aufbewahrt werden und als SQL-Tabelle dargestellt werden, so dass man in ihnen wie in anderen Tabellen suchen kann. 153 Well-known implementations are, for example, the logs of databases that sometimes pop up completely be preserved and displayed as an SQL table so that you can search in them as in other tables.

154Konzeptuell wäre dies die Verwendung Lamportscher Uhren [Lam78] auch in persistenten Speichern als dauerhaftes Modell der Darstellung zeitlicher Relationen zwischen Operationen. 154 Conceptually, this would be the use Lamportscher watches [Lam78] time as a permanent model of representation in persistent storage relationships between operations.

155Beim Time-Warp [Jef85] wird zwar ebenfalls eine virtuelle Zeit-Achse verwendet, doch schreiten die Operations-Auführungen auf dieser Achse monoton vorwärts und werden nur beim Rollback gelegentlich intern zurückgesetzt. Im Unterschied dazu erlaubt das hier propagierte Modell beliebige Rückdatierungen von Operationen, die unabhängig von evtl. vorkommenden Rollbacks sind; weiterhin wird die virtuelle Zeit-Achse mit der Orts-Achse zu einer zweidimensionalen Ebene verknüpft. 155 When Time Warp [Jef85] is likewise a virtual time axis used, but the operation Auführungen proceed on this axis monotonously forward and be reset only occasionally Internal rollback. In contrast, the model propagated here allows any backdating of operations that are independent of any rollbacks that may occur; furthermore, the virtual time axis is linked to the location axis to a two-dimensional plane.

156Es geht auch mit logischen Lamportschen Uhren, nur muss der Konsument dann die „Bedeutung" von Zeit-Werten in der Real-Zeit auf mühsame Weise selbst bestimmen. 156 It is also logical Lamportschen watches, only has the consumer then the "meaning" of time values in real-time to determine hard way yourself.

157Bei dieser Darstellung wird still-schweigend voraus gesetzt, daß stets eindeutige Zeitstempel in einem verteilten System generiert werden. Eine wohlbekannte Methode hierfür ist das Anhängen von Knoten-Kennzeichen an den abgelesenen Wert einer Rechner-Uhr, so daß eventuell gleichlautende Uhrzeiten, die durch zufälliges „gleichzeitiges" Ablesen von Uhren entstehen könnten, stets zu eindeutigen Zeit-Werten führt. 157 In this illustration is still-silent set beforehand that always unambiguous timestamps are generated in a distributed system. A well-known method for this is the attachment of node flags to the read value of a computer clock, so that possibly identical clock times, which could result from random "simultaneous" reading of clocks, always leads to unique time values.

158Mit Quasi-Persistenz ist gemeint, dass grundsätzlich die Persistenz zwar angesprebt wird, jedoch später die gespeicherte Information durch gezieltes Vergessen vergröbert werden kann. 158 With quasi-persistence means that basically the persistence is indeed angesprebt, the stored information can be coarsened by selectively forget but later.

159Das Konzept einer „globalen Reihenfolge" von Operations-Aussführungen braucht in einem verteilten System nicht verwendet zu werden. Die Darstellung durch Reihenfolge-Nummern dient hier nur zur Illustration. 159 The concept of a "global order" of operation statements need not be used in a distributed system, the representation by order numbers is for illustration purposes only.

160Es sind allgemeinere Modelle denkbar, bei denen es nicht auf die Sichten zwischen Locks, sondern zwischen den darin enthaltenen Zugriffs-Operationen ankommt. Solange im Beispiel nur Lock 2 gesetzt, aber nicht gelesen wurde, könnte man Lock 3 noch gewähren. Das sich daraus ergebende kompiziertere Modell wird in dieser Arbeit nicht untersucht. 160 More general models are conceivable in which it is not the views between locks that are important, but the access operations they contain. As long as in the example only Lock 2 was set but not read, Lock 3 could still be granted. The resulting more complex model is not investigated in this paper.

161Dies ist ähnlich zu nicht-determinanten Zustands-Abhängigkeiten aus Abschnitt 3.2, bezieht sich jedoch nicht auf die Zustände selbst, sondern auf die in den Zuständen gespeicherten kausalen Abhängigkeiten. 161 This is similar to to indeterminate state dependencies in Section 3.2, however, does not apply to the states themselves, but to the data stored in the states causal dependencies.

162Die Bestimmung aller möglichweise betroffenen Lock-Instanzen muss nicht bei jedem Setz-Versuch neu erfolgen, wenn das Prinzip des dynamic programming angewandt wird. Weiterhin darf eine Implentierung das spätere Zwischenschieben von Locks auch dann zurückweisen, wenn dies laut stable-Angaben möglich wäre. Dadurch lassen sich Heuristiken einführen, die z.B. relativ grosse Bereiche der Raum-Zeit-Ebene gegen das Setzen neuer Write-Locks sperren. 162 The determination of all possibly affected Lock instances does not have to be done every time you attempt to set them, if the principle of dynamic programming is used. Furthermore, an implementation may reject the later interposing of locks, even if this were possible according to stable statements. As a result, heuristics can be introduced which, for example, block relatively large areas of the space-time level against the setting of new write locks.

163Weitere Konsistenzmodelle, insbesondere kausal halbgeordnete (z.B. [BSS91]), lassen sich ggf. im direct-Parameter durch Ersatz des Typs boolean durch einen Aufzählungtyp spezifizieren, der Zwischenstufen zwischen Ordnungslosigkeit und Totalordnung kausaler Abhängigkeiten ausdrücken soll. 163 More consistency models, in particular causal semi-ordered (eg [BSS91]), can be, if appropriate, direct-parameters by replacement of the type boolean specifying by an enumerated type, the intermediate stages between disorderliness and total order to express causal dependencies.

164Falls diese indivuelle Einstellmöglichkeit nicht benötigt wird, kann man sie auch in die Parameter von lock verschieben und dadurch die Schnittstelle vereinfachen. Welche Semantik sich durch individuelle Einstellungen ergeben soll und ob diese im Sinne eines bestimmten semantischen Modells überhaupt gültig ist oder zurückgewiesen werden muss, kann auch (teilweise) in der konkreten Baustein-Implementierung der Bearbeiter-Instanz festgelegt werden. Ansonsten hat der Aufrufer die Auswahl aus einer ungeheueren Vielzahl von Semantiken, die er durch seine Parameter-Wahl vorgeben kann. Als sehr einfaches Beispiel lässt sich durch eine leere Menge von Qudrupeln spezifizieren, dass keine funktionalen Abhängigkeiten bestehen; dies kann bei der Initialisierung oder beim Löschen/unbedingten Überschreiben des Dateninhaltes durchaus vorkommen und zusammen mit der Rückdatierungs-Möglichkeit auf der virtuellen Zeitachse die Parallelität dieses evtl. langdauernden Vorgangs mit anderen Aktivitäten steigern. 164 If this indivual adjustment is not needed, you can move from lock and thus simplify the interface them into the parameters. Which semantics should result from individual settings and whether this is valid or rejected in the sense of a certain semantic model can also be determined (partially) in the concrete building block implementation of the engineer instance. Otherwise, the caller has the choice of a tremendous variety of semantics, which he can specify by his parameter choice. As a very simple example, an empty set of queues can be used to specify that there are no functional dependencies; This can occur during the initialization or deletion / unconditional overwriting of the data content and, together with the backdating option on the virtual time axis, increase the parallelism of this possibly long-lasting process with other activities.

165Im Unterschied zu [CL85] lässt sich ein Schnappschuss auch rückwirkend in der virtuellen Zeitachse machen. 165 In contrast to [CL85], a snapshot can retroactively make in the virtual timeline.

166Bisher wurde Versionierung in Datenbanken offenbar nur zur Entkoppelung zwischen Lesern und Schreibern eingesetzt. Das hier vorgestellte Modell ermöglicht dagegen prinzipiell auch die Entkoppelung zwischen parallel aktiven Schreibern; Einschränkungen ergeben sich lediglich aus den kausalen Abhängigkeiten.So far, 166 versioning was in databases seem only for decoupling between readers and Used recorders. In contrast, the model presented here, in principle, also allows the decoupling between parallel active recorders; Restrictions arise only from the causal dependencies.

167Die klassischen Flaschenhals-Probleme verteilter Systeme, insbesondere die durch Latenzen verursachten, lassen sich ebenfalls unter dem Aspekt sich widersprechener Optimierungs-Ziele (Tradeoffs) betrachten. Interessant wäre eine Vereinheitlichung der Darstellung dieses Gebiets mit den hier aufgeworfenen Tradeoffs. 167 The classic bottleneck problems of distributed systems, particularly that caused by latency, can also be from the point of resisting sprechener optimization objectives (trade-offs) look. It would be interesting to unify the presentation of this area with the trade-offs raised here.

168Eine griffige Formel zur Charakterisierung beider Extreme könnte auf dem Hintergrund der Betrachtung von Locks als Container auf der virtuellen Zeitache folgendermassen lauten: Bei transaktionaler Semantik werden Container so lange wie möglich offen gehalten (um sie ggf. für invalide erklären zu können), beim wechselseitigen Ausschluss werden Container dagegen so früh wie möglich geschlossen. 168 A catchy phrase to characterize both extremes could read as follows Locks as a container on the virtual Zeitache on the background of consideration: In transactional semantics containers are kept as long as possible open (to them if necessary to declare invalid), the mutual Exclusion, containers are closed as early as possible.

Claims (4)

Verfahren zur Regulierung des Datenzugriffs bei einem aus mehreren Einzelsystemen bestehenden System auf Daten wenigstens einer Datenspeichereinrichtung, bei dem die Einzelsysteme sich freie Daten- oder Adressenbereiche der Datenquelle reservieren und die reservierten Bereiche für einen Zugriff durch andere Einzelsysteme dann gesperrt sind, wobei die Reservierungen (Locks) eine örtliche und eine zeitliche Komponente besitzen.Method of regulating data access a system consisting of several individual systems on data at least a data storage device in which the individual systems are free Reserve data or address ranges of the data source and the reserved areas for an access by other individual systems are then locked, wherein the reservations (locks) a local and have a temporal component. Verfahren zur Regulierung des Datenzugriffs auf Daten wenigstens einer Datenspeichereinrichtung, bei dem Adressenbereiche und/oder Teiladressenbereiche der Datenspeichereinrichtung dadurch verschoben werden, dass unter Beibehaltung der physischen Adressen die Zuordnung von logischen Adressen zu den physischen Adressen gemäß der Verschiebeoperation geändert wird.Method for regulating data access to data at least one data storage device in which address ranges and / or partial address areas of the data storage device thereby be moved that while preserving the physical addresses the assignment of logical addresses to the physical addresses according to the shift operation changed becomes. Verfahren zur Regulierung des Datenzugriffs bei einem aus mehreren Einzelsystemen bestehenden System auf wenigstens eine Datenspeichereinrichtung, bei dem die Einzelsysteme sich freie Daten- oder Adressenbereiche der Datenspeichereinrichtung reservieren und die reservierten Bereiche für einen Zugriff durch andere Einzelsysteme dann gesperrt sind, wobei gegenüber den direkt benötigten Bereichen spekulativ vergrößerte Bereiche reserviert werden.Method for regulating data access in a system consisting of several individual systems on at least one Data storage device in which the individual systems are free data or reserve address areas of the data storage device and the reserved areas for an access by other individual systems are then locked, wherein across from the directly needed Areas speculatively enlarged areas reserved. Verfahren nach Anspruch 3, dadurch gekennzeichnet, dass der jeweils über den direkt benötigten Bereich hinausgehende reservierte Erweiterungsbereich bei einer entsprechenden Reservierungsanfrage seitens eines anderen Einzelsystems oder einer Datenspeichereinrichtung wenigstens teilweise freigegeben wird.Method according to claim 3, characterized that each over the directly needed Area reserved reserved expansion area at a corresponding reservation request from another individual system or a data storage device at least partially released becomes.
DE10246369A 2002-09-30 2002-09-30 Regulating data access to data of at least one data memory involves individual systems reserving data or address areas of data source, blocking against access by other individual systems with locks with local and temporal components Withdrawn DE10246369A1 (en)

Priority Applications (6)

Application Number Priority Date Filing Date Title
DE10246369A DE10246369A1 (en) 2002-09-30 2002-09-30 Regulating data access to data of at least one data memory involves individual systems reserving data or address areas of data source, blocking against access by other individual systems with locks with local and temporal components
DE10393434T DE10393434D2 (en) 2002-09-30 2003-09-29 A method of regulating data access in a multi-system system to at least one data storage device
AU2003270288A AU2003270288A1 (en) 2002-09-30 2003-09-29 Method for regulating access to data in at least one data storage device in a system consisting of several individual systems
PCT/EP2003/010792 WO2004031954A2 (en) 2002-09-30 2003-09-29 Method and devices for accessing an individual system in a storage area of a data storage device
PCT/EP2003/010794 WO2004031955A2 (en) 2002-09-30 2003-09-29 Method for regulating access to data in at least one data storage device in a system consisting of several individual systems
US10/529,435 US20060168413A1 (en) 2002-09-30 2003-09-29 Method for regulating access to data in at least one data storage device in a system consisting of several individual systems

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
DE10246369A DE10246369A1 (en) 2002-09-30 2002-09-30 Regulating data access to data of at least one data memory involves individual systems reserving data or address areas of data source, blocking against access by other individual systems with locks with local and temporal components

Publications (1)

Publication Number Publication Date
DE10246369A1 true DE10246369A1 (en) 2005-02-03

Family

ID=33559691

Family Applications (1)

Application Number Title Priority Date Filing Date
DE10246369A Withdrawn DE10246369A1 (en) 2002-09-30 2002-09-30 Regulating data access to data of at least one data memory involves individual systems reserving data or address areas of data source, blocking against access by other individual systems with locks with local and temporal components

Country Status (1)

Country Link
DE (1) DE10246369A1 (en)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE102011057103A1 (en) 2011-12-28 2013-05-02 Kiekert Aktiengesellschaft Method for protecting data in computer network, involves reading existing data for physical separation of memory from computer networks with limit time

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE102011057103A1 (en) 2011-12-28 2013-05-02 Kiekert Aktiengesellschaft Method for protecting data in computer network, involves reading existing data for physical separation of memory from computer networks with limit time

Similar Documents

Publication Publication Date Title
Orend Analysis and classification of NoSQL databases and evaluation of their ability to replace an object-relational Persistence Layer
Penney et al. Class modification in the GemStone object-oriented DBMS
DE202014010938U1 (en) Omega name: name generation and derivation
US10936574B2 (en) System and method for use of lock-less techniques with a multidimensional database
KR100313844B1 (en) Locking tool data objects in a framework environment
Small et al. Vino: An integrated platform for operating system and database research
Haldar SQLite Database System Design and Implementation (Version 2):(See other editions and books at https://books. google. com/books/? id= zSbxCwAAQBAJ and decide one)
Kumar Mitigating the effects of optimistic replication in a distributed file system
Ntzik Reasoning about POSIX file systems
DE10246369A1 (en) Regulating data access to data of at least one data memory involves individual systems reserving data or address areas of data source, blocking against access by other individual systems with locks with local and temporal components
Sherman Architecture of the Encina distributed transaction processing family
Prinz et al. Operational semantics of transactions
Ezeife et al. Horizontal class fragmentation in distributed object based systems
Juyal et al. Achieving Starvation-Freedom with Greater Concurrency in Multi-Version Object-based Transactional Memory Systems
Kyte Expert One-on-One Oracle
Wilkes Programming Methodologies for Resilience and Availability
LaBorde et al. Dynamic Transactional Transformation
Panadiwal et al. A high performance and reliable distributed file facility
McCue Developing a class hierarchy for object-oriented transaction processing
Langworthy et al. Storage Class Extensibility in the Brown Object Storage System
Spillane Efficient, Scalable, and Versatile Application and System Transaction Management for Direct Storage Layers
Eisl Conflict Aware Network File System Based on a Relational Database
Schröder Durability and Contention in Software Transactional Memory
McNamee Virtual memory alternatives for transaction buffer management in a single-level store
McEvoy E**: Porting the E database language to Amadeus

Legal Events

Date Code Title Description
ON Later submitted papers
8143 Lapsed due to claiming internal priority