Shared Memory: Konzepte, Merkmale und Implementierung

Classified in Informatik

Written at on Deutsch with a size of 2,72 KB.

Gemeinsame Merkmale von Shared Memory

Shared-Memory-Mechanismen werden als eine Einheit betrachtet und weisen gemeinsame Merkmale auf, darunter:

  • Alle Mechanismen verwenden eine Tabelle, deren Einträge die Verwendung beschreiben. Jeder Tabelleneintrag hat einen numerischen Schlüssel, der vom Benutzer gewählt wird.
  • Jeder Mechanismus bietet die Möglichkeit, einen neuen Eintrag zu erstellen oder einen vorhandenen abzurufen. Innerhalb der Parameter dieses Aufrufs werden ein Schlüssel und eine Maske von Indikatoren übergeben. Der Kernel sucht in der Tabelle nach einem Eintrag, der den übergebenen Kriterien entspricht.
  • Wenn der Schlüssel IPC_PRIVATE gesetzt ist, sucht der Kernel den ersten freien Eintrag und nutzt diesen. Alle Zugriffe erfolgen über diesen Eintrag, bis er wieder freigegeben wird.
  • Wenn innerhalb der Maske von Indikatoren das Bit IPC_CREAT aktiv ist, erstellt der Kernel einen neuen Eintrag, falls kein passender Eintrag für den übergebenen Schlüssel gefunden wird. Wenn zusätzlich zu IPC_CREAT das Bit IPC_EXCL aktiv ist, gibt der Kernel einen Fehler zurück, falls bereits ein Eintrag für den übergebenen Schlüssel existiert.
  • Wenn alles korrekt funktioniert, gibt der Kernel eine ID zurück, die auch in anderen Aufrufen genutzt werden kann.

Jeder Tabelleneintrag enthält Informationen zu Berechtigungen, einschließlich:

  • User-ID und Prozessgruppe, die den Eintrag reserviert haben.
  • User-ID und Gruppe, die die "Kontrolle" über den IPC-Mechanismus ausüben.
  • Eine Gruppe von Bits mit Lese-, Schreib- und Ausführungsrechten für Benutzer, Gruppe und andere Benutzer.

Jeder Eintrag enthält Statusinformationen, einschließlich der ID des letzten Prozesses, der den Eintrag verwendet hat.

Beispiel: Erstellen eines Shared-Memory-Bereichs

Das folgende Beispiel zeigt, wie ein Shared-Memory-Bereich erstellt wird, in dem ein Array von reellen Zahlen gespeichert werden kann.

#define MAX 10
int shmid, i;
float *array;
key_t key;

if ((key = ftok("Test", 'k')) == (key_t) -1) {
 perror("Fehler bei der Erstellung des Schlüssels");
 return 1; 
}

if ((shmid = shmget(key, MAX * sizeof(float), IPC_CREAT | 0600)) == -1) {
 perror("Fehler im Antrag für MC");
 return 1;
}

if ((array = (float *)shmat(shmid, 0, 0)) == (float *) -1) {
 perror("Fehler in der Vereinigung der MC in die Prozesse");
 return 1;
}

for (i = 0; i < MAX; i++) {
 array[i] = i * i;
}

if (shmdt((char *)array) == -1) {
 perror("Fehler in der Trennung der MC");
 return 1;
}

if (shmctl(shmid, IPC_RMID, 0) == -1) {
 perror("Fehler bei der Beseitigung von MC");
 return 1;
}

Entradas relacionadas: