В Windows, Mac и Linux существует виртуальная память для каждого прикладного программного процесса в стеке ОЗУ.

Но что касается фактического использования моей памяти для доступа к типам данных, где именно будет отображаться моя память и когда она станет физической:

1.После компиляции.

2.Во время компиляции.

3.По факту погрузки и исполнения.

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

2 ответа2

4

Адресное пространство, которое видит ваша программа, ВСЕГДА виртуально. (По крайней мере, в каждой современной ОС.)
Вы выделяете память, вызывая для этого API-интерфейсы ОС (или компилятор делает это за вас, когда вы определяете переменные в своем коде).
Адреса (или указатели, независимо от того, как их называет язык программирования), которые вы возвращаете для этой выделенной памяти, действительны в контексте вашей программы.
За память, которую вы выделили самостоятельно, вы несете ответственность за ее возврат в ОС. Если компилятор сделал что-то от вашего имени, он также включит необходимую очистку. Когда ваша программа выходит из ОС, она также выполнит некоторую очистку.

Где фактические данные программы находятся в физической памяти компьютера, полностью академичны. Ваша ОС отобразит виртуальное адресное пространство, которое видит ваша программа, в физическое ОЗУ и / или пространство подкачки. Вы сами просто не можете знать, как это делается в любой момент времени.

Это может быть важно, если вы программируете драйвер устройства или компонент ядра, но у вас явно нет необходимых знаний об операционных системах и программировании для этого. Это ясно из твоего вопроса.
Такое программное обеспечение работает на другом уровне и может взаимодействовать с реальной физической ОЗУ. Для этого есть специальные методы и API, но вы никогда не встретите их в обычной пользовательской программе.
Другая возможность - когда вы выполняете низкоуровневое программирование на встроенном устройстве, где нет ОС, обеспечивающей этот уровень абстракции между виртуальной и физической ОЗУ. Опять же: это что-то для специалистов.

Вам просто не о чем беспокоиться, если вы пишете правильные программы по правилам языка программирования.
Конечно, если ваша программа неверна (например, обращается к памяти, которую она никогда не выделяла), программа может аварийно завершиться или будет остановлена самой ОС, если ОС обнаружит, что программа работает неправильно. Выяснение того, что пошло не так, и исправление проблемы в программе - важный аспект программирования. Это называется отладкой.

-1

Эта статья вики описывает все, что вы хотите знать.

http://en.wikipedia.org/wiki/Translation_lookaside_buffer

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .