Datakommunikationsnät

2.2.1 Namnmodellen

Det är bra att ha en modell för hur namn associeras med specifika objekt. En systemkonstruktör skapar en namngivningsmodell som består av tre element. Det första elementet är ett namnområde, som består av ett alfabet av symboler tillsammans med syntaxregler som anger vilka namn som är acceptabla. Det andra elementet är en algoritm för namnmappning, som associerar vissa (inte nödvändigtvis alla) namn i namnutrymmet med vissa (återigen inte nödvändigtvis alla) värden i ett universum av värden, vilket är det tredje och sista elementet i namngivningsschemat. Ett värde kan vara ett objekt eller ett annat namn från antingen det ursprungliga namnområdet eller från ett annat namnområde. En mappning av namn till värde är ett exempel på en bindning, och när en sådan mappning existerar sägs namnet vara bundet till värdet. Figur 2.10 illustrerar detta.

Figur 2.10. Allmän modell för hur ett namngivningsschema fungerar. Algoritmen för namnmappning tar in ett namn och en kontext och returnerar ett element från värdeuniversumet. Pilarna visar att algoritmen med hjälp av kontext “A” löser upp namnet “N4” till värdet “13”.

I de flesta system är vanligtvis flera olika namngivningsscheman i drift samtidigt. Ett system kan till exempel använda ett namngivningsschema för namn på e-postbrevlådor, ett andra namngivningsschema för Internetvärdar, ett tredje för filer och ett fjärde för virtuella minnesadresser. När en programtolkare möter ett namn måste den veta vilket namngivningsschema den ska använda. Den miljö som omger användningen av namnet ger vanligtvis tillräckligt med information för att identifiera namnsystemet. I ett tillämpningsprogram vet till exempel programförfattaren att programmet bör förvänta sig att filnamn endast tolkas av filsystemet och att Internetvärdsnamn endast tolkas av någon nätverkstjänst.

Tolkaren som möter namnet kör namnmappningsalgoritmen för det lämpliga namngivningsschemat. Namnmappningsalgoritmen löser upp namnet, vilket innebär att den upptäcker och returnerar det associerade värdet (av denna anledning kallas namnmappningsalgoritmen också för en resolver). Algoritmen för namnmappning styrs vanligen av en ytterligare parameter, en så kallad kontext. För ett givet namnschema kan det finnas många olika kontexter, och ett enskilt namn i namnrymden kan mappas till olika värden när resolveraren använder olika kontexter. När en person till exempel i vanlig talspråk hänvisar till namnen “du”, “här” eller “Alice” beror betydelsen av vart och ett av dessa namn på i vilket sammanhang personen uttalar det. Å andra sidan har vissa namngivningssystem endast en kontext. Sådana namngivningsscheman tillhandahåller vad som kallas universella namnrymder, och de har den fina egenskapen att ett namn alltid har samma innebörd inom det namngivningsschemat, oavsett vem som använder det. I Förenta staterna utgör till exempel socialförsäkringsnummer, som identifierar statliga pensions- och skattekonton, ett universellt namnområde. När det finns mer än en kontext kan tolkaren tala om för resolveraren vilken den ska använda eller så kan resolveraren använda en standardkontext.

Vi kan sammanfatta namnmodellen genom att definiera följande konceptuella operation på namn:

värde ← resolve (namn, kontext)

När en uttolkare stöter på ett namn i ett objekt, tar den först reda på vilket namnschema som är inblandat och därmed vilken version av resolve den ska åberopa. Den identifierar sedan en lämplig kontext, löser upp namnet i den kontexten och ersätter namnet med det upplösta värdet när den fortsätter tolkningen. Variabeln context talar om för resolve vilken kontext som ska användas. Den variabeln innehåller ett namn som kallas kontextreferens.

I en processor är registernummer namn. I en enkel processor är både uppsättningen registernamn och de register som dessa namn är bundna till fastställda vid konstruktionstillfället. I de flesta andra system som använder namn (inklusive registernamnssystemet i vissa högpresterande processorer) är det möjligt att skapa nya bindningar och radera gamla, räkna upp namnutrymmet för att få en lista över befintliga bindningar och jämföra två namn. För dessa ändamål definierar vi ytterligare fyra konceptuella operationer:

status ← bind (name, value, context)

status ← unbind (name, context)

list ← enumerate (context)

result ← compare (name1, name2)

