10
bs-5.4.3 1 5.4.3 Gemeinsame Datensegmente am Beispiel Solaris chte: Unix/Linux setzen keine Hardware-Segmentierung voraus und sprechen daher statt von „Segmenten“ von „Regionen“ (Code, statische Daten, Keller, ...).] ätzlich zu den drei Standard-Segmenten kann ein Pro 1. neue Segmente erzeugen, 2. „fremde“ Segmente in seinen Adressraum einblende 3. und wieder ausblenden.

Bs-5.4.31 5.4.3 Gemeinsame Datensegmente am Beispiel Solaris [Beachte: Unix/Linux setzen keine Hardware-Segmentierung voraus und sprechen daher statt von

Embed Size (px)

Citation preview

Page 1: Bs-5.4.31 5.4.3 Gemeinsame Datensegmente am Beispiel Solaris [Beachte: Unix/Linux setzen keine Hardware-Segmentierung voraus und sprechen daher statt von

bs-5.4.3 1

5.4.3 Gemeinsame Datensegmente

am Beispiel Solaris

[Beachte: Unix/Linux setzen keine Hardware-Segmentierungvoraus und sprechen daher statt von „Segmenten“von „Regionen“ (Code, statische Daten, Keller, ...).]

Zusätzlich zu den drei Standard-Segmenten kann ein Prozess

1. neue Segmente erzeugen,

2. „fremde“ Segmente in seinen Adressraum einblenden

3. und wieder ausblenden.

Page 2: Bs-5.4.31 5.4.3 Gemeinsame Datensegmente am Beispiel Solaris [Beachte: Unix/Linux setzen keine Hardware-Segmentierung voraus und sprechen daher statt von

bs-5.4.3 2

Systemaufrufe (shm = „shared memory“):

shmid = shmget(key, size, flags)

Segment key der Größe size erzeugen und/oder – abhängig von flags –

Segment key öffnen, d.h. einen geschützten Verweis dafür erzeugen, der mit shmid

identifiziert wird; die gewünschten Zugriffsrechte werden über flags spezifiziert (ähnlich wie bei Dateien).

Fehler: EACCES u.a.

Page 3: Bs-5.4.31 5.4.3 Gemeinsame Datensegmente am Beispiel Solaris [Beachte: Unix/Linux setzen keine Hardware-Segmentierung voraus und sprechen daher statt von

bs-5.4.3 3

addr = shmat(shmid, addr, flags) („attach“)

Segment shmid an einer freienStelle in den Adressraum einblenden und

seine Anfangsadresse liefern; Rechte bzgl.

shmctl (s.u.) gemäß flags setzen.

shmdt(addr) („detach“)

blendet das bei addr beginnende Segment aus.

Ein nicht mehr benötigtes Segment

muss explizit gelöscht werden (s.u.) !

Page 4: Bs-5.4.31 5.4.3 Gemeinsame Datensegmente am Beispiel Solaris [Beachte: Unix/Linux setzen keine Hardware-Segmentierung voraus und sprechen daher statt von

bs-5.4.3 4

shmctl(shmid, cmd, buffer)

auf Segment shmid die Operation cmdausführen, z.B. - Segment löschen

- Daten abfragen - Rechte ändern- u.a.

Verwandte Technik: „memory-mapped files“,

d.h. Dateien in Adressraum einblenden (6)

Page 5: Bs-5.4.31 5.4.3 Gemeinsame Datensegmente am Beispiel Solaris [Beachte: Unix/Linux setzen keine Hardware-Segmentierung voraus und sprechen daher statt von

bs-5.4.3 5

Imlementierung:

shmget : neuer Eintrag in einer um key erweiterten

Segmenttabelle (5.4.2)

shmat : neuer Eintrag in Segmentliste des Prozesses

oder aber – so in Solaris –

mit separater Shared Memory Table:

Page 6: Bs-5.4.31 5.4.3 Gemeinsame Datensegmente am Beispiel Solaris [Beachte: Unix/Linux setzen keine Hardware-Segmentierung voraus und sprechen daher statt von

bs-5.4.3 6

...

...

...

rs w

base length d backupBase r c

Arbeitsspeicher

Hintergrundspeicher

Segmentlisten

Segmenttabelle

Segmente

residentauslagerbar

(aktiver Prozess)

x

(shmget)

(shmat)

shmget

Shared Memory Table

key region attr

.

.

.

(shmget)

01234

shmid = 20123

Page 7: Bs-5.4.31 5.4.3 Gemeinsame Datensegmente am Beispiel Solaris [Beachte: Unix/Linux setzen keine Hardware-Segmentierung voraus und sprechen daher statt von

bs-5.4.3 7

5.4.4 Umlagerung segmentierter Prozesse

! Beachte: Umlagerung verändert nicht den Adressraum des Prozesses – wenngleich die Deskriptorenmarginal modifiziert werden.

Einlagern

Auslagern

Erweitern

Page 8: Bs-5.4.31 5.4.3 Gemeinsame Datensegmente am Beispiel Solaris [Beachte: Unix/Linux setzen keine Hardware-Segmentierung voraus und sprechen daher statt von

bs-5.4.3 8

Einlagern – falls Speicherbelegung es erlaubt:

0. Bereits eingelagerte Segmente bleiben unberücksichtigt,

ebenso die in Einlagerung befindlichen (c-Bit).

1. Segmentbereiche im Arbeitsspeicher reservieren.

2. Für jedes Segment

base und c-Bit setzen,

Segment einlagern,

c-Bit löschen.

3. Prozess auswahlfähig machen (Operation start ).

Page 9: Bs-5.4.31 5.4.3 Gemeinsame Datensegmente am Beispiel Solaris [Beachte: Unix/Linux setzen keine Hardware-Segmentierung voraus und sprechen daher statt von

bs-5.4.3 9

Auslagern:

0. Für andere Prozesse noch benötigte gemeinsame

Segmente bleiben unberücksichtigt.

1. Prozess stoppen (Operation stop ).

2. Für jedes Segment:

base löschen;

wenn dirty,

dirty löschen,

Segment auslagern;

Speicherbereich freigeben.

Page 10: Bs-5.4.31 5.4.3 Gemeinsame Datensegmente am Beispiel Solaris [Beachte: Unix/Linux setzen keine Hardware-Segmentierung voraus und sprechen daher statt von

bs-5.4.3 10

Erweitern mit vorgezogener Auslagerung:

1. Neuen Segmentbereich im Auslagerungsbereich belegen.

2. Deskriptor in der Segmenttabelle erzeugen bzw. ändern.

3. Prozess auslagern. Dabei wird im Fall der Segment-

erweiterung der alte length-Wert zugrundegelegt.

( Verschiedene Effizienzverbesserungen sind möglich )