WWW.REFERATCENTRAL.ORG.UA - Я ТУТ НАВЧАЮСЬ

... відкритий, безкоштовний архів рефератів, курсових, дипломних робіт

ГоловнаІнформатика, Компютерні науки → Як Unix працює з пам'яттю - Реферат

Як Unix працює з пам'яттю - Реферат

знайдена область*/
pgd_t * pgd; /*Каталог таблиць*/
atomic_t count;
int map_count; /* Кількість областей*/
struct semaphore mmap_sem;
unsigned long context;
unsigned long start_code, end_code, start_data, end_data;
unsigned long start_brk, brk, start_stack;
unsigned long arg_start, arg_end, env_start, env_end;
unsigned long rss, total_vm, locked_vm;
unsigned long def_flags;
unsigned long cpu_vm_mask;
unsigned long swap_cnt; /* number of pages to swap on next pass */
unsigned long swap_address;
/*
* This is an architecture-specific pointer: the portable
* part of Linux does not know about any segments.
*/
void * segments;
};
Відразу зауважуємо, що крім цілком зрозумілих покажчиків на початок даних (start_code, end_code ...) коду і стека є покажчики на дані відображених файлів (mmap). Це треба сказати особливість Linux - тягти в себе всі що тільки можна. Може бути це і добре, але з іншої сторони так розбазарюватися пам'яттю (згадаємо ще буфера введення/висновку при файловій системі, що теж будуть їсти всі нову пам'ять поки вона є) Даний підхід може негативно відбитися на стабільності системи, адже для запуску якогось життєво необхідного процесу може знадобитися час на звільнення зайвих кешей. Простенька перевірка на утрату вільної пам'яті: уведіть команду "cat /dev/mem >/image " і подивитеся скількох вільних пам'ятей після цього залишилося. Якщо вам це не подобається, то звернете погляд на функцію invalidate_inode_pages(* struct_inode), щозвільняє сторінковий кэш для даного файлу.
При будь-якім відкритті файлу, він відразу ж відображається в пам'ять і додається в сторінковий кэш. Реальний же запит на відображення файлу тільки повертає адреса на вже скешированные сторінки.
На рівні процесу робота може вестить як зі сторінками напямую, так і через абстрактну структуру vm_area_struct
struct vm_area_struct {
struct mm_struct * vm_mm; /* VM area parameters */
unsigned long vm_start;
unsigned long vm_end;
/* linked list of VM areas per task, sorted by address */
struct vm_area_struct *vm_next;
pgprot_t vm_page_prot;
unsigned short vm_flags;
/* AVL tree of VM areas per task, sorted by address */
short vm_avl_height;
struct vm_area_struct * vm_avl_left;
struct vm_area_struct * vm_avl_right;
/* For areas with inode, the list inode->i_mmap, for shm areas,
* the list of attaches, otherwise unused.
*/
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; /* shared mem */
};
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);
};
Ідея даної структури виникла з ідеї віртуальної файлової системи, тому всі операції над віртуальними областями абстрактні і можуть бути специфічними для різних типів пам'яті, наприклад при відображенні файлів операції читання одні а при відображенні пам'яті (через файл /dev/mem ) зовсім інші. Спочатку vm_area_struct з'явилася для забезпечення нестатків відображення, але поступово поширюється і на інші області.
Що робити, коли потрібно одержати нову область пам'яті. Є цілих 3 способи.
1. Уже знайомий get_free_page()
2. kmalloc - Простенька (по можливостях, але аж ніяк не коду) процедура з великими обмеженнями по виділенню нових областей і по їхньому розмірі.
3. vmalloc - Могутня процедура, що працює з віртуальною пам'яттю, може виділяти великі обсяги пам'яті.
З кожної з двох процедур у ядрі зв'язані ще за списком вільних/зайнятих областей, що ще більше ускладнює розуміння роботи з пам'яттю. (vmlist для vmalloc, kmem_cash для kmalloc)
Що ж у 2.4.
Додано підтримку нової архітектури пам'яті NUMA. У противагу класичної UMA пам'ять поділяється на зони з різним часом доступу до кожної з них . Це дуже корисно і для кластерных рішень. У зв'язку з цим з'явилися нові обгортки на функції і знайти суть стало ще складніше. З'явилася також підтримка пам'яті до 64Гб.
Раніш для усіх файлових систем був один generic_file_read і generic_file_mmap у зв'язку з тотальним засмоктуванням усього підряд у пам'ять при читанні (розходження робилися вже тільки на рівні inode->readpage). Тепер з'явився і generic_file_write. У загальному ще пари таких generic і прощай віртуальна файлова система.
Але подивимося - побачимо. Адже Linux розвивається дуже швидко і не завжди передбачувано.
Loading...

 
 

Цікаве