Spec-Zone.ru › C

Модель памяти

Определяет семантику хранения компьютерной памяти в целях абстрактной машины C.

Данные, доступные программе C (память), представляют собой одну или несколько смежных последовательностей байтов. Каждый байт в памяти имеет уникальный адрес.

Байты

Байт — это наименьшая адресуемая единица памяти. Он определяется как смежная последовательность битов, достаточная для хранения любого члена базового набора символов выполнения (96 символов, которые должны быть однобайтовыми). C поддерживает байты размером 8 бит и более.

Типы char, unsigned char, и signed char используют один байт для хранения и представления значения. Количество бит в байте доступно как CHAR_BIT.

Для использования байтов для представления значений других основных типов (включая схемы организации памяти big-endian и little-endian) см. представление объекта

Местоположение в памяти

Местоположение в памяти — это

  • объект скалярного типа (арифметический тип, указатель, тип перечисления)
  • или самая большая смежная последовательность полей битов ненулевой длины
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

Потоки и гонки данных

Поток выполнения — это поток управления в программе, который начинается с вызова функции верхнего уровня thrd_create или другими средствами.

Любой поток может потенциально получить доступ к любому объекту в программе (объекты с автоматическим и потоко-локальным временем хранения все еще могут быть доступны другому потоку через указатель).

Разным потокам выполнения всегда разрешено одновременно обращаться (читать и изменять) разные места в памяти без каких-либо конфликтов и без требований к синхронизации. (Обратите внимание, что небезопасно одновременно обновлять два неатомарных поля битов в одном структуре, если все члены между ними также являются (ненулевой длины) полями битов, независимо от того, какими окажутся размеры этих промежуточных полей битов).

Когда оценка выражения записывает значение в местоположение в памяти, а другая оценка читает или изменяет то же местоположение в памяти, выражения считаются конфликтующими. Программа, у которой есть две конфликтующие оценки, имеет гонку данных, если не выполняется ни одно из следующих условий:

  • обе конфликтующие оценки являются атомарными операциями
  • одна из конфликтующих оценок предшествует другой (см. memory_order)

Если возникает гонка данных, поведение программы не определено. (В частности, mtx_unlock является

синхронизированным с, и, следовательно, предшествует mtx_lock того же мьютекса другим потоком, что делает возможным использование блокировок мьютексов для защиты от гонок данных)

Порядок памяти

Когда поток считывает значение из места в памяти, он может увидеть начальное значение, значение, записанное в том же потоке, или значение, записанное в другом потоке. См. memory_order для получения подробной информации о порядке, в котором записи, сделанные из потоков, становятся видимыми для других потоков.

(с C11)

Ссылки

  • Стандарт 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++ для модели памяти

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/language/memory_model

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API