2013-09-09 3 views
1

Я прочитал опубликовать
C volatile variables and Cache MemoryЛетучие и кэш поведение

Но я путаюсь.

Вопрос:
будет ли ОС заботиться сама или
программист должен написать программу таким образом, чтобы переменная не должна идти в кэш, как упоминанием, как объявить переменную как _Uncached.

Привет
Ученик

ответ

9

Для уточнения:

volatile представляет собой концепцию, С и сообщает компилятор принести переменный каждый раз, когда из памяти, а затем использовать «компилятор сгенерированного» кэшированные версии в регистрах или оптимизировать определенный код.

Что может вызвать путаницу здесь, это кеширование процессора или кеши программ (переменные a.k.a в регистрах).

Кэш CPU/Hardware на 100% прозрачен для программы, и аппаратное обеспечение обеспечивает 100% синхронизацию. Там не о чем беспокоиться, когда вы выписываете load из памяти, а данные поступают из кеша ЦП, тогда это те же данные, что и в адресной памяти.

Ваш компилятор может решить хотя бы «кэшировать» часто используемые переменные в регистрах, которые затем могут выйти из синхронизации с памятью, потому что аппаратное обеспечение не знает об этом. Это то, что предотвращает ключевое слово volatile. Обычный пример:

int * lock; 
while (*lock) { 
    // do work 
    // lock mot modified or accessed here 
} 

оптимизирующий компилятор увидит, что вы не используете в цикле lock и преобразовать это:

if (*lock) 
    while (true) { 
     // do work 
    } 

Это, очевидно, не поведение вы хотите, если lock должен быть измененный, например, другой поток. SO, вы отмечаете его летучие, чтобы предотвратить это:

volatile int * lock; 
while (*lock) { 
    // do work 
} 

Надеюсь, что это немного упростит.

+0

Означает ли это, что сама ОС заботиться о кеше должна быть синхронной? мы всегда будем получать правильное значение переменной после объявления volatile. Из-за кеша не будет проблем. –

+1

Аппаратное обеспечение позаботится о любых проблемах с когерентностью кеширования, а не ОС. Но да, никогда не будет проблем с аппаратным кешем. Вы можете немного прочитать об этом здесь: http://en.wikipedia.org/wiki/Cache_coherence –

+0

Большое спасибо ... –

0

Я прочитал эту wiki-страницу volatile, он дает пример о том, как gcc оптимизировать энергонезависимые переменные и как «изменчивый» предотвращает gcc-оптимизацию.
Я заметил, что после использования «volatile» для определения переменных gcc действительно не оптимизирует «изменчивые» переменные, но каждый раз, когда выполняется операция чтения/записи, сгенерированные инструкции используют «movl» для доступа. Я имею в виду, когда команда «movl» испускает адрес данных, как ядро ​​или процессор или другие части судят, следует ли читать его из кеша или памяти?
С.Л. отметил, что следующие ключевые точки:

Ваш компилятор может решить, хотя «кэш» часто используют переменные в регистрах, которые могут затем выходят из синхронизации с памятью, поскольку аппаратное обеспечение не знает о них. Это ключевое слово volatile предотвращает.

Как отметил Сергей Л., теперь я понимаю, «летучий» только препятствует оптимизации компилятора, имеющей отношение к «кэш программного обеспечения», т.е.часто используют переменные в регистры, а не в кеш-памяти, а «volatile» не может гарантировать видимость между различными потоками?
Я все еще очень смущен, может быть, я все еще неправильно понимаю это.