Den första operationen ändrar kontext genom att lägga till en ny bindning; Statusresultatet rapporterar om ändringen lyckades eller inte (den kan misslyckas om det föreslagna namnet bryter mot syntaxreglerna för namnutrymmet). Efter ett lyckat anrop till bind returnerar resolve det nya värdet för name.* Den andra operationen, unbind, tar bort en befintlig bindning från kontexten, där status återigen rapporterar framgång eller misslyckande (kanske för att det inte fanns någon sådan befintlig bindning). Efter ett lyckat anrop av unbind kommer resolve inte längre att återge värdet för name. Operationerna bind och unbind gör det möjligt att använda namn för att skapa kopplingar mellan objekt och ändra dessa kopplingar senare. En konstruktör av ett objekt kan, genom att använda ett namn för att hänvisa till ett komponentobjekt, välja det objekt som namnet är bundet till antingen då eller vid en senare tidpunkt genom att anropa bind, och eliminera en bindning som inte längre är lämplig genom att anropa unbind, allt utan att ändra det objekt som använder namnet. Denna förmåga att fördröja och ändra bindningar är ett kraftfullt verktyg som används vid utformningen av nästan alla system. Vissa namnimplementationer tillhandahåller en enumerate-operation, som returnerar en lista över alla namn som kan lösas upp i sammanhanget. Vissa implementeringar av enumerate kan också returnera en lista över alla värden som för närvarande är bundna i kontexten. Slutligen rapporterar compare-operationen (sant eller falskt) om name1 är samma som name2 eller inte. Innebörden av “samma” är en intressant fråga som tas upp i avsnitt 2.2.5, och det kan kräva att ytterligare kontextargument tillhandahålls.

Olika namngivningssystem har olika regler om entydighet för mappningar av namn till värde. Vissa namngivningssystem har en regel om att ett namn måste mappa till exakt ett värde i ett givet sammanhang och att ett värde bara får ha ett namn, medan i andra namngivningssystem kan ett namn mappa till flera värden, eller ett värde kan ha flera namn, även i samma sammanhang. En annan typ av unikhetsregel är den som gäller för ett namnområde med unika identifierare, som tillhandahåller en uppsättning namn som aldrig kommer att återanvändas under namnområdets livstid och som, när de väl är bundna, alltid kommer att förbli bundna till samma värde. Ett sådant namn sägs ha en stabil bindning. Om ett namnområde för unika identifierare också har regeln att ett värde endast kan ha ett namn, blir de unika namnen användbara för att hålla reda på objekt under en lång tidsperiod, för att jämföra referenser för att se om de avser samma objekt och för att samordna flera kopior i system där objekt replikeras av prestandaskäl eller för att vara tillförlitliga. Exempelvis utgör kundkontonumret i de flesta faktureringssystem ett unikt identifieringsnamnsutrymme. Kontonumret kommer alltid att hänvisa till samma kundkonto så länge kontot existerar, trots ändringar i kundens adress, telefonnummer eller till och med personnamn. Om en kunds konto raderas kommer kundens kontonummer inte att återanvändas för en annan kunds konto. Namngivna fält inom kontot, t.ex. saldot, kan ändras från tid till annan, men bindningen mellan kundkontonumret och själva kontot är stabil.

Algoritmen för namnmappning och en enda kontext mappar inte nödvändigtvis alla namn i namnutrymmet till värden. Ett möjligt resultat av resolve kan därför vara ett resultat som inte hittas, vilket resolve kan meddela anroparen antingen som ett reserverat värde eller som ett undantag. Å andra sidan kan ett möjligt resultat vara en lista över värden om namnschemat tillåter att ett namn mappas till flera värden. I det fallet kan det krävas ytterligare ett argument som anger vilket värde som ska bindas upp. Slutligen tillhandahåller vissa namngivningssystem omvänd sökning, vilket innebär att en anropare kan ange ett värde som ett argument till namnmappningsalgoritmen och ta reda på vilket eller vilka namn som är bundna till det värdet.

Figur 2.10 illustrerar namnmodellen och visar ett namnutrymme, motsvarande universum av värden, en namnmappningsalgoritm och en kontext som kontrollerar namnmappningsalgoritmen.

I praktiken möter man tre ofta använda namnmappningsalgoritmer:

Tabelluppslag

Rekursivt uppslag

Flera uppslag

Den vanligaste implementeringen av en kontext är en tabell med {namn, värde}-par. När implementationen av en kontext är en tabell är algoritmen för namnmappning bara en uppslagning av namnet i tabellen. Själva tabellen kan vara komplex, med hash eller B-träd, men den grundläggande idén är fortfarande densamma. Att binda ett nytt namn till ett värde består i att lägga till det paret {namn, värde} i tabellen. Figur 2.11 illustrerar denna vanliga implementering av namnmodellen. Det finns en sådan tabell för varje kontext, och olika kontexter kan innehålla olika bindningar för samma namn.

