Операционные системы - статьи


Как Linux работает с памятью. - часть 4


Переносимая часть Linux ничего не знает о сегментах. */ void * segments; };

Сразу замечаем, что помимо вполне понятных указателей на начало данных (start_code, end_code ...) кода и стека есть указатели на данные отображенных файлов (mmap). Это, надо сказать, особенность Linux - тащить в себя все, что только можно. Может быть это и хорошо, но с другой стороны так разбазариваться памятью ...(вспомним еще буфера ввода/вывода при файловой системе, которые тоже будут кушать все новую память пока она есть). Данный подход может негативно отразиться на стабильности системы, ведь для запуска какого-то жизненно необходимого процесса может потребоваться время на освобождение лишних кешей. Простенькая проверка на потерю свободной памяти: введите команду "cat /dev/mem >/image " и посмотрите сколько свободной памяти после этого осталось. Если вам это не нравится, то обратите взгляд на функцию invalidate_inode_pages(* struct_inode), освобождающую страничный кэш для данного файла.

При любом открытии файла, он сразу же отображается в память (точнее его часть, дочитанная до размера страницы. Например, для Intel при чтении 10 байт будут прочитаны 4096) и добавляется в страничный кэш. Реальный же запрос на отображение файла только возвращает адрес на уже кэшированные страницы.

На уровне процесса работа может вестись как со страницами напрямую, так и через абстрактную структуру vm_area_struct

struct vm_area_struct { struct mm_struct * vm_mm; /* параметры области виртуальной памяти */ unsigned long vm_start; unsigned long vm_end; /* Связянный список областей задачи отсортированный по адресам */ struct vm_area_struct *vm_next; pgprot_t vm_page_prot; unsigned short vm_flags; /* AVL-дерево областей, для ускоренного поиска, сортировка по адресам */ short vm_avl_height; struct vm_area_struct * vm_avl_left; struct vm_area_struct * vm_avl_right; /* Для областей используемых при отображении файлов или при работе с разделяемой памяти, иначе эта часть структуры не используется */ struct vm_area_struct *vm_next_share; struct vm_area_struct **vm_pprev_share; struct vm_operations_struct * vm_ops; /*операции над областью */ unsigned long vm_offset; struct file * vm_file; unsigned long vm_pte; /* разделяемая память */ }; struct vm_operations_struct { void (*open)(struct vm_area_struct * area); void (*close)(struct vm_area_struct * area); void (*unmap)(struct vm_area_struct *area, unsigned long, size_t); void (*protect)(struct vm_area_struct *area, unsigned long, size_t, unsigned int newprot); int (*sync)(struct vm_area_struct *area, unsigned long, size_t, unsigned int flags); void (*advise)(struct vm_area_struct *area, unsigned long, size_t, unsigned int advise); unsigned long (*nopage)(struct vm_area_struct * area, unsigned long address, int write_access); unsigned long (*wppage)(struct vm_area_struct * area, unsigned long address, unsigned long page); int (*swapout)(struct vm_area_struct *, struct page *); pte_t (*swapin)(struct vm_area_struct *, unsigned long, unsigned long); };




Начало  Назад  Вперед



Книжный магазин