bs 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 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 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 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 Imlementierung: shmget :neuer Eintrag in einer um key erweiterten Segmenttabelle (5.4.2 )5.4.2 shmat :neuer Eintrag in Segmentliste des Prozesses oder aber – so in Solaris – mit separater Shared Memory Table:
bs rs w base lengthd backupBase r c Arbeitsspeicher Hintergrundspeicher Segmentlisten Segmenttabelle Segmente resident auslagerbar (aktiver Prozess) x (shmget) (shmat) shmget Shared Memory Table key region attr (shmget) shmid =
bs Umlagerung segmentierter Prozesse ! Beachte:Umlagerung verändert nicht den Adressraum des Prozesses – wenngleich die Deskriptoren marginal modifiziert werden. Einlagern Auslagern Erweitern
bs 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 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 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 )