-
Diese
Erfindung betrifft allgemein Verbesserungen an Rechnersystemen für Netzwerkumgebungen und
insbesondere die flexible eindeutige Festlegung von Ressourcen-Namen.
-
Die
Namensauflösung
ist eine grundlegende Funktion, die für den Zugriff auf Betriebssysteme
und Netzwerkobjekte wie zum Beispiel Hosts, Drucker, Dateien und
elektronische Briefkästen
notwendig ist. Jedes Objekt ist seinen Benutzern gewöhnlich durch
einen Namen und dem System, das es unterstützt, durch eine Objektkennung
bekannt, die als Adresse bezeichnet wird. Ein Namenssystem löst die Namen
von Objekten, die es unterstützt,
in Adressen auf. Die Gruppe der Namen bildet den Namensraum, und
die Gruppe der Adressen bildet den Adressraum für dieses System.
-
Einige
Beispiele von vorhandenen Namenssystemen sind das Unix-Dateisystem, das
in "The UNIX time-sharing
system" von D. Ritchie,
K. Thompson, Communication ACM, Seiten 365 bis 375 (1974) erörtert wird;
der Domänennamenserver,
der in "Development
of the Domain Naming System" von
P. Mockapetris, ACM, Seiten 123 bis 133 (1988) erörtert wird;
das Profilnamenssystem, das in "The
Profile Naming System" von
L. Peterson, ACM Transactions on Computer Systems 6 (4), Seiten
341 bis 364 (1988) erörtert
wird; und der "Global
directory server",
der in "Designing
a Global Name Service" von
B. Lampson, ACM, Seiten 1 bis 10 (1986) erörtert wird.
-
Jedes
dieser vorstehend genannten Systeme hat eine bestimmte Syntax für Namen
und einen Auflösungsmechanismus,
der diese Namen in Adressen auflöst.
Im Allgemeinen bestehen Namen in einem hierarchischen Namensraum
aus mehreren Komponentennamen, "component_names", die durch Begrenzer
voneinander getrennt sind. Namen in Namensräumen, die auf Attributen beruhen,
enthalten Paare vom Typ <attribute_type
= attribute_value>,
die in "Understanding
Naming in Distributed Systems" von
Comer, E. Douglas und Larry L. Peterson, Distributed Computing,
Seiten 51 bis 60 (1989) erörtert
werden. Die Auflösungsmechanismen
in all diesen Systemen hängen
von der jeweiligen Namenssyntax ab, und während alle Auflösungsmechanismen
einen Namen in eine Adresse auflösen,
müssen
aktuelle Namenssysteme zusätzliche Funktionen
unterstützen
und eine höhere
Flexibilität
bei der Auswertung der Namen bieten, damit sie aufkommende Namensstandards
wie zum Beispiel X.500 unterstützen
können.
-
Weitere
Beispiele für
Systeme nach dem Stand der Technik, die zur Erkennung von Rechnerressourcen
dienen, sind in der US-Patentschrift
4 914 571 mit dem Titel "Locating
Resources in Computer Networks" und
der US-Patentschrift 4 825 354 mit dem Titel "Method of File Access in a Distributed
Processing Computer Network" offen
gelegt. Beispiele von früheren
Arbeiten der Erfinder im Bereich von Namensverarbeitungssystemen
sind unter anderem EP 260458-A mit dem Titel "Operating System for Networking Processor", wobei das System
so ausgelegt ist, dass es eine Netzwerk-Architektur erkennt, die
für einen
erweiterten Einheiten-Dateiaufruf erforderlich ist, sowie EP 204994-A
mit dem Titel "Generalised
directory data model",
bei dem abgebildete Daten in Bezug auf Namen usw. in Datenbanken
gespeichert und Such- und Aktualisierungsoperationen von einem Algorithmus
gesteuert werden.
-
Die
US-Patentschrift 4 644 470 und die US-Patentschrift 4 718 005 erörtern ebenfalls
Verfahren zur Verwendung von Aliasnamen, um den Datenaustausch über ein
gewöhnliches
Benutzernetzwerk zu vereinfachen.
-
Es
ist eine Aufgabe der vorliegenden Erfindung, ein System und ein
Verfahren zur Erstellung und zur Auflösung von Ressourcen-Namen in einem Namenssystem
bereitzustellen, das eine höhere
Flexibilität
sowohl in Bezug auf die Namenssyntax als auch auf die Unterstützung von
aufkommenden Namensstandards ermöglicht.
-
Erfindungsgemäß wird eine
Vorrichtung zur Auflösung
von Namen bereitgestellt, die einer oder mehreren Adressen von Objekten
entsprechen, welche sich auf einem oder mehreren Rechnersystemen
befinden, wobei die Vorrichtung Folgendes umfasst: (a) Speichermittel,
um eine Vielzahl von Datenstrukturen zu speichern; (b) Mittel, um
die Namen in Zeichenfolgen zu gliedern; (c) Mittel, um eine erste
Zeichenfolge in einer ersten Datenstruktur mit einer zweiten Datenstruktur
zu vergleichen und um eine Adresse abzurufen; (d) Mittel, um eine
zweite Zeichenfolge in einer zweiten Datenstruktur mit einem Objekt
in einem bestimmten Rechnersystem zu vergleichen und um eine Adresse
abzurufen; (e) Namensgrenze-Mittel, um die Syntax eines bestimmten
Namenssystems zu trennen; und (f) Visum-Mittel, die auf einem vorhandenen
Namenssystem beruhen, um von einem ersten System über eine
Grenze in ein zweites System zu wechseln.
-
Darüber hinaus
wird ein Verfahren zur Auflösung
von Namen bereitgestellt, die einer oder mehreren Adressen von Objekten
entsprechen, welche sich auf einem oder mehreren Rechnersystemen
befinden, wobei das Verfahren die folgenden Schritte umfasst: (a)
Speichern einer Vielzahl von Datenstrukturen; (b) Gliedern der Namen
in Zeichenfolgen; (c) Vergleichen einer ersten Zeichenfolge in einer
ersten Datenstruktur mit einer zweiten Datenstruktur und Abrufen
einer Adresse; und (d) Vergleichen einer zweiten Zeichenfolge in
einer zweiten Datenstruktur mit einem Objekt in einem bestimmten
Rechnersystem und Abrufen einer Adresse; (e) Trennen der Syntax
eines bestimmten Namenssystems; und (f) Überschreiten einer Systemgrenze
durch Verarbeitung eines Visums.
-
Damit
sich die Erfindung besser verstehen lässt, wird nun eine bevorzugte
Ausführungsform
der Erfindung unter Bezugnahme auf die beigefügten Zeichnungen beschrieben.
-
1 ist
ein Blockschaltbild eines PC-Systems gemäß der vorliegenden Erfindung;
-
2 zeigt
ein Netzwerk aus den in 1 dargestellten Arbeitsplatzrechnern,
die gemäß der vorliegenden
Erfindung über
einen Datenübertragungsadapter 34 miteinander
verbunden sind;
-
3a ist
eine Darstellung eines Telefonsystems, die einen Adressraum zeigt,
der ähnlich
den Rechnersystem-Adressen ist, die gemäß der vorliegenden Erfindung
verwaltet werden;
-
3b stellt
ein Namenssystem gemäß der vorliegenden
Erfindung dar, das aus vier Komponenten besteht;
-
3c stellt
einen Namensraum N gemäß der vorliegenden
Erfindung dar;
-
4 zeigt
eine Datenstruktur zur Auflösung
von Namen gemäß der vorliegenden
Erfindung;
-
5 ist
ein Flussdiagramm, das die Erstellung eines absoluten Namens gemäß der vorliegenden
Erfindung zeigt;
-
6 ist
ein Flussdiagramm, das die ausführliche
Logik in Verbindung mit der Erstellung eines relativen Namens in
einem hierarchischen Namensraum gemäß der vorliegenden Erfindung
zeigt;
-
7 ist
ein Flussdiagramm der ausführlichen
Logik in Verbindung mit der Erstellung eines Namens in einem einzelnen
Namensraum gemäß der vorliegenden
Erfindung;
-
8 ist
ein Flussdiagramm der ausführlichen
Logik zur Erstellung eines kaskadierten Namens gemäß der vorliegenden
Erfindung;
-
9 ist
ein Flussdiagramm, das die ausführliche
Logik einer Auflösungsfunktion
für einen
Namensraum gemäß der vorliegenden
Erfindung zeigt;
-
10 ist
eine weitere ausführliche
Logik gemäß der vorliegenden
Erfindung, die in Verbindung mit der in Bezug auf 9 erörterten
Logik verwendet wird;
-
11 stellt
eine Datenstruktur einer Referenztabelle gemäß der vorliegenden Erfindung
dar, die in 9, in der die Verarbeitung ausführlich dargelegt
wird, erörtert
wird;
-
12 veranschaulicht
eine Datenstruktur zur Auflösung
von kaskadierten Namen gemäß der vorliegenden
Erfindung;
-
die 13, 14 und 15 sind
Flussdiagramme, die die ausführliche
Logik darlegen, welche der Auflösung
von kaskadierten Namen gemäß der vorliegenden
Erfindung entspricht;
-
16 ist
die ausführliche
Logik in Verbindung mit der Grenzfunktion gemäß der vorliegenden Erfindung;
-
die 17 und 18 sind
Flussdiagramme, die die ausführliche
Logik der erweiterten Namensauflösung
für einen
einzelnen Namensraum gemäß der vorliegenden
Erfindung zeigen;
-
19 ist
ein Flussdiagramm, das die zusätzliche
ausführliche
Logik der erweiterten Namensauflösung
für einen
einzelnen Namensraum gemäß der vorliegenden
Erfindung zeigt;
-
20 ist
ein Flussdiagramm, das die ausführliche
Logik einer Grenzfunktion gemäß der vorliegenden Erfindung
darstellt; und
-
21 ist
eine Zeichnung einer Grenztabellen-Datenstruktur gemäß der vorliegenden
Erfindung.
-
Die
Erfindung wird vorzugsweise in einer repräsentativen, in 1 dargestellten
Hardware-Umgebung in die Praxis umgesetzt, die eine typische Hardware-Konfiguration
eines Arbeitsplatzrechners gemäß der vorliegenden
Erfindung zeigt, welche eine Zentraleinheit 10 wie zum
Beispiel einen herkömmlichen
Mikroprozessor und mehrere andere über einen Systembus 12 miteinander
verbundene Einheiten umfasst. Der in 1 gezeigte
Arbeitsplatzrechner enthält
einen Direktzugriffspeicher (RAM) 14, einen Nur-Lese-Speicher
(ROM) 16 und einen E/A-Adapter 18, um periphere
Einheiten wie zum Beispiel die Platteneinheiten 20 und
die Bandlaufwerke 40 an den Bus anzuschließen, einen
Benutzerschnittstellenadapter 22 für den Anschluss einer Tastatur 24,
einer Maus 26, eines Lautsprechers 28, eines Mikrofon 32 und/oder
anderer Benutzerschnittstellen-Einheiten wie zum Beispiel eine berührungsempfindliche
Einheit (nicht gezeigt) zum Anschluss an den Bus, einen Datenübertragungsadapter 24,
um den Arbeitsplatzrechner an ein Datenverarbeitungsnetzwerk anzuschließen, und
einen Bildschirmadapter 36, um den Bus an eine Anzeigeeinheit 38 anzuschließen.
-
2 zeigt
ein Netzwerk aus den in 1 gezeigten Arbeitsplatzrechnern,
die über
den Datenübertragungsadapter 34 miteinander
verbunden sind. Jeder Arbeitsplatzrechner hat ein Namenssystem,
und jede der Arbeitsplatzrechner-Verbindungen wird als Namensgrenze
bezeichnet. Namensgrenzen können
bei der Auflösung
von Namen verwendet werden, die sich gegebenenfalls in einer verteilten
Datenverarbeitungsumgebung über
zwei oder mehr Namensräume
erstrecken. Eine Namensgrenze zwischen zwei Namensräumen trennt
die zur Verbindung der beiden Namensräume benötigte Information, während gleichzeitig
die Eigenständigkeit
und die Unabhängigkeit
eines jeden Namensraums erhalten bleiben. Für solche Konzepte wie Namen, Adressen,
Namensräume
und Auflösungsfunktionen
gibt es formale Definitionen. Eine Realisierung einer Namensgrenze
wird anhand eines Beispiels eines Namens, der sich über mehrere
Namensräume
erstreckt, ausführlich
beschrieben, und es wird erörtert,
wie die Namen unter Verwendung von Namensgrenzen aufgelöst werden.
-
Die
Namensauflösung
ist eine grundlegende Funktion, die für den Zugriff auf Betriebssysteme
und Netzwerkobjekte wie zum Beispiel Hosts, Drucker, Dateien und
elektronische Briefkästen
notwendig ist. Jedes Objekt ist einem Benutzer gewöhnlich durch
einen Namen und dem System, das es unterstützt, durch eine Objektkennung
bekannt, die als Adresse bezeichnet wird. Ein Namenssystem löst die Namen
von Objekten, die es unterstützt,
in Adressen auf. Die Gruppe der Namen bildet den Namensraum, und
eine Gruppe von Adressen bildet den Adressraum für dieses System. Folgende Systeme
sind Beispiele für
vorhandene Namenssysteme: ein Unix-Dateisystem, ein Domänennamenserver
(DNS), ein Profilnamenssystem, ein universeller Verzeichnisdienst
(Universal Directory Service, UDS) und der globale Verzeichnisserver.
Jedes dieser Systeme hat eine bestimmte Syntax für Namen und einen Auflösungsmechanismus,
der diese Namen in Adressen auflöst.
Im Allgemeinen bestehen Namen in einem hierarchischen Namensraum
aus mehreren Komponentennamen, "component_names", die durch Begrenzer
voneinander getrennt sind. Namen in Namensräumen, die auf Attributen beruhen,
enthalten Paare. Die Auflösungsmechanismen
hängen
von der jeweiligen Namenssyntax ab, und alle Auflösungsmechanismen
lösen zwar
einen Namen in eine Adresse auf, doch sind manche so ausgelegt,
dass sie zusätzliche
Funktionen unterstützen
und eine höhere Flexibilität bei der
Art und Weise, in der sie Namen auswerten, aufweisen.
-
Bei
dem Versuch, auf ein Objekt zuzugreifen, dessen Name component_names
von mehreren Namensräumen
enthält,
von denen jeder von einem anderen Namenssystem, möglicherweise
mit einer anderen Namenssyntax, unterstützt wird, wie zum Beispiel
auf eine Datei auf einem fernen Host, treten zwei grundlegende Probleme
auf. Das erste Problem besteht in der Frage, wie ein solcher Name,
mit einer möglicherweise konfliktbehafteten
Syntax zwischen seinen Komponenten, erstellt werden soll. Das zweite
Problem besteht in der Frage, wie dieser Name aufgelöst werden
soll.
-
Betrachten
wir ein Beispiel einer fernen Datei. Dateinamen in einem Unix-Dateisystem
werden über den
Pfadnamen </dir1/dir2/file> angegeben, und Host-Namen
in Domänennamenservern
haben die Syntax <host.domain1.domain2.topdomain>. Der Name einer fernen
Datei sollte component_names mit den beiden vorstehend genannten
Syntax-Bezeichnungen enthalten. Das zweite Problem, die Namensauflösung, wird
dadurch verschärft,
dass die meisten Namenssysteme in Servern integriert sind, die andere
Dienste bereitstellen. Ein Dateisystem ermöglicht Sicherheitsprüfungen von
Benutzer-Genehmigungen für
den Zugriff auf Dateien, und es löst den Namen einer Datei in
eine Kennung auf. Das Domänennamenssystem
ordnet einer Adresse einen Host-Namen zusammen mit der Weiterleitungsfunktion
des Systems zu, um Nachrichten an diesen Host zu übermitteln.
-
Es
gibt zahlreiche verteilte Anwendungen und Namenssysteme, wobei jede
Anwendung beziehungsweise jedes Namenssystem die vorstehenden Probleme
auf eine ganz bestimmte Weise angeht. DNS-Namenssysteme reservieren
zum Beispiel eine Vielzahl von Zeichen, um Komponenten eines Namens,
die vom DNS aufgelöst
werden können,
von denjenigen zu trennen, die nicht aufgelöst werden können. Das reservierte Zeichen ":" trennt einen Domänennamen eines Host vom Namen
eines Objekts auf einem bestimmten Host. Der Name <local_part : domain_name> besagt, dass der Domänenname, "domain_name", vom DNS in eine Adresse
eines Hosts aufgelöst
werden soll, während "local_part" von diesem Host
aufgelöst
werden soll. Auch elektronische Briefkästen werden als user@domain
oder allgemein als local_part@domain ausgewiesen. Diese Vorgehensweise
macht es jedoch erforderlich, dass das Trennzeichen in beiden Namensräumen reserviert wird.
Eine andere Herangehensweise besteht darin, ein Namensformat von
einem Namensraum einem anderen Namensraum durch eine Verbindungsbrücke (Gateway)
zwischen den beiden Namensräumen
zuzuordnen.
-
Die
Erfindung legt ein neues System und ein neues Verfahren zur Erstellung
und zur Auflösung
von Namen über
mehrere Namensräume
offen, die als kaskadierte Namen ("Cascaded Names") bezeichnet werden.
-
Objekte, Systeme und Adressen
-
Ein
System ist als eine endliche Menge von Objekten definiert. Die Objekte
in einem System haben ganz bestimmte Kennungen, die als Adressen
bezeichnet werden. Ein Objekt kann in mehr als einem System vorhanden
sein, es hat aber für
jedes System, in dem es vorhanden ist, eine Adresse. Adressen müssen in einem
System eindeutig sein, und Adressen desselben Objekts in verschiedenen
Systemen können,
müssen aber
nicht unterschiedlich sein, während
Adressen von verschiedenen Objekten in demselben Systemen jedoch
unterschiedlich sind. Ein bestimmter Bildschirmadapter 36 in
dem in 1 gezeigten Arbeitsplatzrechner hat in 2 zum
Beispiel eine eindeutige Adresse für das System 220,
das System 240, das System 260 und das System 280.
-
Ein
System kann auch ein Objekt in einem größeren System sein, wobei das
System in diesem Fall eine Adresse in diesem größeren System hat. Ein Host-System
kann zum Beispiel über
viele einzelne Arbeitsplatzrechner verfügen, die mit dem Host-System verbunden
sind, wobei jeder Arbeitsplatzrechner ein einzelnes System bildet.
Ein System, das kein Objekt in einem größeren System ist, wird als
Basissystem (root system) bezeichnet. In 2 ist jeder
der Arbeitsplatzrechner 220, 240, 260 und 280 ein
Basissystem. Basissysteme haben eigene Adressen, und es können mehrere
Basissysteme vorhanden sein. DNS und X.500 sind Beispiele für einzelne
Basissysteme.
-
Eine
absolute Adresse eines Objekts wird rekursiv wie folgt festgelegt.
Wenn sich ein Objekt in einem Basissystem befindet, ist seine Adresse
eine absolute Adresse. Wenn sich das Objekt nicht in einem Basissystem
befindet, wird seine absolute Adresse von der absoluten Adresse
dieses Systems festgelegt, die mit der Adresse des Objekts in dem
System verknüpft
ist. Der Begriff Adresse bezeichnet eine Adresse eines Objekts in
einem System. Die absolute Adresse eines Objekts wird zu dem Zeitpunkt,
zu dem sie verwendet wird, ausdrücklich
angegeben.
-
Betrachten
wir ein Telefonsystem in den USA als ein Basissystem. Dieses System
besteht aus verschiedenen Gebietssystemen (area systems). Jedes
Gebietssystem wiederum besteht aus Distriktsystemen (district systems),
und jedes Distriktsystem besteht aus einer großen Anzahl von Telefonen. Eine
Darstellung des Telefonsystems ist in 3 gezeigt.
Das Telefonsystem hat eine Adresse, die aus der einzelnen Ziffer "1" besteht, die als Telefonsystem-Code
der USA bezeichnet wird. Da Gebietssysteme Objekte in demselben
Telefonsystem sind, haben sie eigene Adressen, die als "Gebiets-Codes" ("area codes") bezeichnet werden.
Jeder Gebiets-Code 300 und 304 ist eine dreistellige
Ziffernfolge. Distriktsysteme, die zu demselben Gebietssystem gehören, haben
ebenfalls eigene Adressen, die als die "Distrikt-Codes" ("district
codes") 312 und 320 bezeichnet
werden. Jeder Distrikt-Code ist eine dreistellige Ziffernfolge.
Ebenso haben Telefone, die zu demselben Distriktsystem gehören, eigene
Adressen, die als Telefon-Codes 340, 342, 344, 346, 348 und 350 bezeichnet
werden. Jeder Telefon-Code ist eine vierstellige Ziffernfolge. Die
absolute Adresse eines Telefons, die als Telefonnummer bezeichnet
wird, ist eine Verknüpfung
der folgenden Adressen:
- – des Telefonsystem-Codes der
USA (1);
- – des
Gebiets-Codes des Gebietssystems, in dem sich das Telefon befindet;
- – des
Distrikt-Codes des Distriktsystems, in dem sich das Telefon befindet;
und
- – des
Telefon-Codes.
-
3b stellt
einen Namensraum N dar. Der Namensraum ist durch einen gerichteten
Graphen dargestellt. Jeder Knoten in dem Graphen ist über eine
gerichtete Kante mit einem oder mehreren Knoten verbunden und wird
mit einem component_name mit der Bezeichnung c_name bezeichnet.
Ein Knoten in dem Graphen ist als Wurzelknoten "root" bezeichnet,
und sein c_name lautet <null>.
-
3c stellt
ein Namenssystem dar, das aus vier Komponenten besteht. Die vier
Komponenten sind: ein Namensraum, bei dem es sich um eine Gruppe
von Namen der Objekte handelt, die von einem System unterstützt werden,
ein Zeichenbereich, der die Gruppe der Zeichen festlegt, die in
einem benutzerdefinierten Namen erlaubt sind, und die Zeichen, die
von dem System reserviert werden. Die Auflösungsfunktion löst einen über den
Zeichenbereich festgelegten Namen in eine Adresse eines Objekts
im Adressraum auf.
-
Namenssysteme
-
In
diesem Abschnitt führen
wir eine formale Definition von Namenssystemen ein. Komponenten
eines Namenssystems werden festgelegt, und die Funktion einer jeden
Komponente in dem System wird erörtert.
-
Namenssysteme
dienen zur Kennzeichnung einer Gruppe von Objekten über eine
vorab festgelegte Schnittstelle. Ein Namenssystem besteht aus vier
Komponenten:
- 1) einem Adressraum;
- 2) einem Zeichenbereich C;
- 3) einem Namensraum N; und
- 4) einer Auflösungsfunktion
R.
-
Die
Komponenten der Namenssysteme sind in 3b gezeigt
und werden wie folgt festgelegt. Ein Adressraum A ist eine Gruppe von
Adressen für
in dem Namensraum angegebenen Objekte. Jedes Namenssystem legt zwei
sieh gegenseitig ausschließende
Gruppen von Zeichen fest: eine reservierte Gruppe von Zeichen, die
als Zeichenbereich C bezeichnet und vom System zur Erstellung und
zur Auflösung
von Namen verwendet wird, und eine verfügbare Gruppe C', die in benutzerdefinierten
Komponenten der Objektnamen verwendet werden kann. Ein Namensraum
N ist als ein gerichteter Graph angegeben, wie in 3c gezeigt
ist. Jeder Knoten wird mit einer endlichen Folge von Zeichen gekennzeichnet,
die als Komponentenname, c_name, bezeichnet wird und den Knoten
ausweist. Ein Knoten in dem Graphen, der Wurzelknoten, hat die leere
Zeichenfolge als Komponentenname. Bei anderen Knoten sind Komponentennamen
endliche, nichtleere Folgen von Zeichen aus der zulässigen Zeichengruppe
C'.
-
Erstellung
eines Namens
-
Ein
Name aus einem Namensraum ist eine endliche Menge von Zeichen. Ein
absoluter Name eines Knotens n in einem Namensraum N ist definiert
als:
a_name(n) = <del><c_name1><del><c_name2> ... <del><c_namen>
wobei:
die
Bezeichnungen "c_namei" die
Bezeichnungen aller Knoten in dem Pfad vom Wurzelknoten zum Knoten
n in N sind.
-
Ein
relativer Name eines Knotens n von einem anderen Knoten m ist definiert
als:
r_name(m, n) = c_name(m+1) <del>c_name2> ... <del><c_namen>
wobei:
m
und n Knoten in einem Namensraum N sind und <n_name(m+1)> die Bezeichnungen
aller Knoten in dem Pfad vom Knoten m zum Knoten n in N sind.
-
Man
beachte, dass ein absoluter Name in dem Namensraum einem einzelnen
Knoten in dem Graphen entspricht. Auch sind zwei Namen gleichbedeutend,
wenn sie demselben Knoten entsprechen. wir bezeichnen einen Namen
von dem einen und auch von dem anderen Typ einfach als Namen, außer wenn
ganz bestimmte Punkte angesprochen werden müssen, die für einen der beiden Typen spezifisch
sind.
-
Ein
homogener Name ist ein Name, der aus Komponentennamen (c_names)
erstellt wird, die durch Begrenzer so voneinander getrennt sind,
dass c_names Elemente in einem Namensraum N darstellen und der Begrenzer <del> ein Element einer
reservierten Zeichenfolge für
ein Namenssystem S ist. Homogene Namen werden von der Auflösungsfunktion
R von S in Adressen aufgelöst.
-
Auflösungsfunktion
-
Bei
einem Namenssystem verwendet die Auflösungsfunktion R zwei Argumente:
einen absoluten Namen und einen relativen Namen (bei dem es sich
um die leere Zeichenfolge handeln kann), und sie gibt eine Adresse
zurück.
R wird wie folgt definiert:
R(a_name(m), r_name(m, n))
=
address(n), wenn a_name(m) und r_name(m, n) Namen in N sind
=
wird andernfalls, wenn address(n) die Adresse des Knotens n im Adressraum
A ist, nicht definiert.
-
R
löst einen
Namen in eine Adresse in demselben Namenssystem auf. R hängt vom
Zeichenbereich des Namenssystems ab. Im Einzelnen erkennt sie ein
Sonderzeichen, den Begrenzer <del>C, der das Ende eines
Komponentennamens c_name anzeigt.
-
Zu
Beispielen für
gebräuchliche
Namenssysteme zählen
Dateisysteme und Host-Namen in einem Netzwerk wie zum Beispiel der
Domänennamenserver.
Beim DNS verwendet die Funktion R einen Pfad im Format <host.domain.top_domain>, und sie gibt eine
Host-Adresse zurück.
Bei UNIX ähnlichen
Dateisystemen verwendet die Funktion R einen absoluten Namen wie
zum Beispiel /usr/lpp und einen relativen Namen dir/file und gibt
eine Dateikennung (Adresse) für
die Datei /dir1/dir2/file zurück.
Bei den Dateisystemen DOS und OS/2 verwendet ein absoluter Name
einer Datei das Format <drive:
\dir\file>. In diesem
Fall hat der Zeichenbereich zwei Trennzeichen, ":",
welches das Ende einer Laufwerk-Bezeichnung angibt, und "\", welches andere c_names trennt.
-
Kaskadierte
Namen
-
Die
vorstehende Erörterung
hat sich auf die Erstellung und die Auflösung von homogenen Namen beschränkt, die
c_names in demselben Namenssystem haben. Häufig muss jedoch auf ein Objekt
zugegriffen werden, das nicht mit einem homogenen Namen bezeichnet
werden kann, wie zum Beispiel eine Datei oder der elektronische
Briefkasten eines Benutzers auf einem fernen Host-Rechner, möglicherweise
in einem anderen Netzwerk. In diesem Fall befinden sich der Host-Name
und der Dateiname in unterschiedlichen Namenssystemen.
-
Es
sei angenommen, dass ein Name c_names von verschiedenen Namenssystemen
S1 und S2 mit den
Begrenzern <del1> und >del2> und den Auflösungsfunktionen
R1 beziehungsweise R2 enthält. Bei
der Auflösung
eines solchen Namens treten drei Probleme auf:
- 1)
Wie lässt
sich das Ende eines Komponentennamens c_name erkennen?
- 2) Welcher Zeichenbereich soll verwendet werden? und
- 3) Welche Auflösungsfunktion,
R1 oder R2, wird zur Auflösung
des Namens verwendet?
-
Man
beachte, dass <del2> gegebenenfalls
kein Element in C1 ist. Folglich kann <del2> in einem gültigen Knotennamen,
c_name, in S1 erscheinen.
-
Es
gibt zahlreiche verteilte Anwendungen, von denen jede die vorstehenden
Probleme auf eine ganz bestimmte Weise angeht. Die ARPANET-Internet-Domänennamenserver
erkennen zum Beispiel zwei Sonderzeichen: "." und "@". Server lassen Namen mit dem folgenden
Format gelten:
Name = local_component @ host.domain,
wobei
die Zeichenfolge rechts des Zeichens "@" einen
Hostnamen in dem Domänen-Namenssystem
angibt, und die Zeichenfolge links davon eine lokale Komponente
des Namens ist, die an diesem Host aufgelöst werden muss. Andere reservierte
Zeichen in S-Netzwerk-Anwendungen
verwenden andere Zeichen, um die Grenzen zwischen Namenssystemen
zu kennzeichnen, so zum Beispiel die Zeichen ":" und "%".
-
Probleme
treten auch in heterogenen verteilten Dateisystemen auf. Betrachten
wir den Fall, in dem ein Benutzer eines UNIX-ähnlichen
Betriebssystems Zugriff auf ein OS/2-Verzeichnis (oder ein DOS-Verzeichnis) benötigt. Bei
UNIX wird gewöhnlich
so vorgegangen, dass ein Stub-Verzeichnis erstellt und das OS/2-Verzeichnis
(oder das Laufwerk, das dieses Verzeichnis enthält) auf diesem Stub aufgesetzt
wird: Sei
a_name(stub) = /u/user_id/stub
der absolute
Name für
das Stub-Verzeichnis am Client und
C:\dir1\dir2
der Pfad
des OS/2-Verzeichnisses, auf das zugegriffen werden soll. Der Unix-Konvention
folgend ist der Pfad zu dir2 die Zeichenfolge:
a_name(stub)
= /u/user_id/C:\dir1\dir2,
wobei davon ausgegangen wird, dass
diese in das benötigte
Verzeichnis aufgelöst
wird. Man beachte, dass ":" ein gültiges Zeichen
für einen
UNIX-Dateinamen ist und "\" ignoriert wird.
Folglich löst
der Client die aufgesetzte Komponente in
c : dir1dir2
auf, wobei dieser Pfad nicht in das
benötigte
Verzeichnis aufgelöst
werden kann.
-
Es
bedarf einer systematischen Vorgehensweise zur Erstellung von kaskadierten
Namen mit n_names aus mehr als einem Namenssystem. Auch wird die
Auflösung
einer solchen Namensauflösungsfunktion
in einem vorhandenen Rechnersystem erörtert.
-
Erstellung
eines kaskadierten Namens
-
Ein
Name, der Komponentennamen aus mehr als einem Namenssystem enthält, wird
als kaskadierter Name bezeichnet. Sei
<name1> ein Name aus dem Namensraum
S1, dessen Begrenzer <del1> ist,
<name2> ein Name aus dem Namensraum
S2, dessen Begrenzer <del2> ist,
<visa> eine endliche, nichtleere
Folge von Zeichen, die <del1> nicht
enthält.
-
Dann
ist:
name = <name1> <del1> <visa> <del1> <name2>
ein kaskadierter
Name.
<del1> <del1> wird als Pass durch
S1 bezeichnet, und <visa> erlaubt den Eintritt
aus S1 in S2 mit Überschreitung
der Grenzen zwischen den beiden Namenssystemen.
-
Im
nächsten
Abschnitt wird das Konzept von Namensgrenzen vorgestellt, und es
werden zwei Algorithmen zur Verwendung von Grenzen bei der Auflösung von
kaskadierten Namen aufgezeigt.
-
Namensgrenzen
und Auflösung
von kaskadierten Namen
-
Namensgrenzen
werden bei der Auflösung
von Namen verwendet, die sich über
zwei oder mehr Namenssysteme, möglicherweise
in einer verteilten Umgebung, erstrecken. Eine Namensgrenze zwischen
zwei Namenssystemen trennt die für
die Verknüpfung
der beiden Systeme benötigten
Informationen, während
die Eigenständigkeit
und die Unabhängigkeit
eines jeden Systems erhalten bleiben.
-
Es
sei angenommen, dass ein kaskadierter Name aufgelöst werden
soll. Eine Namensgrenze zwischen S1 und S2 wird als Grenzauflösungsfunktion
(Border Resolution Function) definiert, die die Auflösung des
Passes in S1 und Visa verwendet, um das bei der Auflösung des
restlichen Teils des Namens zu verwendende Namenssystem festzulegen.
-
Bei
der Auflösung
eines Namens, der sich über
mehrere Namensräume
erstreckt, ist ein Mechanismus erforderlich, der dazu dient, die
Grenzen zwischen den beiden Namensräumen festzustellen und anzugeben, wann
der Übergang
von einem Namensraum in einen anderen erfolgen soll. Anwendungsprogramme
verwenden verschiedene Konventionen zur Angabe, wann ein Wechsel
zwischen mehreren Namenräumen
erfolgen soll. Zwei Algorithmen zur Überschreitung der Grenze, um
vom Namenssystem Si in das Namenssystem
S(i+1) zu gelangen, wobei die Grenzauflösungsfunktion
Bi verwendet wird, werden nachstehend erörtert.
-
Auflösung von kaskadierten Namen – Algorithmus
I:
-
Bei
diesem Algorithmus wird davon ausgegangen, dass die Auflösungsfunktion
Ri für
das Namenssystem Si so erweitert wird, dass
sie den Folgepass (<deli><deli>) erkennt und ihn als
das Ende von Komponentennamen deutet, die mit Hilfe von Ri aufgelöst
werden können.
Es wird ferner davon ausgegangen, dass Ri den
Begrenzer deli zurückschickt, der dann von der
folgenden Grenzfunktion verwendet wird, um das Ende von visai festzustellen. Folglich gilt für
namei = r_name (mi, ni),
der beim Knoten mi im
Namenssystem Si beginnt
Ri (a_name(mi), r_name(mi, ni)) = address(n)
wenn a_name (mi) & r_name(mi, ni) Namen in N
sind,
Ri (a_name(mi),
r_name(mi, ni) <deli><deli>)
= address(n'), deli
wenn
a_name (mi) & r_name(mi,
ni) Namen in N sind;
= andernfalls
undefiniert.
-
Der
kaskadierte Name
name = <name1><pass1><visa1><del1><name2>,
der an einem
Knoten ml im Namenssystem S1 beginnt, soll
in eine Adresse im Namenssystem S2 aufgelöst werden. "name" wird wie folgt aufgelöst:
R1
(a_name(m1), name) =
B1 (address(n1'), <visa1><del1><name2>) =
R2 (a_name(m2), <name2>)
=
address(n2) in S2
-
Man
beachte, dass address n1' gegebenenfalls
dieselbe Adresse wie address n1 ist. Ein Namenssystem kann bei dar
Auflösung
eines Passes einen Dereferenzierungsgrad (Alias) haben, der nur
in S1 sichtbar ist.
-
Im
Allgemeinen akzeptiert die Grenzfunktion B
i zwischen
S
i und S
i+1 als
Argumente eine Adresse für ein
Objekt im Namenssystem S
i und den restlichen
Teil des Namens ("name"), nachdem <name
1><pass
1>...<name
i><pass
i> aufgelöst worden
sind. B
1 verarbeitet <visa
1><del
i> und gibt das nächste Namenssystem
S
i+1 zur Auflösung von "name" und
den Startknoten bei S
i+1 an. B
i ruft
dann die Auflösungsfunktion
R
i+1 auf, um mit der Auflösung von
Namen fortzufahren.
-
Auflösung von kaskadierten Namen – Algorithmus
II
-
In
diesem Abschnitt wird ein zweiter Algorithmus vorgestellt, um in
vorhandenen Namenssystemen die Verwendung von Namensgrenzen zu ermöglichen,
ohne dass vom Algorithmus im Abschnitt 5.1 die erforderliche Änderung
an der Auflösungsfunktion
durchgeführt
werden muss. Bei diesem Algorithmus wird davon ausgegangen, dass
es eine zweistufige Hierarchie von Namenssystemen gibt. Es wird
angenommen, dass die vorhandenen Namenssysteme S1,
S2, ... SK in einem
auf Attributen beruhenden Namenssystem S Objekte sind. Für jedes
Objekt Si in S werden die folgenden Attribut-Typen
festgelegt:
- • Adresse A_Si in
S; (unterschiedliche Objekte haben unterschiedliche Adressen.)
- • Begrenzer <deli>;
- • eine
Auflösungsfunktion
Ri, die bei der Auflösung eines Namens in S1 aufzurufen ist; und
- • ein
optionaler Aliasname Ni, der von S in Ai aufgelöst
werden kann.
-
Der
kaskadierte Name
der am Knoten (m
1)
im Namenssystem S
1 beginnt, wird wie folgt
aufgelöst:
- 1. R1 wird aufgerufen,
um "name1" in
eine Adresse in S1 aufzulösen.
R1 (a_name(m1), r_name(m1, n1)) = address(n1).
- 2. Eine Grenzfunktion B1 wird aufgerufen,
um S2 und den Startpunkt von name2 zu ermitteln.
B1(A_S1, address(n1), visa1) = A_S2, a_name(m2))
-
Da
S ein auf Attributen beruhendes Namenssystem ist, stellt address_S2 ohne weiteres andere Attribute von S2, wie zum Beispiel R2 und
del2, fest.
- 3. Die
Schritte (1) und (2) werden für
i = 2, K – 1
wiederholt.
- 4. RK wird aufgerufen, um nameK aufzulösen.
RK (a_name(mK), r_name(mK, nK)) = address(nK)
- 5. R (a_name(n1), name) = address(n1)
bei K=1
= (address(nK), address(sK)) K>1
-
Diese
Architektur erfüllt
die Anforderung, alle Informationen zu trennen, die zur Verknüpfung von
Namenssystemen erforderlich sind, während sie es vermeidet, dass
an vorhandene Namensauflösungsfunktionen
Anforderungen gestellt werden.
-
AUSFÜHRLICHE
LOGIK
-
4 veranschaulicht
eine Datenstruktur zur Auflösung
von Namen gemäß der vorliegenden
Erfindung, die sich in einem Speicher oder auf einer Platte eines
Rechners befindet, wie in 1 gezeigt
ist. Die Datenstruktur kann als Teil einer relationalen Datenbank
realisiert werden, die sich im Speicher oder auf der Platte befindet.
Die Datenstruktur dient zur Auflösung
des bei der Bezugszahl 402 gezeigten Namens. In der Figur
wird <del> verwendet, um auf
einen festgelegten Begrenzer zu verweisen. Folglich wird der Name
aufgelöst,
indem bei 403 nach dem Anfangsbegrenzer in der Datenstruktur
gesucht wird. Die Datenstruktur ist eigentlich eine zweidimensionale
Anordnung, die Zeicheninformationen in dem einen Feld und ganzzahlige Adressinformationen
in dem anderen Feld enthält.
Wenn sich der Begrenzer bei 404 im Zeichen-Feld befindet, wird
die Adresse in dem mit diesem Feld verknüpften Feld mit den ganzen Zahlen
folglich als Zeiger auf die Position verwendet, an der mit dem Suchlauf
nach "<A><del>" begonnen werden
soll, 403. Wenn "<A><del>" aufgefunden wird,
wird die Adresse in dem verknüpften
Feld als Zeiger auf die Position verwendet, an der mit dem Suchlauf
nach "<B><del>" begonnen werden
soll, 408. Wenn "<B><del>" aufgefunden wird,
wird die Adresse in dem verknüpften
Feld mit den ganzen Zahlen als Zeiger auf die Position verwendet,
an der mit dem Suchlauf nach "<C>" begonnen werden soll, 403.
Wenn im Zeichen-Feld 407 die Entsprechung von "<C>" gefunden wird, ist
die Adresse in dem verknüpften
Feld mit den ganzen Zahlen die absolute Adresse des Objekts "C".
-
Die
Logik, die verwendet wird, um eine Datenstruktur gemäß der vorliegenden
Erfindung zu verarbeiten, beinhaltet eine Gruppe von einfachen,
für das
Namenssystem übliche
Funktionen. Die erste Funktion ist die Funktion LeftMost_String(string1,
string2). Diese Funktion durchsucht die Zeichenfolge, string1, von links nach rechts, bis sie mit string2 übereinstimmt
oder bis sie das Ende von string1 ohne Übereinstimmung
feststellt. Die Funktion gibt dann die Zeichenfolge in string1 links von string2 zurück. Üblicherweise
wird die Funktion verwendet, um nach einem Namen in einem Zeichen-Pufferspeicher
zu suchen, welcher aus mehreren, durch Begrenzer voneinander getrennten
Komponentennamen besteht, wobei die Funktion dann den äußersten
linken Komponentennamen zurückschickt.
Bei kaskadierten Namen wird diese Funktion auch verwendet, um einen
kaskadierten Namen zur Feststellung von <del><del> von links zu lesen.
Auf diese Weise schickt LeftMost_String(cascaded_name, <del><del>)
den äußersten linken
Namen in einem kaskadierten Namen zurück, der sich in einem Zeichen-Pufferspeicher
befindet.
-
Die
zweite Funktion lautet rightmost_charact(STRING), die das äußerste rechte
Zeichen in einer Zeichenfolge zurückschickt, welche die Bezeichnung
STRING trägt.
Die dritte Funktion lautet right_remainder (STRING, STRING1), welche die Zeichenfolge STRING1 von der äußersten rechten Position in
STRING entfernt und die restliche Zeichenfolge in der Zeichenfolge
mit der Bezeichnung STRING zurückschickt.
Die vierte Funktion lautet left_remainder (STRING, STRING1), und sie entfernt die Zeichenfolge STRING1 von der äußersten linken Position in STRING und schickt die
restliche Zeichenfolge in der Zeichenfolge mit der Bezeichnung STRING
zurück.
Die letzte einfache Funktion ist left_most (STRING, n), die die
n äußersten
linken Zeichen zurückschickt,
die sich in der Zeichenfolge STRING befinden.
-
5 ist
ein Flussdiagramm, das die Erstellung eines absoluten Namens gemäß der vorliegenden
Erfindung zeigt. Es handelt sich dabei um einen absoluten Namen
in einem hierarchischen Namensraum, wobei ganz am Anfang des Namensraums
begonnen wird. Der Name wird erstellt, indem der Begrenzer <del> und ein oder mehrere
Komponentennamen verwendet werden. Die Verarbeitung beginnt bei
der Bezugszahl 500, und die Steuerung wird sofort dem Eingabeblock 502 zum
Empfang des Zählers
K, des Begrenzungszeichens und der Komponentennamen (component_names)
1, 2, ... K übergeben.
-
Die
Daten werden über
einen Datenübertragungsadapter
empfangen, wie in 1 gezeigt ist. Im Funktionsblock 504 wird
a_name dem Begrenzungszeichen gleichgesetzt. Anschließend wird
am Entscheidungsblock 506 ein Schleifentest gestartet,
um festzustellen, ob alle Komponentennamen verarbeitet worden sind.
Wenn ja, schaltet die Steuerung zum Endgerät 518, und die Verarbeitung
ist abgeschlossen. Wenn jedoch noch weitere Komponentennamen zu
verarbeiten sind, wird im Funktionsblock 508 ein Zähler 1 auf
einen Anfangswert gesetzt, um eine Schleife zu starten.
-
Der
Funktionsblock 510 erstellt den absoluten Namen a_name,
indem er den vorhandenen a_name mit dem component_namei verknüpft. Am
Entscheidungsblock 512 wird dann ein Test durchgeführt, um
festzustellen, ob der K-te component_name verarbeitet worden ist.
Wenn ja, ist die Verarbeitung abgeschlossen, und die Steuerung schaltet
zum Endgerät 518.
Wenn nicht, wird an das Ende von a_name ein Begrenzer angefügt, wie
im Funktionsblock 514 gezeigt ist. Anschließend wird
der Zähler
i erhöht,
und die Steuerung schaltet zum Funktionsblock 510 zur weiteren
Verarbeitung.
-
6 ist
ein Flussdiagramm, das die ausführliche
Logik in Verbindung mit der Erstellung eines relativen Namens in
einem hierarchischen Namensraum gemäß der vorliegenden Erfindung
zeigt. Die Steuerung beginnt am Endgerät 600 und schaltet
sofort zum Eingabeblock 602, um den Zähler K und die component_names
1–K zu
empfangen. Die Daten können über einen
Datenübertragungsadapter
empfangen werden, wie in 1 gezeigt ist. Im Funktionsblock 604 wird
der relative Name auf das Zeichen null als Anfangswert gesetzt.
Als Nächstes
wird der Entscheidungsblock 606 verarbeitet, um festzustellen,
ob es keine Komponentennamen zur Verarbeitung gibt. Wenn der Zähler K den
Wert null hat, schaltet die Steuerung zum Endgerät 622, und die Verarbeitung
ist abgeschlossen. Wenn der Zähler
K ungleich null ist, wird eine Schleifenvariable am Funktionsblock 610 auf
den Anfangswert "1" gesetzt, und im
Funktionsblock 612 wird ein component_namei mit
dem relativen Namen verknüpft.
Am Entscheidungsblock 614 wird die Schleifenvariable i
dann mit K verglichen, um festzustellen, ob alle Komponentennamen
verarbeitet worden sind. Wenn i = K, ist die Verarbeitung abgeschlossen,
und die Steuerung schaltet zum Endgerät 622. Wenn i ungleich
K ist, schaltet die Steuerung zum Funktionsblock 616, in
dem ein Begrenzer an das Ende des relativen Namens angefügt wird.
Anschließend
wird der Schleifenindex i erhöht,
und die Steuerung schaltet zum Funktionsblock 612, um den
nächsten
component_name zu verarbeiten.
-
7 ist
ein Flussdiagramm der ausführlichen
Logik in Verbindung mit der Erstellung eines Namens in einem einzelnen
Namensraum unter Verwendung des absoluten Namens und des relativen
Namens und der einfachen Funktionen rightmost_character und rightmost_remainder.
Die Verarbeitung beginnt am Endgeräteblock 700, und die
Steuerung schaltet sofort zum Eingabeblock 702, um den
absoluten Namen, den relativen Namen und ein Begrenzungszeichen
zu empfangen. Der Funktionsblock 704 initialisiert eine
Namensvariable mit dem absoluten Namen. Die Steuerung schaltet dann
zum Entscheidungsblock 706, um das äußerste rechte Zeichen des absoluten
Namens zu prüfen,
um festzustellen, ob es das Begrenzungszeichen ist. Wenn kein Begrenzungszeichen
festgestellt wird, springt die Steuerung zum Funktionsblock 710.
Wenn ein Begrenzungszeichen festgestellt wird, wird der Begrenzer
im Funktionsblock 708 abgestreift, und im Funktionsblock 710 wird
der endgültige
Name erstellt, indem der absolute Name, das Begrenzungszeichen und
der relative Name miteinander verknüpft werden. Schließlich schaltet
die Steuerung zum Endgerät 712,
und die Verarbeitung ist abgeschlossen.
-
8 ist
ein Flussdiagramm der ausführlichen
Logik zur Erstellung eines kaskadierten Namens gemäß der vorliegenden
Erfindung. Die Verarbeitung beginnt am Endgeräteblock 800 und schaltet
sofort zum Eingabeblock 802, um einen Zähler K zu empfangen, der die
Höchstzahl
der beteiligten Namensräume,
die Begrenzer für
die Namensräume,
die von den Namensräumen
aufzulösenden
Namen und Visa angibt. Anschließend
schaltet die Steuerung zum Funktionsblock 804, um einen
cascaded_name auf den Anfangswert null zu setzen. Als Nächstes wird
am Entscheidungsblock 806 ein Test durchgeführt, um
festzustellen, ob der Zählstand
gleich null ist. Wenn ja, ist die Verarbeitung abgeschlossen, und
die Steuerung schaltet zum Endgeräteblock 820. Wenn
die Verarbeitung nicht abgeschlossen ist, wird ein Schleifenzähler i am
Funktionsblock 808 auf den Wert "1" gesetzt,
und es wird mit der Ausführung
einer Schleife begonnen. Der Funktionsblock 810 verknüpft namei mit dem cascaded_name. Daraufhin wird am
Entscheidungsblock 812 ein Test durchgeführt, um
festzustellen, ob i gleich K ist. Wenn ja, ist die Verarbeitung
abgeschlossen, und die Steuerung schaltet zum Block 820.
Wenn i ungleich K ist, werden zwei Begrenzungszeichen, visai und ein Abschlussbegrenzer am Funktionsblock 814 mit
dem kaskadierten Namen verknüpft.
Am Funktionsblock 816 wird dann der Schleifenzähler erhöht, und
die Steuerung schaltet zum Funktionsblock 810, um weitere
Namen zu verarbeiten.
-
9 ist
ein Flussdiagramm, das die ausführliche
Logik einer Auflösungsfunktion
für einen
Namensraum gemäß der vorliegenden
Erfindung zeigt. Die Verarbeitung beginnt bei 900 und schaltet
sofort zum Eingabeblock 910, um eine Stammadresse, einen
absoluten Namen, einen relativen Namen und ein Begrenzungszeichen
zu empfangen. Bei der Bezugszahl 912 wird die Steuerung
dann der Bezugszahl 600 von 6 übergeben,
um aus dem vorgegebenen absoluten Namen, dem relativen Namen und
dem Begrenzer einen Namen zu erstellen. Am Funktionsblock 914 wird
die Adresse dann auf die Stammadresse initialisiert, und im Funktionsblock 916 wird
der Name auf die äußersten
linken Zeichen des Namens initialisiert, nachdem das äußerste linke
Begrenzungszeichen entfernt worden ist. Als Nächstes wird am Entscheidungsblock 918 ein Test
durchgeführt,
um festzustellen, ob der Name jetzt gleich dem Null-Zeichen ist.
Wenn ja, ist die Verarbeitung abgeschlossen, und die Steuerung wird
dem Abschlussblock 920 übergeben.
Wenn der Name ungleich dem Null-Zeichen ist, wird der component_name
am Funktionsblock 924 als die Zeichenfolge links des erstmalig
auftretenden Begrenzers links vom Namen definiert. Eine Tabellensuchoperation
wird durchgeführt,
um die neue Adresse zu ermitteln. Die Tabellensuchoperation beinhaltet
die Auflösung
des absoluten Namens und des relativen Namens r_name, um rekursiv
LeftMost_String(name, del) aufzurufen und dadurch die Komponentennamen
zu erhalten und den Namen in eine Adresse aufzulösen, wie in der ausführlichen
Beschreibung von 4 erklärt ist.
-
Die
Tabelle ist in 11 gezeigt und wird mittels
einer Tabellensuchoperation abgefragt, wobei die Tabelle mit Hilfe
der aktuellen Adresse und des component_name nach einem Eintrag
durchsucht wird, bei dem der x-Eintrag 1100 gleich der
Adresse und der y-Eintrag 1102 gleich dem component_name
ist. Der entsprechende Eintrag in dem Eintrag "new_address" 1104 ist die neue Adresse,
die im Funktionsblock 930 von 9 als Ersatz
für den
Adressenwert verwendet wird. Im Funktionsblock 932 wird
der Name dann weiter verarbeitet, um den Komponentennamen zu entfernen.
Im Entscheidungsblock 940 wird daraufhin ein Test durchgeführt, um
festzustellen, ob der Name gleich dem Wert null ist. Wenn ja, ist
die Verarbeitung abgeschlossen, und die Steuerung schaltet zum Abschlussblock 920.
Wenn nicht, wird die Verarbeitung über die Bezugszahl 950,
die der Bezugszahl 1000 in 10 entspricht,
fortgesetzt, wobei im Entscheidungsblock 1002 sofort ein
Test durchgeführt
wird, um festzustellen, ob der Name gleich einem Begrenzungszeichen
ist. Wenn nicht, wird das Begrenzungszeichen im Funktionsblock 1006 vom
Namen abgestreift, und über
die Bezugszahl 1008 wird eine Verzweigung zur Bezugszahl 922 von 9 zum
Funktionsblock 924 vorgenommen. Wenn der Name gleich dem
Begrenzungszeichen ist, ist die Verarbeitung abgeschlossen, und
die Steuerung schaltet zum Endgerät 1004.
-
10 ist
eine weitere ausführliche
Logik gemäß der vorliegenden
Erfindung, die in Verbindung mit der in Bezug auf 9 erörterten
Logik verwendet wird. 11 stellt eine Datenstruktur
einer Referenztabelle gemäß der vorliegenden
Erfindung dar, die in 9, in der die Verarbeitung ausführlich dargelegt
wird, erörtert wird.
-
12 zeigt
eine Datenstruktur zur Auflösung
von kaskadierten Namen gemäß der vorliegenden
Erfindung, die sich in einem Speicher oder auf einer Platte eines
Rechners befindet, wie in 1 gezeigt
ist. Die Datenstruktur wird zur Auflösung des an der Bezugszahl 1200 gezeigten
Namens verwendet. Es gibt drei verschiedene, in dieses Beispiel einbezogene
Namenssysteme, nämlich
die Namenssysteme 1202, 1206 und 1208.
Die Kaskadierung von Namen bezieht sich auf die Auflösung eines
Namens mit Visum und Begrenzern über
Systemgrenzen hinweg in den jeweiligen für das betreffende System unverwechselbaren
Namen. Wenn ein in S1 1202 erstellter Name, der sich auf
ein Objekt im System S3 1208 bezieht, aufgelöst wird,
muss er bei 1204 folglich sein Visum über die mit der Grenze verknüpfte Listendatenstruktur
auflösen
lassen. Nachdem die äußersten
linken i Namen in einem kaskadierten Namen aufgelöst worden
sind, legt diese Funktion das nachfolgende Namenssystem fest, das
den Rest des kaskadierten Namens auflöst. Die Funktion verwendet
als Eingabeparameter die Adresse A_Si des vorhergehenden Namenssystems
Si, die Adresse_ni des letzten Namens in Si und visai.
Sie gibt die Adresse A_Si+1 des Namenssystems
Si+1 und den absoluten Namen a_name(mi+1) des Startknotens in Si+1 zurück. Da Si+1 ein Objekt in einem auf Attributen beruhenden
Namensraum ist, erkennt A_Si+1 sofort die
Auflösungsfunktion
Ri+1 und den Begrenzer <deli+1> für Si+1.
-
Der
bei der Bezugszahl 1200 gezeigte Name wird zum Beispiel
aufgelöst,
indem in 1202 nach <del1> gesucht
wird. Die mit <del1> verknüpfte Adresse
zeigt auf den Anfang der Liste, um bei 1220 eine Abfrage
nach <A><del1><del1> durchzuführen. Wenn
bei 1222 eine Übereinstimmung
festgestellt wird, zeigt die mit diesem Eintrag verknüpfte Adresse
auf die jeweilige Grenzdatenstruktur, wo eine Überprüfung auf Übereinstimmung mit <visa1><del1> durchgeführt werden
kann. Die Übereinstimmung
tritt am Eintrag 1226 auf, und die verknüpfte Adresse
zeigt auf einen Eintrag für <B><del2><del2> am Speicherplatz 1230.
Wenn bei 1232 eine Übereinstimmung
auftritt, zeigt die zu dem übereinstimmenden
Eintrag gehörende
Adresse wieder auf die Grenzdatenstruktur, in der die Suche nach <visa2> beginnt. Der Eintrag,
der mit <visa2><del2> übereinstimmt, hat eine entsprechende
Adresse, die auf den Anfang der verknüpften Liste 1240 zeigt,
in der nach <C> gesucht werden kann.
Der Eintrag, der mit <C> 1242 übereinstimmt,
hat einen entsprechenden Eintrag mit der eindeutigen Kennung 1210,
die <C> im Namensraum S3 entspricht.
-
13 ist
ein Flussdiagramm, das die ausführliche
Logik zeigt, die einer Auflösung
von kaskadierten Namen gemäß der vorliegenden
Erfindung entspricht. Die Verarbeitung beginnt bei der Bezugszahl 1300,
und die Steuerung wird sofort dem Eingabeblock 1302 übergeben,
wo ein absoluter Name, ein kaskadierter Name, ein Begrenzer für den ersten
Namensraum, der bei der Auflösung
des kaskadierten Namens verwendet werden soll, sowie Adressen für jedes
beteiligte Namenssystem empfangen werden. Am Funktionsblock 1304 wird dann
ein Zähler
i auf den Anfangswert "1" gesetzt, und im
Funktionsblock 1310 wird der kaskadierte Name verarbeitet,
um den i-ten relativen Namen (r_namei) zu
trennen, der vom Namensraum S1 aufgelöst wird. R_namei wird gleich der Zeichenfolge in cascaded_name,
links der erstmalig auftretenden Folge <deli><deli> gesetzt. An der Bezugszahl 1320 wird
der relative Name r_namei dann aufgelöst, wie
in der ausführlichen
Logik von 6 dargelegt ist. Im Funktionsblock 1330 werden
daraufhin der relative Name r_namei und
die Folge <deli><deli> aus dem kaskadierten
Namen entfernt. Am Entscheidungsblock 1340 wird ein Test
durchgeführt, um
festzustellen, ob der cascaded_name gleich dem Wert null ist. Wenn
ja, wird die Steuerung über
die Bezugszahl 1350 der Bezugszahl 1500 in 15 übergeben.
Wenn er ungleich dem Wert null ist, wird visa1 am Funktionsblock 1360 gleich
der Zeichenfolge links von <deli> im cascaded_name
gesetzt. Nach der Entfernung von <visa><deli> am Funktionsblock 1370 wird
der cascaded_name anschließend
als der Rest dieses Namens festgelegt, und die Steuerung wird der
Bezugszahl 1400 von 14 übergeben.
Im Anschluss daran wird die Steuerung dem Funktionsblock 1600 in 16 übergeben,
um die Grenzfunktion an Bi zu verarbeiten.
Auf der Grundlage der Informationen über die aktuellen Adresse ermittelt
der Funktionsblock 1420 die nächste Adresse. Am Funktionsblock 1440 wird
daraufhin der Index i erhöht,
und die Steuerung wird über
die Bezugszahl 1450 der Bezugszahl 1306 von 13 übergeben,
um den nächsten
Namen zu verarbeiten.
-
15 ist
ein ausführliches
Flussdiagramm, das die Logik in Verbindung mit der Verarbeitung
von Adressen gemäß der vorliegenden
Erfindung zeigt. Die Verarbeitung beginnt an der Bezugszahl 1500 und schaltet
zum Entscheidungsblock 1510, um festzustellen, ob i gleich "1" ist, d.h., ob an der Auflösung des
Namens nur ein Namensraum beteiligt war. Wenn ja, wird die Adresse
im Funktionsblock 1520 der Adresse des Knotens ni in diesem System gleichgesetzt, und die
Verarbeitung wird am Endgeräteblock 1540 abgeschlossen.
Wenn i ungleich "1" ist, besteht die
Adresse aus der Adresse des letzten Systems und der Adresse des letzten
Knotens, die während
der Auflösung
von Namen in diesem System angetroffen werden, wie im Funktionsblock 1530 gezeigt
ist, und die Steuerung wird dem Endgeräteblock 1540 übergeben.
-
16 ist
die ausführliche
Logik in Verbindung mit der Grenzfunktion gemäß der vorliegenden Erfindung.
Die Verarbeitung beginnt bei 1600 und schaltet zum Entscheidungsblock 1610,
um die Adresse der Datenstruktur, die dem i-ten Namenssystem A_Si entspricht, und die Adresse des Knotens
ni in diesem System zu empfangen. Am Funktionsblock 1620 wird
die Datenstruktur für
A_Si dann nach einer Übereinstimmung des Namens an
der Adresse mit dem i-ten Namen durchsucht. Die Datenstruktur ist
eine dreidimensionale Anordnung. Bei jedem Eintrag ist der x-Wert
eine Adresse eines Knotens, und der y-Wert ist ein Visum. Der z-Wert ist
ein Zeiger auf die Datenstruktur A_Si+1 für das folgende
Namenssystem nach der Grenze und den absoluten Name des Startknotens
in A_Si+1.
-
Bezug
nehmend auf 21, die die Grenztabellen-Datenstruktur zeigt,
welche sich an der Adresse des i-ten Systems (A_Si)
befindet, wird die Spalte der Zeichenwerte bei 2100 nach
einer Übereinstimmung
mit dem i-ten Knoten (address_ni) durchsucht,
und der entsprechende Wert in der Spalte mit der Bezugszahl 2110 ist
das Visum. Die Spalte mit der Bezugszahl 2120 entspricht
dem nächsten
zu verwendenden Eintrag.
-
Nochmals
Bezug nehmend auf 16 besteht der nächste Schritt
in der Verarbeitung der Grenzen darin, am Funktionsblock 1630 die
Tabelle zu durchsuchen, die der Adresse des i+1-ten Systems entspricht. Die
ersten Einträge
in der Tabelle legen die Attribute dieses Systems fest. Jeder Eintrag
hat ein Paar [attribute type = attribute value]. Beim Attribut-Typ "Begrenzer" ist der Wert deli+1, und beim Typ "Auflösung" ist der Wert Ri+1.
-
17 ist
ein Flussdiagramm, das die ausführliche
Logik der erweiterten Namensauflösung
für einen einzelnen
Namensraum zeigt. Die Verarbeitung beginnt an der Bezugszahl 1700,
und am Funktionsblock 1710 werden als Eingabe eine Stammadresse,
ein absoluter Name, ein relativer Name und ein Begrenzer empfangen.
Mit dem relativen Namen, dem absoluten Namen und dem Begrenzer wird
dann entsprechend der in 6 bei 1720 gezeigten
Logik ein Name erstellt, und bei 1722 wird eine Adresse
auf die Stammadresse initialisiert. Die grundlegende Erweiterung
der Auflösungsfunktion
besteht in der Suche nach der Folge <del><del> und im Auffinden dieser
Folge. Am Entscheidungsblock 1730 werden dann die beiden äußersten linken
Zeichen im Namen geprüft,
um festzustellen, ob es die Zeichen <del><del> sind. Wenn das Ergebnis des
Tests positiv ist, schaltet die Steuerung zur Bezugszahl 1740.
Wenn das Ergebnis des Tests negativ ist, wird das Begrenzungszeichen
im Funktionsblock 1742 vom Namen abgestreift, und am Entscheidungsblock 1744 wird
ein Test durchgeführt,
um festzustellen, ob der Name den Wert null hat. Wenn ja, ist die
Verarbeitung abgeschlossen, und die Steuerung wird der Bezugszahl 1750 übergeben.
Wenn nicht, wird der folgende Komponentenname in dem Pfad im Funktionsblock 1751 als
die Zeichenfolge links des ersten Begrenzers festgelegt, und entsprechend
der in 11 gezeigten Logik wird eine
Tabellensuchoperation durchgeführt.
Im Funktionsblock 1754 gibt die Tabellensuchoperation eine
neue Adresse zurück,
die neuen Werte für
die Adresse werden zugewiesen, und der Name wird neu festgelegt,
nachdem der component_name links des Namens entfernt worden ist.
Anschließend
schaltet die Steuerung über
die Bezugszahl 1760 zu 18b. 18 führt bei 1810 einen
Test durch, um festzustellen, ob der Name den Wert null hat, und
wenn ja, schließt
sie beim Endgerät 1840 die
Verarbeitung ab. Wenn der Name nicht den Wert null hat, wird die
Verarbeitung wieder der Bezugszahl 1724 in 17 zur
weiteren Verarbeitung übergeben.
-
19 ist
ein Flussdiagramm, das eine zusätzliche
ausführliche
Logik der erweiterten Namensauflösung
für einen
einzelnen Namensraum zeigt. Sie legt die Erweiterungen bei der Bildung
von <del><del> fest. Die
Verarbeitung beginnt bei der Bezugszahl 1900, wenn über die
Bezugszahl 1740 in 17 eine
Verzweigung vorgenommen worden ist. Der Funktionsblock 1910 streift
die beiden Begrenzer von einem Namen ab. Am Entscheidungsblock 1920 wird
daraufhin ein Test durchgeführt,
um festzustellen, ob das äußerste linke Zeichen
immer noch ein Begrenzer ist. Wenn ja, wird im Funktionsblock 1930 ein
weiterer Begrenzer abgestreift, und die Steuerung wird wieder dem
Entscheidungsblock 1920 übergeben. Wenn nicht, wird
die Steuerung bei der Bezugszahl 1940 der Grenzfunktion übergeben.
-
20 ist
ein Flussdiagramm, das die ausführliche
Logik einer Grenzfunktion gemäß der vorliegenden Erfindung
darstellt. Die Steuerung wird zunächst von der Bezugszahl 1940 in 19 der
Bezugszahl 2000 von 20 übergeben.
Am Eingabeblock 2010 wird die Adresse des letzten Knotens
dann zusammen mit dem Namen und dem Begrenzungszeichen empfangen.
Am Funktionsblock 2012 wird das i-te Visum auf der Grundlage
der äußersten
linken Zeichen links von deli im Namen gebildet.
Der Funktionsblock 2014 wandelt den Namen in eine Zeichenfolge-Variable
ohne die Visum-Zeichen um. Am Funktionsblock 2016 wird
der Begrenzer dann vom Ende des Namens abgestreift, und am Entscheidungsblock 2020 wird
ein Test durchgeführt, um
festzustellen, ob der Name gleich einem Null-Zeichen ist. Wenn ja,
ist die Verarbeitung abgeschlossen, wie am Endgerät 2030 gezeigt
ist. Wenn nicht, wird eine Tabellensuchoperation durchgeführt, wobei
die in 21 gezeigte Grenztabelle verwendet
wird, um die aufgelöste
Adresse für
den folgenden Namensraum Si+1 zu ermitteln,
die bei der Auflösung
des restlichen Namens verwendet werden soll. Auf diese Weise werden
die Namensauflösungsfunktion
Ri+1, die absolute Adresse des Startknotens
A_Mi+1 und der Begrenzer deli+1 angegeben.
Der Zähler
i wird im Funktionsblock 2050 erhöht, und die Steuerung wird über die
Bezugszahl 2060 dem Funktionsblock 1700 in 17 übergeben.
-
Zwar
wurde die Erfindung in Bezug auf eine bevorzugte Ausführungsform
in einer bestimmten Systemumgebung beschrieben, doch erkennt der
Fachmann, dass die Erfindung mit daran vorgenommenen Änderungen
auch in verschiedenen anderen Hardware- und Software-Umgebungen
in die Praxis umgesetzt werden kann.