bs-5.4.3

Werbung
5.4.3 Gemeinsame Datensegmente
am Beispiel Solaris
[Beachte:
Unix/Linux setzen keine Hardware-Segmentierung
voraus 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.
bs-5.4.3
1
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:
bs-5.4.3
EACCES u.a.
2
addr = shmat(shmid, addr, flags)
(„attach“)
Segment shmid an einer freien
Stelle 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.) !
bs-5.4.3
3
shmctl(shmid, cmd, buffer)
auf Segment shmid die Operation cmd
ausführen, z.B.
- Segment löschen
- Daten abfragen
- Rechte ändern
- u.a.
Verwandte Technik: „memory-mapped files“,
d.h. Dateien in Adressraum einblenden (6)
bs-5.4.3
4
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:
bs-5.4.3
5
Arbeitsspeicher
0
1
2
3
shmid = 2
Shared Memory Table
key
0
1
2
3
4
region
attr
rs
Segmentlisten
w
...
(shmat)
(aktiver Prozess)
Segmenttabelle
base
length
d backupBase
r c
(shmget)
.
.
.
.
.
.
(shmget)
Hintergrundspeicher
resident
auslagerbar
x
Segmente
shmget
bs-5.4.3
...
6
5.4.4 Umlagerung segmentierter Prozesse
! Beachte:
Umlagerung verändert nicht den Adressraum
des Prozesses – wenngleich die Deskriptoren
marginal modifiziert werden.
 Einlagern
 Auslagern
 Erweitern
bs-5.4.3
7
 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 ).
bs-5.4.3
8
 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.
bs-5.4.3
9
 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 Segmenterweiterung der alte length-Wert zugrundegelegt.
( Verschiedene Effizienzverbesserungen sind möglich )
bs-5.4.3
10
Herunterladen