Memory model
Определяет семантику хранения данных в компьютерной памяти для целей абстрактной машины C.
Доступное для программы на C хранилище данных (память) представляет собой одну или несколько непрерывных последовательностей байтов . Каждый байт в памяти имеет уникальный адрес .
Содержание |
Байт
Байт — это наименьшая адресуемая единица памяти. Он определяется как непрерывная последовательность битов, достаточно большая для хранения любого элемента базового набора символов выполнения ( 96 символов , которые должны быть однобайтовыми). C поддерживает байты размером от 8 бит и более.
Типы types char , unsigned char и signed char используют один байт для хранения и представления значения . Количество битов в байте доступно как CHAR_BIT .
Для использования байтов для представления значений других фундаментальных типов (включая big-endian и little-endian layouts памяти), см. object representation
Местоположение в памяти
Область памяти представляет собой
- объект скалярного типа (арифметический тип, указатель, тип перечисления)
- или наибольшая непрерывная последовательность битовых полей ненулевой длины
struct S { char a; // область памяти #1 int b : 5; // область памяти #2 int c : 11, // область памяти #2 (продолжение) : 0, d : 8; // область памяти #3 struct { int ee : 8; // область памяти #4 } e; } obj; // Объект 'obj' состоит из 4 отдельных областей памяти
Потоки и гонки данныхПоток выполнения - это поток управления внутри программы, который начинается с вызова функции верхнего уровня с помощью thrd_create или другими способами. Любой поток потенциально может получить доступ к любому объекту в программе (объекты с автоматической и потоковой длительностью хранения все еще могут быть доступны другому потоку через указатель). Разным потокам выполнения всегда разрешено одновременно обращаться (читать и изменять) разные области памяти без вмешательства и требований синхронизации. (примечание: небезопасно одновременно обновлять два неатомарных битовых поля в одной структуре, если все члены, объявленные между ними, также являются (ненулевыми) битовыми полями, независимо от размеров этих промежуточных битовых полей) Когда вычисление выражения записывает в область памяти, а другое вычисление читает или изменяет ту же область памяти, говорят, что выражения конфликтуют . Программа, имеющая два конфликтующих вычисления, содержит гонку данных , если только
Если возникает гонка данных, поведение программы не определено. (в частности, mtx_unlock является синхронизированным-с , и следовательно, происходит-до mtx_lock того же мьютекса другим потоком, что позволяет использовать блокировки мьютексов для защиты от гонок данных)
Порядок памятиКогда поток читает значение из области памяти, он может увидеть начальное значение, значение, записанное в том же потоке, или значение, записанное в другом потоке. См. memory_order для подробностей о порядке, в котором записи, сделанные из потоков, становятся видимыми другим потокам. |
(начиная с C11) |
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
-
- 3.6 байт (стр.: TBD)
-
- 3.14 область памяти (стр.: TBD)
-
- 5.1.2.4 Многопоточные выполнения и гонки данных (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
-
- 3.6 байт (стр.: TBD)
-
- 3.14 область памяти (стр.: TBD)
-
- 5.1.2.4 Многопоточные выполнения и гонки данных (стр.: TBD)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 3.6 байт (стр: 4)
-
- 3.14 область памяти (стр: 5)
-
- 5.1.2.4 Многопоточные выполнения и гонки данных (стр: 17-21)
- Стандарт C99 (ISO/IEC 9899:1999):
-
- 3.6 байт (стр: 4)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
-
- 1.6 ОПРЕДЕЛЕНИЯ ТЕРМИНОВ
Смотрите также
|
C++ documentation
для
Memory model
|