Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции.doc
Скачиваний:
39
Добавлен:
30.04.2013
Размер:
16.33 Mб
Скачать

Внешний интерфейс

Контроллер памяти (ММ) имеет два вида интерфейсов для реализации

своих функций. Это интерфейс процесса пользователя и интерфейс для

связи с другими модулями ядра. Приведем некоторые функции интерфейса пользователя (System Сal1 Interface):

  • mаlloc / free()– выделение/освобождение региона памяти для исполь­зования в процессе пользователя; например вызов void *mallос(long пumbytes); выделяет заданное число байтов памяти и возвращает указатель на первый байт.

  • brk() –это очень простой системный вызов. При выделении памяти под конкретный процесс определяются его границы в памяти. Так вот, brk() просто сдвигает одну из них (в сторону уменьшения или увеличения), для добавления или удаления памяти процессу. Необходимо заметить, что этот вызов не включен в стандарт Си (ANSI) и POSIX.

  • mmap() / munmap() / msync() / mremap() – создание и использование виртуального файла в некотором регионе памяти. Функция mmap() или "memory mар" (карта памяти) похожа на brk(), но более гибкая. Во-первых, она может разметить память где угодно, а не только на границе памяти процесса. Во-вторых, она не только может соотнести виртуaльные адреса и физические для ОЗУ или свопинг-файла, но также может сделать то же са­мое и для файлов и их расположений, так что адресация памяти при чтении и записи будет иметь эффект записи и чтения данных напрямую из файла.

  • mprotect() – Блокирование виртуального файла от изменений;

  • mlock() / mlockall() / munlock() / munlockall() – фиксирова­ние/освобождение области памяти от процесса свопинга;

  • swapon() / swaponff() – добавление/удаление файла свопинга в систему;

К внутреннему системному интерфейсу относятся функции:

  • kmalloc() / kfree() – выделение и освобождение памяти для использова­ния в структурах данных ядра;

  • Verify_area()– проверка прав на доступ к выделенному региону памяти; get_free_page() / free_page() – выделение и освобождение физической памяти.

Реализация программ выделения памяти

Если вы хотите оценить и/или изменить требуемый объем памяти, то вам придется столкнуться со следующими действиями:

  • определить, достаточно ли у вас памяти для обработки данных;

  • получить секцию памяти из доступной памяти;

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

Библиотеки, которые реализуют функции для динамической работы с

памятью, называются аллокаторами (allocators). Название произошло от их основных функций – выделение (allocating) и освобождение (deallocating) памяти. Чем программа динамичнее (в плане работы с ресурсами), тем

больше внимания необходимо уделять вопросу управления памятью и тем ответственнее становится выбор механизмов ра6оты аллокатора.

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

  • скорость выделения памяти;

  • скорость осво6ождения памяти;

  • поведение в условиях потока (threaded environment);

  • поведение, когда память почти закончилась;

  • расположение Кэша;

  • переполнение памяти с управляющими данными;

  • поведения в условиях виртуальной памяти (Virtual Memory Environments);

  • работы с малыми и большими объектами;

  • поддержка режима реального времени.

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