Upload
clarimond-almendinger
View
104
Download
1
Embed Size (px)
Citation preview
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.
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.
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.) !
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)
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:
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
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
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 ).
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.
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 )