Что такое модель памяти С++ 03 для concurrency?

Что такое модель памяти для concurrency в С++ 03?

(И, улучшает ли С++ 11 модель памяти для поддержки concurrency лучше?)

+33
21 окт. '08 в 4:19
источник поделиться
7 ответов

Модель памяти С++ - это спецификация того, когда и почему физическая память считывается/записывается в отношении кода на С++.

До следующего стандарта С++ модель памяти С++ такая же, как C. В стандарте С++ 0x предполагается включить правильную модель памяти для многопоточности (см. здесь), и это будет частью возможного следующего пересмотра стандарта C C1X. Текущий рудиментарный:

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

Итак, текущее состояние: Операции с памятью С++ задаются только в том случае, если у вас есть 1 процесс с его основным потоком и не записывать код, который зависит от конкретного заказа переменной read/write и что он. По сути, это означает, что помимо традиционной мировой программы привет, вы ввернуты.

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

Хорошо, это немного грубо, но черт, даже Херб Саттер признает, что (просто прочитал вступительное слово), и он говорит обо всех pre 2007 версии одной из самых распространенных инструментальных средств C/С++...

Комитет по стандартизации С++ пытается придумать что-то, что будет решать все эти проблемы, но при этом все еще менее ограничено (и, следовательно, лучше работает), чем модель памяти Java.

Hans Boehm собрал здесь некоторые указатели на документы по этому вопросу, как академические, так и комитеты С++.

+34
21 окт. '08 в 7:20
источник

Увидев некоторые другие ответы, кажется, что многие программисты на C++ даже не знают, что "модель памяти" вы запрашиваете о средствах.

Вопросы касаются модели памяти в том смысле: какие гарантии (если есть) существуют в отношении переупорядочения записи/чтения (что может произойти со стороны компилятора или со стороны выполнения)? Этот вопрос очень важен для многопоточного программирования, так как без таких правил писать правильные многопоточные программы невозможно, и несколько удивительная истина связана с отсутствием в настоящее время явной модели памяти. Многие многопоточные программы работают более или менее "по чистой удаче" - чаще всего благодаря компиляторы, предполагающие наложение указателя на вызовы функций. - см. Нити не могут быть реализованы как библиотека

В текущем С++ нет стандартной модели памяти. Некоторые компиляторы определяют модель памяти для изменчивых переменных, но это нестандартно. С++ 0x определяет новые "атомные" примитивы для этой цели. Исчерпывающая стартовая точка для проверки того, что последний статус можно найти на Тематика и модель памяти для С++

Важные ссылки также Concurrency модель памяти, Atomic Types и Стандартные предложения по заказу данных: модель Atomics and Memory Model.

+23
21 окт. '08 в 7:27
источник

К сожалению, в С++ нет "стандартной модели памяти", такой как Java. Фактическая реализация остается до компилятора, библиотек времени выполнения и процессоров.

Таким образом, модель памяти С++ == хаотическое смешивание моделей, что означает, что вам всегда нужно пытаться написать безопасный код, который не зависит от конкретной модели памяти, и это также относится к программированию с резьбой, поскольку компилятор может делать любую оптимизацию, которую он хочет за пределами критической секции, даже из-за обработки заказа!

+2
21 окт. '08 в 4:54
источник

Как насчет проверки документов на веб-сайте стандартного комитета С++:

?

+2
21 окт. '08 в 7:23
источник

Если вы хотите получить более глубокое представление о моделях согласованности с общей памятью, я приведу вам следующий учебник.

http://rsim.cs.uiuc.edu/~sadve/Publications/computer96.pdf

+1
04 мая '10 в 1:40
источник

Короткий ответ: нет

Длинный ответ: у С++ нет управляемой памяти, вы должны выделить ее и освободить ее самостоятельно. Умные классы указателей могут сделать это менее обременительным. Если вы забудете освободить память, которую вы выделили, это утечка памяти и ошибка. Если вы попытаетесь использовать память после ее освобождения или пытаетесь освободить память более одного раза, это также неприятные ошибки.

Что касается низкоуровневых деталей, С++ не указывает, что это - до аппаратного обеспечения. Доступ к памяти осуществляется с помощью указателей, которые содержат какой-то адрес памяти. Адресами памяти могут быть физические адреса или виртуальные адреса. Вы будете видеть только физические адреса, если работаете с ядром операционной системы, или если вы читаете старый код DOS, который запускается в реальном режиме. Для получения дополнительной информации прочитайте виртуальную память, там много хороших ресурсов.

Архитектура x86 также позволяет обрабатывать память с использованием дескрипторов сегментов. Это целая ночная червь червей, которая на самом деле не использовалась со времен Win16, и если вам повезет, вам никогда не придется иметь дело с ней.

-1
21 окт. '08 в 5:21
источник

В двух словах модель памяти С++ состоит из...

  • Стек, который растет вниз - то есть, когда вы нажимаете кадр стека, указатель стека имеет меньшее значение, чем

  • Куча, которая растет вверх, то есть конечный адрес вновь выделенной памяти, больше, чем перед памятью. Вы выделяете память в кучу, используя malloc() или new. Если в куче недостаточно памяти, тогда malloc (или новый) вызывает системную функцию brk() sbrk(), чтобы увеличить размер кучи. Если вызов brk() или sbrk() завершается с ошибкой, malloc или new fail с исключением из памяти.

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

  • Распределитель памяти, malloc, который распределяет память в терминах 8-битных байтов. Новое также выделяет память, но объем памяти, который он выделяет, зависит от размера нового объекта.

  • Текстовое пространство, содержащее исполняемый код. Текст находится ниже кучи. Вы не можете изменить текстовое пространство во время выполнения

Программа может иметь другие разделы специального назначения под текстом.

Вы можете видеть, как программа организована статически (перед ее загрузкой) с использованием objdump в Linux-системах.

Я заметил, что, хотя вы не упомянули об этом в своем вопросе, "concurrency" - это одно из ключевых слов, которые вы назначили этому вопросу. Резьбовые системы накладывают дополнительное пространство резьбы на кучу для каждого потока, а затем управляют указателем стека для переключения между потоками.

Есть намного больше деталей, многие из которых специфичны для аппаратного обеспечения, ОС или системы потоковой передачи, но это основная идея.

-8
21 окт. '08 в 5:38
источник

Посмотрите другие вопросы по меткам или Задайте вопрос