Чтение онлайн

на главную - закладки

Жанры

Разработка ядра Linux
Шрифт:

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

Каждый процесс в системе имеет свои открытые файлы, корневую файловую систем); текущий рабочий каталог, точки монтирования и т.д. Следующие три структуры данных связывают вместе подсистему VFS и процессы, которые выполняются в системе. Это структуры

files_struct
,
fs_struct
и
namespace
.

Структура

files_struct
определена в файле
<linux/file.h>
. Адрес этой структуры хранится в поле files дескриптора процесса. В данной структуре хранится вся информация процесса об открытых файлах и файловых дескрипторах.
Эта структура, с комментариями, имеет следующий вид.

struct files_struct {

 atomic_t count; /* счетчик ссылок на данную структуру */

 spinlock_t file_lock; /* блокировка для защиты данной структуры */

 int max_fds; /* максимальное количество файловых объектов */

 int max_fdset; /* максимальное количество

файловых дескрипторов */

 int next_fd; /* номер следующего файлового дескриптора */

 struct file **fd; /* массив всех файловых объектов */

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

закрываться при вызове 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_DEFAULT
с помощью директивы препроцессора. Следующая структура данных, связанная с процессом, — это структура
fs_struct
, которая содержит информацию, связанную с процессом, и на которую указывает поле
fs
дескриптора процесса. Эта структура определена в файле
<linux/fs_struct.h>
и имеет следующий вид с поясняющими комментариями.

struct fs_struct {

 atomic_t count; /* счетчик ссылок на структуру */

 rwlock_t lock; /* блокировка для защиты структуры */

 int umask; /* права доступа к файлу, используемые

по умолчанию */

 struct dentry *root; /* объект dentry корневого каталога */

 struct dentry *pwd; /* объект dentry

текущего рабочего каталога */

 struct dentry *allroot; /* объект dentry альтернативного корня */

 struct vfsmount *rootmnt; /*
объект монтирования корневого каталога */

 struct vfsmount *pwdmnt; /* объект монтирования

текущего рабочего каталога */

 struct vfsmount *altrootmnt; /* объект монтирования

альтернативного корня */

};

Эта структура содержит текущий рабочий каталог и корневой каталог данного процесса.

Третья, и последняя, структура — это структура

namespace
, которая определена в файле
<linux/namespace.h>
и на экземпляр которой указывает поле
namespace
дескриптора процесса. Пространства имен, индивидуальные для каждого процесса, были введены в ядрах Linux серии 2.4. Это позволило создать для каждого процесса уникальное представление о смонтированных файловых системах. Иными словами, процесс может иметь не только уникальный корневой каталог, но и полностью уникальную иерархию смонтированных файловых систем, если это необходимо. Как обычно, ниже приведена соответствующая структура данных с комментариями.

struct namespace {

 atomic_t count; /* счетчик ссылок на структуру */

 struct vfsmount *root; /* объект монтирования корневого каталога */

 struct list_head list; /* список точек монтирования */

 struct rw_semaphore sem; /* семафор для защиты пространства имен */

};

Поле

list
представляет собой двухсвязный список смонтированных файловых систем, которые составляют пространство имен.

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

files_struct
и структуру
fs_struct
. Однако для процессов, созданных с флагами
CLONE_FILES
и
CLONE_FS
, эти структуры являются совместно используемыми [74] . Отсюда следует, что несколько дескрипторов процессов могут указывать на одну и ту же структуру
files_struct
, или структуру
fs_struct
. Поле
count
каждой структуры содержит счетчик использования, что предотвращает уничтожение структуры данных, когда ее использует хотя бы один процесс.

74

Для создания потоков обычно указываются флаги

CLONE_FILES
и
CLONE_FS
, поэтому они совместно используют структуры
files_struct
и
fs_struct
. С другой стороны, для обычных процессов эти флаги не указываются, поэтому для каждого процесса существует своя информация о файловой системе и своя таблица открытых файлов.

Структура

namespace
используется несколько по-другому. По умолчанию вес процессы совместно используют одно пространство имен (и соответственно одну иерархию файловых систем). Только когда для системного вызова
clone
указан флаг
CLONE_NEWNS
, для процесса создается уникальная копия пространства имен. Поскольку для большинства процессов этот флаг не указывается, процессы обычно наследуют пространство имен родительского процесса. Следовательно, для большинства систем существует только одно пространство имен.

Поделиться:
Популярные книги

Наследник и новый Новосиб

Тарс Элиан
7. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник и новый Новосиб

Сумеречный стрелок 8

Карелин Сергей Витальевич
8. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Сумеречный стрелок 8

Идеальный мир для Социопата 2

Сапфир Олег
2. Социопат
Фантастика:
боевая фантастика
рпг
6.11
рейтинг книги
Идеальный мир для Социопата 2

Краш-тест для майора

Рам Янка
3. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
эро литература
6.25
рейтинг книги
Краш-тест для майора

Идеальный мир для Социопата 6

Сапфир Олег
6. Социопат
Фантастика:
боевая фантастика
рпг
6.38
рейтинг книги
Идеальный мир для Социопата 6

Королевская Академия Магии. Неестественный Отбор

Самсонова Наталья
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Королевская Академия Магии. Неестественный Отбор

Ненаглядная жена его светлости

Зика Натаэль
Любовные романы:
любовно-фантастические романы
6.23
рейтинг книги
Ненаглядная жена его светлости

Кодекс Охотника. Книга V

Винокуров Юрий
5. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.50
рейтинг книги
Кодекс Охотника. Книга V

Его наследник

Безрукова Елена
1. Наследники Сильных
Любовные романы:
современные любовные романы
эро литература
5.87
рейтинг книги
Его наследник

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Бальмануг. (Не) Любовница 2

Лашина Полина
4. Мир Десяти
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Бальмануг. (Не) Любовница 2

Корпулентные достоинства, или Знатный переполох. Дилогия

Цвик Катерина Александровна
Фантастика:
юмористическая фантастика
7.53
рейтинг книги
Корпулентные достоинства, или Знатный переполох. Дилогия

Идеальный мир для Лекаря 3

Сапфир Олег
3. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 3

Возмездие

Злобин Михаил
4. О чем молчат могилы
Фантастика:
фэнтези
7.47
рейтинг книги
Возмездие