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