Структури даних, пов’язані з процесом

Кожен процес в системі має свої відкриті файли, кореневу файлову систем) поточний робочий каталог, точки монтування і тд Наступні три структури даних повязують разом підсистему VFS і процеси, які виконуються в системі Це структури files_struct, fs_struc t і namespace

Структура files_struc t визначена у файлі Адреса цієї структури зберігається в полі file s дескриптора процесу У даній структурі зберігається вся інформація процесу про відкриті файлах і файлових дескрипторах Ця структура, з коментарями, має наступний вигляд

struct files_struct {

atomic_t

count

/ * Лічильник посилань на дану структуру * /

spinlock_t

file_lock

/ * Блокування для захисту даної структури * /

int int

max_fds

max_fdset

/ * Максимальна кількість файлових обєктів * /

/ * Максимальна кількість файлових дескрипторів * /

int

struct file

next_fd

**fd

/ * Номер наступного файлового дескриптора * /

/ * Масив всіх файлових обєктів * /

fd_set * close on exec / * файлові дескриптори, які повинні

закриватися при виклику Ехес () * /

fd_set * open_fds / * Покажчик на дескриптори відкритих файлів * /

fd_set close_on_exec init / * Початкові файли для закриття при виклику exec () * /

fd_set open_fds_init / * Початковий набір файлових дескрипторів * /

struct file * fd_array [NR_OPEN_DEFAULT] / * Масив файлових обєктів * /

}

Масив fd вказує на список відкритих файлових обєктів За умовчанням це масив fd_array Так як за замовчуванням значення константи NR_OPEN_DEFAULT одно 32, то це відповідає 32 файловим обєктам Якщо процес відкриває більше 32 файлових обєктів, то ядро ​​виділяє новий масив і привласнює полю fd покажчик на нього При такому підході доступ до невеликої кількості файлових обєктів здійснюється швидко, тому що вони зберігаються в статичному масиві У разі, коли процес відкриває аномально велику кількість файлів, ядро ​​може створити новий масив Якщо більшість процесів у системі відкриває більше 32 файлів, то для отримання оптимальної продуктивності адміністратор може збільшити значення константи NR_OPEN_DE_FAULT за допомогою директиви препроцесора Наступна структура даних, повязана з процесом, – це структура fs_struct, яка містить інформацію, повязану з процесом, і на яку вказує поле fs дескриптора процесу Ця структура визначена у файлі

і має наступний вигляд з пояснюючими коментарями

struct fs struct {

atomic_t

count

/ * Лічильник посилань на структуру * /

rwlock_l

lock

/ * Блокування для захисту структури * /

int

umask

/ * Права доступу до файлу, використовувані

за замовчуванням * /

struct dentry

*root

/ * Обєкт dentry кореневого каталогу * /

struct dentry

*pwd

/ * Обєкт dentry поточного робочого каталогу * /

struct dentry * allroot / * Обєкт dentry альтернативного кореня * / struct vfsmounL * rootmnt / * Обєкт монтування кореневого каталогу * / struct vfsmount * pwdmnt / * Обєкт монтування поточного робочого каталогу * / struct vfsmount * altrootrnnt / * Обєкт монтування альтернативного кореня * /

}

Ця структура містить поточний робочий каталог і кореневої каталог даного процесу

Третя, і остання, структура-це структура namespace, яка визначена у файлі і на примірник якої вказує поле namespace дескриптора процесу Простори назв, індивідуальні для кожного процесу, були введені в ядрах Linux серії 24 Це дозволило створити для кожного процесу унікальне уявлення про змонтованих файлових системах Іншими словами, процес може мати не тільки унікальний кореневої каталог, але і повністю унікальну ієрархію змонтованих файлових систем, якщо це необхідно Як звичайно, нижче наведена відповідна структура даних з коментарями

struct namespace {

atomic_t

count

/ * Лічильник посилань на структуру * /

struct vfsmount struct list_head struct rw_semaphore

*root list sem

/ * Обєкт монтування кореневого каталогу * /

/ * Список точок монтування * /

/ * Семафор для захисту простору імен * /

}

Поле lis t являє собою двохзвязної список змонтованих файлових систем, які складають простір імен

Кожен дескриптор процесу має повязані з ним розглянуті структури даних Для більшості процесів їх дескриптор процесу вказує на унікальну структуру files_struc t і структуру fs_struct Однак для процесів,

створених з прапорами CLONE_FILES і CLONE_FS, ці структури є спільно іспользуемимі8 Звідси випливає, що кілька дескрипторів процесів можуть вказувати на одну і ту ж структуру files_struct, або структуру fs_struct Поле coun t кожної структури містить лічильник використання, що запобігає знищення структури даних, коли її використовує хоча б один процес

Структура namespac e використовується дещо по-іншому За замовчуванням вага процеси спільно використовують один простір імен (і відповідно одну ієрархію файлових систем) Тільки коли для системного виклику clon e () зазначений прапор CLONE_NEWNS, для процесу створюється унікальна копія простору імен Оскільки для більшості процесів цей прапор не вказується, процеси зазвичай успадковують простір імен батьківського процесу Отже, для більшості систем існує тільки один простір імен

Джерело: Лав, Роберт Розробка ядра Linux, 2-е видання : Пер з англ – М: ТОВ «ІД Вільямс »2006 – 448 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*