Figur 2.11. Ett system som använder tabelluppslag som algoritm för namnmappning. Liksom i exemplet i figur 2.10 löser även detta system upp namnet “N4” till värdet “13”.

Exempel från den verkliga världen på både den allmänna namnmodellen och implementeringen av tabelluppslag finns i överflöd:

En telefonbok är en tabelluppslagskontext som binder namn på personer och organisationer till telefonnummer. Liksom i exemplet med datakommunikationsnätet är telefonnummer i sig själva namn som telefonbolaget omvandlar till fysiska linjer med hjälp av en namnmappningsalgoritm som inbegriper områdeskoder, växlar och fysiska växlar. Telefonböckerna för Boston och San Francisco är två sammanhang av samma namngivningssystem; ett visst namn kan förekomma i båda telefonböckerna, men om så är fallet är det förmodligen knutet till olika telefonnummer.

Små heltal namnger registren i en processor. Värdet är själva registret, och mappningen från namn till värde sker med hjälp av ledningar.

Minnesceller benämns på liknande sätt med siffror som kallas adresser, och mappningen från namn till värde sker återigen med hjälp av ledningar. I kapitel 5 beskrivs en mekanism för adressändring som kallas virtuellt minne och som binder block av virtuella adresser till block av sammanhängande minnesceller. När ett system implementerar flera virtuella minnen är varje virtuellt minne ett distinkt sammanhang; en given adress kan hänvisa till en annan minnescell i varje virtuellt minne. Minnesceller kan också delas mellan virtuella minnen, och i så fall kan samma minnescell ha samma (eller olika) adresser i olika virtuella minnen, vilket bestäms av bindningarna.

Ett typiskt datafilsystem använder flera lager av namn och sammanhang: skivsektorer, skivpartitioner, filer och kataloger är alla namngivna objekt. Kataloger är exempel på sammanhang med tabelluppslag. Ett visst filnamn kan förekomma i flera olika kataloger, bundna till antingen samma eller olika filer. I avsnitt 2.5 presenteras en fallstudie av namngivning i unix filsystem.

Datorer ansluts till datakommunikationsnät på platser som kallas nätverksanslutningspunkter. Nätverksanslutningspunkter namnges vanligtvis med två olika namngivningsscheman. Det första, som används inne i nätverket, innebär ett namnutrymme som består av siffror i ett fält med fast längd. Dessa namn är bundna, ibland permanent och ibland bara kortvarigt, till nätets fysiska ingångs- och utgångspunkter. Ett andra namnsystem, som används av nätets klienter, kopplar ett mer användarvänligt universellt namnområde av teckensträngar till namn i det första namnområdet. Avsnitt 4.4 är en fallstudie av Domain Name System, som tillhandahåller användarvänlig namngivning av anslutningspunkter för Internet.

En programmerare identifierar procedurvariabler med hjälp av namn, och varje aktivering av proceduren ger ett distinkt sammanhang i vilket de flesta sådana namn löses upp. Vissa namn, som identifieras som “statiska” eller “globala namn”, kan istället lösas upp i ett sammanhang som delas mellan aktiveringar eller mellan olika procedurer. När en procedur kompileras kan en del av de ursprungliga användarvänliga namnen på variabler ersättas med heltalsbeteckningar som är mer bekväma för en maskin att hantera, men namnmodellen gäller fortfarande.

En Uniform Resource Locator (URL) på World Wide Web kartläggs till en specifik webbsida med hjälp av en relativt komplicerad algoritm som delar upp URL:n i flera olika beståndsdelar och löser upp delarna med hjälp av olika namngivningsscheman; resultatet identifierar så småningom en viss webbsida. Avsnitt 3.2 är en fallstudie av detta namngivningsschema.

Ett kundfaktureringssystem upprätthåller vanligtvis minst två typer av namn för varje kundkonto. Kontonumret namnger kontot i ett namnutrymme med unik identifierare, men det finns också ett distinkt namnutrymme med personliga namn som också kan användas för att identifiera kontot. Båda dessa namn är vanligtvis kopplade till kontoposter i ett databassystem, så att konton kan hämtas antingen med hjälp av kontonummer eller med hjälp av personnamn.

Dessa exempel belyser också en skillnad mellan “namngivning” och bindning. Vissa, men inte alla sammanhang “namnger” saker, i den meningen att de kopplar ett namn till ett objekt som allmänt anses ha det namnet. Telefonkatalogen “namnger” alltså varken människor eller telefonlinjer. Någon annanstans finns det sammanhang som binder namn till människor och som binder telefonnummer till särskilda fysiska telefoner. Telefonkatalogen binder namn på människor till namn på telefoner.

Lämna ett svar

Din e-postadress kommer inte publiceras.