2010-03-28 2 views
1

Я знаю, что под Windows есть функции API, такие как global_alloc() и такие, которые выделяют память и возвращают дескриптор, тогда этот дескриптор можно заблокировать и вернуть указатель, а затем снова разблокировать. Когда он разблокирован, система может перемещать эту часть памяти, когда она работает на низком уровне, оптимизируя использование памяти.Управление динамической памятью под Linux

Мой вопрос в том, что в Linux есть что-то подобное, а если нет, то как Linux оптимизирует использование памяти?

+0

Это GlobalAlloc(), BTW. – 2010-03-28 17:50:32

ответ

4

Эти функции Windows происходят с момента, когда все программы работали в одном и том же адресном пространстве в реальном режиме. Linux и современные версии Windows, запускайте программы в отдельных адресных пространствах, чтобы они могли перемещать их в ОЗУ путем переназначения того, какой физический адрес разрешает определенный виртуальный адрес в page tables. Не нужно обременять программиста такими деталями низкого уровня.

Даже в Windows больше не нужно использовать такие функции, кроме как при взаимодействии с небольшим количеством старых API. Я считаю, что блог и книга Раймонда Чэня обсуждают эту тему, если вас интересует более подробная информация. Например, вот part 4 серии по истории GlobalLock.

+0

Вправо. По той же причине Mac Systems 5-8 имела аналогичную схему. Теперь, к счастью, ушла в прошлое. – dmckee

1

Не уверен, что эквивалент Linux, но в ATT UNIX в диспетчере памяти основной ОС есть функции управления памятью «рассеяния». В операционной среде виртуальной памяти нет абсолютных адресов, поэтому приложения не имеют эквивалентной функции. Загрузчик исполняемого объекта (загружает исполняемый файл в память, где он становится процессом) использует адреса памяти из диспетчера памяти, которые все отслеживаются в блоках виртуальной памяти, которые хранятся в его таблице страниц (которая содержит адреса физической памяти). Итог - это физическое расположение макетов ваших приложений, вероятно, никоим образом не линейно и не доступно напрямую.

Смежные вопросы