Speichermodell
Definiert die Semantik der Computerspeicherhaltung für die C-Abstraktionsmaschine.
Der einem C-Programm zur Verfügung stehende Datenspeicher (Speicher) besteht aus einer oder mehreren zusammenhängenden Folgen von Bytes. Jedes Byte im Speicher hat eine eindeutige Adresse.
Inhalt |
[bearbeiten] Byte
Ein Byte ist die kleinste adressierbare Speichereinheit. Es ist definiert als eine zusammenhängende Folge von Bits, die groß genug ist, um jedes Mitglied des grundlegenden Zeichensatzes der Ausführung (die 96 Zeichen, die als einzelne Bytes erforderlich sind) aufzunehmen. C unterstützt Bytes mit Größen von 8 Bits und mehr.
Die Typen char, unsigned char und signed char verwenden ein Byte sowohl für die Speicherung als auch für die Wertdarstellung. Die Anzahl der Bits in einem Byte ist als CHAR_BIT zugänglich.
Zur Verwendung von Bytes zur Darstellung von Werten anderer grundlegender Typen (einschließlich Big-Endian- und Little-Endian-Speicherlayouts) siehe Objektdarstellung
[bearbeiten] Speicherort
Ein Speicherort ist
- ein Objekt eines skalaren Typs (arithmetischer Typ, Zeigertyp, Aufzählungstyp)
- oder die größte zusammenhängende Folge von Bitfeldern mit nicht-null Länge
struct S { char a; // memory location #1 int b : 5; // memory location #2 int c : 11, // memory location #2 (continued) : 0, d : 8; // memory location #3 struct { int ee : 8; // memory location #4 } e; } obj; // The object 'obj' consists of 4 separate memory locations
Threads und DatenrennenEin Ausführungsthread ist ein Kontrollfluss innerhalb eines Programms, der mit der Ausführung einer Top-Level-Funktion durch thrd_create oder andere Mittel beginnt. Jeder Thread kann potenziell auf jedes Objekt im Programm zugreifen (Objekte mit automatischer und Thread-lokaler Speicherdauer können immer noch von einem anderen Thread über einen Zeiger zugegriffen werden). Verschiedene Ausführungsthreads dürfen immer gleichzeitig auf verschiedene Speicherorte zugreifen (lesen und ändern), ohne Beeinträchtigung und ohne Synchronisationsanforderungen. (beachten Sie, dass es nicht sicher ist, zwei nicht-atomare Bitfelder in derselben Struktur gleichzeitig zu aktualisieren, wenn alle zwischen ihnen deklarierten Member ebenfalls (nicht-null-Länge) Bitfelder sind, unabhängig von den Größen dieser dazwischenliegenden Bitfelder) Wenn eine Auswertung eines Ausdrucks in einen Speicherort schreibt und eine andere Auswertung denselben Speicherort liest oder modifiziert, wird gesagt, dass die Auswertungen konfligieren. Ein Programm mit zwei konfligierenden Auswertungen hat ein Datenrennen, es sei denn, entweder
Wenn ein Datenrennen auftritt, ist das Verhalten des Programms undefiniert. (insbesondere ist mtx_unlock synchronisiert mit und daher geschieht vor mtx_lock desselben Mutex durch einen anderen Thread, was es ermöglicht, Mutex-Sperren zu verwenden, um Datenrennen zu verhindern)
SpeicherreihenfolgeWenn ein Thread einen Wert von einem Speicherort liest, kann er den Anfangswert, den Wert, der im selben Thread geschrieben wurde, oder den Wert, der in einem anderen Thread geschrieben wurde, sehen. Einzelheiten zur Reihenfolge, in der von Threads vorgenommene Schreibvorgänge für andere Threads sichtbar werden, finden Sie unter memory_order. |
(seit C11) |
[bearbeiten] Referenzen
- C23-Standard (ISO/IEC 9899:2024)
- 3.6 byte (S: TBD)
- 3.14 Speicherort (S: TBD)
- 5.1.2.4 Multi-threaded executions and data races (S: TBD)
- C17-Standard (ISO/IEC 9899:2018)
- 3.6 byte (S: TBD)
- 3.14 Speicherort (S: TBD)
- 5.1.2.4 Multi-threaded executions and data races (S: TBD)
- C11-Standard (ISO/IEC 9899:2011)
- 3.6 byte (S: 4)
- 3.14 Speicherort (S: 5)
- 5.1.2.4 Multi-threaded executions and data races (S: 17-21)
- C99-Standard (ISO/IEC 9899:1999)
- 3.6 byte (S: 4)
- C89/C90-Standard (ISO/IEC 9899:1990)
- 1.6 DEFINITIONEN VON BEGRIFFEN
[bearbeiten] Siehe auch
| C++ Dokumentation für Speichermodell
|