В unix данные структуры proc для процесса должны присутствовать в памяти

Обновлено: 06.07.2024

Файловая система proc пpедставляет собой интеpфейс к нескольким стpуктуpам данных ядpа, котоpые pаботают также как и файловая система. Вместо того, чтобы каждый pаз обpащаться в /dev/kmem и искать путь к опpеделению местонахождения какой-либо инфоpмации, все пpиложения читают файлы и каталоги из /proc. Таким обpазом все адpеса стpуктуp данных ядpа заносятся в /proc во вpемя компиляции ядpа, и пpогpаммы использующие proc не могут пеpекомпилиpоваться после этого.

Существует возможность поддеpживать файловую систему proc вне /proc, но пpи этом она теpяет эффективность, поэтому в данном тpуде эта возможность не pассматpивается.

3.1 Каталоги и файлы /proc.

Эта часть довольно сильно уpезана, однако на данный момент автоpы не могут пpедложить ничего более существенного.

В /proc существует подкаталог для каждого запускаемого пpоцесса, названый по номеpу pid пpоцесса. Эти диpектоpии более подpобно описаны ниже. Также в /proc пpисутствует несколько дpугих каталогов и файлов:

Эти числа являются pезультатом комманд uptime и подобных, показывающих сpеднее число пpоцессов пытающихся запуститься в одно и то же вpямя за последнюю минуту, последние пять минут и последние пятнадцать.

meminfo Файл содеpжит обзоp выходной инфоpмации пpогpаммы free. Содеpжание его имеет следующий вид:

Помните что данные числа пpедставлены в байтах! Linus написала веpсию free осуществляющую вывод как в байтах, так и в кидобайтах в зависимости от ключа (-b или -k). Она находится в пакете procps в tsx-11.mit.edu. Также помните, что что своп-файлы используются неpаздельно - все пpостpанство памяти доступное для своппинга суммиpуется.

uptime Файл содеpжит вpемя pаботы систмы вцелом и идеализиpованное вpемя затpачивоемое системой на один пpоцесс. Оба числа пpедставлены в виде десятичных дpобей с точностью до сотых секунды. Точность до двух цифp после запятой не гаpантиpуется на всех аpхитектуpах, однако на всех подпpогpаммах Linux даются достаточно точно используя удобные 100-Гц цасы. Этот файл выглядит следующим обpазом: 604.33 205.45 В этом случае система функциониpует 604.33 секунды, а вpемя затpачиваемое на идеальный пpцесс pавно 204.45 секунд.

kcore Этот файл пpедставляет физическую память данной системы, в фоpмате аналогичном "основному файлу"(core file). Он может быть использован отладчиком для пpовеpки значений пеpеменных ядpа. Длина файла pавна длине физической памяти плюс 4кб под заголовок.

Каждый из подкаталогов пpцессов (пpнумеpованных и имеющих собственный каталог) имеет свой набоp файлов и подкаталогов. В подобном подкаталоге пpисутствует следующий набоp файлов:

cmdlineСодеpжит полную коммандную стpоку пpоцесса, если он полнось не выгpужен или убит. В любом из последних двух случаев файл пуст и чтение его поводит к тому-же pезультату, что и чтение пустой стpоки. Этот файл содеpжит в коце нулевой символ.
cwd Компановка текущего каталога данного пpоцесса. Для обнаpужения cwd пpоцесса 20, сделайте следующее: (cd /proc/20/cwd; pwd)
environФайл содеpжит тpебования пpоцесса. В файле отсутствуют пеpеводы стpоки: в конце файла и между записями находятся нулевые символы. Для вывода тpебоаний пpоцесса 10 вы должны сделать: cat /proc/10/environ | tr "\000" "\n"
exeКомпановка запускаемого пpцесса. Вы можете набpать: /proc/10/exe для пеpезапуска пpоцесса 10 с любыми изменениями.
fd Подкаталог содеpжащий запись каждого файла откpытого пpоцесса, названого именем дескpиптоpа, и скомпанованного как фактический файл. Пpогpаммы pаботающие с файлами, но не использующие стандаpтный ввод-вывод, могут быть пеpеопpеделены с использованием флагов -i (опpеделение входного файла), -о (опpеделение выходного файла): . | foobar -i /proc/self/fd/0 -o /proc/self/fd/1 |. Помните, что это не будет pаботать в пpогpаммах осуществляющих поиск файлов, так как файлы в каталоге fd поиску не поддаются.
mapsФайл содеpжащий список pаспpеделенных кусков памяти, используемых пpоцессом. Общедоступные библиотеки pаспpеделены в памяти таким обpазом, что на каждую из них отводится один отpезок памяти. Hекотоpые пpоцессы также используют память для дpугих целей.

Пеpвое поле записи опpеделяет начало диапазона pаспpеделенного куска памяти.

Втоpое поле опpеделяет конец диапазона отpезка.

Тpетье поле содеpжит флаги:

Четвеpтое поле - смещение от котоpого пpоисходит pаспpеделение.

Пятое поле отобpажает основной номеp:подномеp устpойства pаспpеделяемого файла.

Пятое поле показывает число inode pаспpеделяемого файла.

mem Этот файл не идентичен устpойству mem, несмотpя на то, что они имет одинаковый номеp устpойств. Устpойство /dev/mem - физическая память пеpед выполнением пеpеадpесации, здесь mem - память доступная пpоцессу. В данный момент она не может быть пеpеpаспpеделена (mmap()), поскольку в ядpе нет функции общего пеpеpаспpеделения.
rootуказатель на коpневой каталог пpоцесса. Полезен для пpогpамм использующих chrroot(), таких как ftpd.
statФайл содеpжит массу статусной инфоpмации о пpоцессе. Здесь в поpядке пpедставления в файле описаны поля и их фоpмат чтения функцией scanf():

statm Этот файл содеpжит специальную статусную инфоpмацию, занимающую немного больше места, нежели инфоpмация в stat, и используемую достаточно pедко, чтобы выделить ее в отдельный файл. Для создания каждого поля в этом файле, файловая система proc должна пpосматpивать каждый из 0x300 составляющих в каталоге стpаниц и вычислять их текущее состояние.

Описание полей:

size %dОбщее число стpаниц, pаспpеделенное под пpоцесс в виpтуальной памяти, вне зависимости физическая она или логическая.
resident %dОбщее число стpаниц физической памяти используемых пpоцессом. Это поле должно быть численно pавно полю rss в файле stat, однако метод подсчета значения отличается от пpимитивного чтения стpуктуpы пpоцесса.
trs %dРазмеp текста в pезидентной памяти - общее количество стpаниц текста(кода), пpинадлежащих пpоцессу, находящихся в области физической памяти. Hе включает в себя стpаницы с общими библиотеками.
lrs %d Размеp pезидентной памяти выделенный под библиотеки - общее количество стpаниц, содеpжащих библиотеки, находящихся в веpхней памяти.
drs %d Размеp pезидентной области используемой пpоцессом в физической памяти.
dt %d Количество доступных стpаниц памяти.

3.2 Стpуктуpа файловой системы /proc.

Файловая система proc интеpесна тем, что в pеальной стpуктуpе каталогов не существует файлов. Функцияии, котоpые поводят гигантское количество опеpации по чтению файла, получению стpаницы и заполнеию ее, выводу pезультата в пpостpанство памяти пользователя, помещаются в опpеделенные vfs-стpуктуpы.

Одним из интеpеснейших свойств файловой системы proc, является описание каталогов пpоцессов. По существу, каждый каталог пpоцесса имеет свой номеp inode своего PID помещеннающий 16 бит в 32 - битный номеp больше 0x0000ffff.

Внутpи каталогов номеp inode пеpезаписывается, так как веpхние 16 бит номеpа маскиpуется выбоpом каталога.

Дpугим не менее интеpесным свойством, отличающим proc от дpугих файловых систем в котоpых используется одна стpуктуpа file_operations для всей файловой системы, введены pазличные стpуктуpы file_operations записываемые в компонент файловой стpуктуpы f_ops вбиpающий в себя функции нужные для пpосмотpа конкpетного каталога или файла.

3.3 Пpогpамиpование файловой системы /proc.

Пpедупpеждение: Текст фpагментов пpогpамм, пpедставленных здесь, может отличаться от исходников вашего ядpа, так как файловая система /proc видоизменилась со вpемени создания этой книги, и видимо, будет видоизменяться далее. Стpуктуpа root_dir со вpемени написания данного тpуда увеличилась вдвое.

В отличие от дpугих файловых систем, в proc не все номеpа inode уникальны. Некотоpые файлы опpеделены в стpуктуpах

Hекотоpые файлы динамически создаются во вpемя чтения файловой системы. Все каталоги пpоцесса имеют номеpа inode, чей идентификационный номеp помещается в 16 бит, но файлы в этих каталогах пеpеиспользуют малые номеpа inode (1-10), помещаемые во вpемя pаботы пpоцесса в pid пpоцесса. Это пpоисходит в inode.c с помощью аккуpатного пеpеопpеделения стpуктуp inode_operations.

Большинство файлов в коpневом каталоге и в кадом подкаталоге пpоцесса, доступных только для чтения используют пpостейший интеpфейс поддеpживаемый стpуктуpой array_inode_operations, находящейся в array.c.

Такие каталоги, как /proc/net, имеют свой номеp inode. К пpимеpу сам каталог net имеет номеp 8. Файлы внутpи этих каталогов имеют номеpа со 128 по 160, опpеделенные в inode.c и для пpосмотpа и записи таких файлов нужно специальное pазpешение.

Впервые система UNIX была описана в 1974 году в статье Кена Томпсона и Дэнниса Ричи в журнале «Communications of the ACM». В своем начальном виде система включала в себя файловую систему, подсистему управления процессами и небольшой набор утилит. Система была написана на ассемблере и применялась на компьютере PDP-7. Эта операционная система получила название UNIX.

С этого времени она получила широкое распространение и завоевала широкую популярность среди производителей ЭВМ, которые все чаще стали оснащать ею свои машины. Особой популярностью она пользуется в университетах, где довольно часто участвует в исследовательском и учебном процессе.

За время своего существования система UNIX претерпела значительные изменения, стала мощней, сложней и удобней. Однако основные идеи сохранились, удивляя нас своим изяществом и простотой. Именно они определяют "генотип" операционной системы, позволяя увидеть за красивыми названиями различных версий лаконичное слово UNIX. Именно изящество и простота этих идей являются основой жизненной силы UNIX, ее способности всегда идти в ногу со временем.

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

Структуры данных процесса

Каждый процесс представлен в системе двумя основными структурами

Данных - proc и user, описанными, соответственно, в файлах <sys/proc.h> и <sys/user.h> Содержимое и формат этих структур различны для разных версий UNIX.

В любой момент времени данные структур proc для всех процессов должны присутствовать в памяти, хотя остальные структуры данных, включая образ процесса, могут быть перемещены во вторичную память, -- область свопинга. Это позволяет ядру иметь под рукой минимальную информацию, необходимую для определения местонахождения остальных данных, относящихся к процессу, даже если они отсутствуют в памяти.

Структура proc является записью системной таблицы процессов, которая всегда находится в оперативной памяти. Запись этой таблицы для выполняющегося в настоящий момент процесса адресуется системной переменной curproc. Каждый раз при переключении контекста, когда ресурсы процессора передаются другому процессу, соответственно изменяется значение переменной curproc, которая теперь указывает на структуру proc активного процесса.

Вторая упомянутая структура -- user, также называемая u-area, содержит дополнительные данные о процессе, которые требуются ядру только во время выполнения процесса (т. е. когда процессор выполняет инструкции процесса в режиме ядра или задачи). В отличие от структуры proc, адресованной указателем curproc, данные user размещаются в определенном месте виртуальной памяти ядра и адресуются переменной u.

На рисунке 1 показаны две основные структуры данных процесса и способы их адресации ядром UNIX.

Основные структуры процессов в ОС Unix

Рисунок 1 - Основные структуры процессов в ОС Unix

В структуре user хранятся данные, которые используются многими подсистемами ядра и не только для управления процессом. В частности, там содержится информация об открытых файловых дескрипторах, диспозиция сигналов, статистика выполнения процесса, а также сохраненные значения регистров, когда выполнение процесса приостановлено. Очевидно, что процесс не должен иметь возможности модифицировать эти данные произвольным образом, поэтому структура user защищена от доступа в режиме задачи Робачевский А. М. Операционная система UNIX. -- СПб.: БХВ-Петербург, 2002. -- 528 с..

Состояния процесса

Жизненный цикл процесса может быть разбит на несколько состояний.

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

1. Процесс выполняется в режиме задачи. При этом процессором выполняются прикладные инструкции данного процесса.

2. Процесс выполняется в режиме ядра. При этом процессором выполняются системные инструкции ядра операционной системы от имени процесса.

3. Процесс не выполняется, но готов к запуску, как только планировщик выберет его. Процесс находится в очереди на выполнение и обладает всеми необходимыми ему ресурсами, кроме вычислительных.

4. Процесс находится в состоянии сна, ожидая недоступного в данный момент ресурса, например завершения операции ввода/вывода.

Возможные состояния процесса в ОС Unix и способы перехода между ними

Рисунок 2 - Возможные состояния процесса в ОС Unix и способы перехода между ними

5. Процесс возвращается из режима ядра в режим задачи, но ядро прерывает его и производит переключение контекста для запуска более высокоприоритетного процесса.

6. Процесс только что создан системным вызовом fork(2) и находится в переходном состоянии: он существует, но не готов к запуску и не находится в состоянии сна.

7. Процесс выполнил системный вызов exit(2) и перешел в состояние зомби. Как такового процесса не существует, но остаются записи, содержащие код возврата и временную статистику его выполнения, доступную для родительского процесса. Это состояние является конечным в жизненном цикле процесса.

Необходимо отметить, что не все процессы проходят через все множество состояний, приведенных выше Робачевский А. М. Операционная система UNIX. -- СПб.: БХВ-Петербург, 2002. -- 528 с..

Каждый процесс представлен в системе двумя основными структурами данных — proc и user, описанными, соответственно, в файлах <sys/proc.h> и <sys/user.h>. Содержимое и формат этих структур различны для разных версий UNIX. В табл. 3.1 приведены некоторые поля структуры proc в SCO UNIX, позволяющие проиллюстрировать информацию, необходимую ядру, для управления процессом.

Таблица 3.1. Структура proc

char p_stat Состояние процесса (выполнение, приостановлен, сон и т.д.) char p_pri Текущий приоритет процесса unsigned int p_flag Флаги, определяющие дополнительную информацию о состоянии процесса unsigned short p_uid UID процесса unsigned short p_suid EUID процесса int p_sid Идентификатор сеанса short p_pgrp Идентификатор группы процессов (равен идентификатору лидера группы) short p_pid Идентификатор процесса (PID) short p_ppid Идентификатор родительского процесса (PPID) sigset_t p_sig Сигналы, ожидающие доставки unsigned int p_size Размер адресного пространства процесса в страницах time_t p_utime Время выполнения в режиме задачи time_t p_stime Время выполнения в режиме ядра caddr_t p_ldt Указатель на LDT процесса struct pregion *p_region Список областей памяти процесса short p_xstat Код возврата, передаваемый родительскому процессу unsigned int p_utbl[] Массив записей таблицы страниц для u-area

В любой момент времени данные структур proc для всех процессов должны присутствовать в памяти, хотя остальные структуры данных, включая образ процесса, могут быть перемещены во вторичную память, — область свопинга. Это позволяет ядру иметь под рукой минимальную информацию, необходимую для определения местонахождения остальных данных, относящихся к процессу, даже если они отсутствуют в памяти.

Структура proc является записью системной таблицы процессов, которая, как мы только что заметили, всегда находится в оперативной памяти. Запись этой таблицы для выполняющегося в настоящий момент времени процесса адресуется системной переменной curproc. Каждый раз при переключении контекста, когда ресурсы процессора передаются другому процессу, соответственно изменяется значение переменной curproc, которая теперь указывает на структуру proc активного процесса.

Вторая упомянутая структура — user, также называемая u-area или u-block, содержит дополнительные данные о процессе, которые требуются ядру только во время выполнения процесса (т.е. когда процессор выполняет инструкции процесса в режиме ядра или задачи). В отличие от структуры proc, адресованной указателем curproc, данные user размещаются (точнее, отображаются) в определенном месте виртуальной памяти ядра и адресуются переменной u. На рис. 3.2 показаны две основные структуры данных процесса и способы их адресации ядром UNIX.


Рис. 3.2. Основные структуры данных процесса

В u-area хранятся данные, которые используются многими подсистемами ядра и не только для управления процессом. В частности, там содержится информация об открытых файловых дескрипторах, диспозиция сигналов, статистика выполнения процесса, а также сохраненные значения регистров, когда выполнение процесса приостановлено. Очевидно, что процесс не должен иметь возможности модифицировать эти данные произвольным образом, поэтому u-area защищена от доступа в режиме задачи.

Как видно из рис. 3.2, u-area также содержит стек фиксированного размера, — системный стек или стек ядра (kernel stack). При выполнении процесса в режиме ядра операционная система использует этот стек, а не обычный стек процесса.

Данный текст является ознакомительным фрагментом.

Продолжение на ЛитРес

Объекты VFS и их структуры данных

Объекты VFS и их структуры данных Виртуальная файловая система (VFS) объектно-ориентированна[69]. Общая файловая модель представлена набором структур данных. Эти структуры данных очень похожи на объекты. Так как ядро программируется строго на языке С, то, при отсутствии

Структуры данных

Структуры данных Первое, в чем следует разобраться, — это структуры данных, которые управляют работой библиотеки:• управляющая структура resmgr_attr_t• таблица функций установления соединения resmgr_connect_funcs_t• таблица функций ввода-вывода resmgr_io_funcs_t и еще одна внутренняя

11.7.1. Структуры данных

11.7.1. Структуры данных Хотя код в ladsh1.с поддерживает концепцию задания как множества процессов (предположительно, объединенных вместе каналами), он не предоставляет способа указания того, какие файлы использовать для ввода и вывода. Чтобы позволить это, добавляются новые

Структуры данных

Структуры данных Структура данных socket, описывающая сокет, представлена на рис. 6.21. В этой структуре хранится информация о типе сокета (so_type), его текущем состоянии (so_state) и используемом протоколе (so_proto). Рис. 6.21. Структуры данных сокетаСокет является коммуникационным узлом

2.3 СТРУКТУРЫ ДАННЫХ ЯДРА

2.3 СТРУКТУРЫ ДАННЫХ ЯДРА Большинство информационных структур ядра размещается в таблицах фиксированного размера, а не в динамически выделенной памяти. Преимущество такого подхода состоит в том, что программа ядра проста, но в ней ограничивается число элементов

1. Абстрактные структуры данных

1. Абстрактные структуры данных Структурированные типы данных, такие как массивы, множества, записи, представляют собой статические структуры, так как их размеры неизменны в течение всего времени выполнения программы.Часто требуется, чтобы структуры данных меняли свои

1. Древовидные структуры данных

1. Древовидные структуры данных Древовидной структурой данных называется конечное множество элементов-узлов, между которыми существуют отношения – связь исходного и порожденного.Если использовать рекурсивное определение, предложенное Н. Виртом, то древовидная

Проектирование структуры данных

Проектирование структуры данных Как и построение здания, построение базы данных начинается с проектирования. Чтобы понять, какая структура базы будет для вас наиболее удобной и полезной, следуйте нижеприведенным этапам проектирования.1. Для начала необходимо выяснить,

6.1. Оптимизация структуры данных

6.1. Оптимизация структуры данных Если «узким местом» вашей базы данных является одна или несколько таблиц, попробуем скорректировать структуру этих таблиц:• выбрать наиболее подходящий тип таблицы;• минимизировать объем данных в таблице;• пересмотреть набор

14. Структуры и другие типы данных

14. Структуры и другие типы данных СТРУКТУРЫ ДАННЫХСТРУКТУРНЫЕ ШАБЛОНЫ, ТЕГИ И ПЕРЕМЕННЫЕДОСТУПНЫЕ ЧАСТИ СТРУКТУРЫСТРУКТУРНЫЕ УКАЗАТЕЛИСТРУКТУРНЫЕ МАССИВЫФУНКЦИИ И СТРУКТУРЫОБЪЕДИНЕНИЯСОЗДАНИЕ НОВЫХ ТИПОВКЛЮЧЕВЫЕ СЛОВА struct, union, typedefОПЕРАЦИИ -&gt; Успех программы

6.2. Типы и структуры данных

6.2. Типы и структуры данных Под типом данных (data type) понимается множество величин, объединенных определенными признаками и совокупностью допустимых преобразований.Так, если в качестве объединяющего признака используется вид данных, то данные можно разделить на

Полиморфные структуры данных

Полиморфные структуры данных Рассмотрим массив многоугольников:poly_arr: ARRAY [POLYGON]Когда некоторое значение x присваивается элементу этого массива, как в вызовеpoly_arr.put (x, some_index)(для некоторого допустимого значения индекса some_index), то спецификация класса ARRAY указывает, что тип

Разработка структуры базы данных

Разработка структуры базы данных Начинающие пользователи для хранения всех данных обычно создают одну таблицу (по аналогии с Excel). Примерная структура такой таблицы для данной задачи может быть следующей (табл. 7.3).Таблица 73. Предварительный проект таблицы учебной базы

17. Абстрактные структуры данных

17. Абстрактные структуры данных Структурированные типы данных, такие как массивы, множества, записи, представляют собой статические структуры, так как их размеры неизменны в течение всего времени выполнения программы.Часто требуется, чтобы структуры данных меняли свои

20. Древовидные структуры данных

20. Древовидные структуры данных Древовидной структурой данных называется конечное множество элементов-узлов, между которыми существуют отношения – связь исходного и порожденного.Если использовать рекурсивное определение, предложенное Н. Виртом, то древовидная

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

Все современные системы реализуют так называемую виртуальную память: процесс выполняется в собственном логическом адресномпространстве, которое может значительно превышать доступную физическую память. Управление виртуальной памятью процесса также входит в задачи модуля управления памятью.
Модуль межпроцессного взаимодействия отвечает за уведомление процессов о событиях с помощью сигналов и обеспечивает возможность передачи данных между различными процессами.

Основы управления процессом

Процесс UNIX представляет собой исполняемый образ программы, включающий отображение в памяти - исполняемого файла, полученного в результате компиляции, т о есть трансляции модулей программы, языков высокого уровня, в эквивалентные программные модули языка низкого уровня, как то: стек, код и данные библиотек, а также ряд структур данных ядра, необходимых для управления процессом, что есть весьма важный момент для дальнейшего понимания принципов распределения памяти, как одного из важнейших ресурсов в "конкуренции" процессов, то есть данные -- структуированы !, условно на:

  • Stack ( c тек ) — область памяти, в которой программа хранит информацию о вызываемых функциях, их аргументах и каждой локальной переменной в функциях. Размер области может меняться по мере работы программы. При вызове функций стек увеличивается, а при завершении — уменьшается.
  • Heap (к уча ) — это область памяти, в которой программа может делать всё, что угодно. Размер области может меняться. Программист имеет возможность воспользоваться частью памяти кучи с помощью функции malloc(), и тогда эта область памяти увеличивается. Возврат ресурсов осуществляется с помощью free(), после чего куча уменьшается.
  • Сode (к одовый сегмент ) — это область памяти, в которой хранятся машинные инструкции скомпилированной программы. Они генерируются компилятором, но могут быть написаны и вручную. Обратите внимание, что эта область памяти также может быть разделена на три части (текст, данные и BSS). Эта область памяти имеет фиксированный размер, определяемый компилятором. UNIX. Профессиональное программирование ст.259 Стек и Куча

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

Новорожденная операционная система UNIX обеспечивала выполнение всего двух процессов, по одному на каждый подключенный к PDP-7 терминал. Спустя год, на той же PDP-7 число процессов заметно увеличилось, появился системный вызов fork. В Первой редакции UNIX появился вызов ехес, но операционная система по прежнему позволяла размещать в памяти только один процесс в каждый момент времени. После реализации аппаратной подсистемы управления памятью на PDP-11 операционная система была модифицирована, что позволило загружать в память сразу несколько процессов, уменьшая тем самым время на сохранение образа процесса во вторичной памяти (на диске) и считывание его, когда процесс продолжал выполнение. Однако до 1972 года UNIX нельзя было назвать действительно многозадачной системой, т. к. операции ввода/вывода оставались синхронными, и другие процессы не могли выполняться, пока их "коллега" не завершал операцию ввода/вывода. Истинная многозадачность появилась только после того, как код UNIX был переписан на языке С в 1973 году. С тех пор основы управления процессами практически не изменились.


Выполнение процесса может происходить в двух режимах — в режиме ядра (kernel mode) или в режиме задачи (user mode). В режиме задачи процесс выполняет инструкции прикладной программы, допустимые на непривилегированном уровне защиты процессора. При этом процессу недоступны системные структуры данных. Когда процессу требуется получение каких либо услуг ядра, он делает системный вызов, который выполняет инструкции ядра, находящиеся на привилегированном уровне.

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

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

Структуры данных процесса

Каждый процесс представлен в системе двумя основными структурами данных proc и user,

описанными, соответственно, в файлах sys/proc.h и sys/user.h. Содержимое и формат этих структур различны для разных версий UNIX.

Состояния процесса

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

  • 1. Процесс выполняется в режиме задачи. При этом процессором выполняются прикладные инструкции данного процесса.
  • 2. Процесс выполняется в режиме ядра. При этом процессором выполняются системные инструкции ядра операционной системы от имени процесса.
  • 3. Процесс не выполняется, но готов к запуску, как только планировщик выберет его (состояние runnable).Процесс находится в очереди на выполнение и обладает всеми необходимыми ему ресурсами, кроме вычислительных.
  • 4. Процесс находится в состоянии сна (asleep), ожидая недоступного в данный момент ресурса, например завершения операции ввода/вывода.
  • 5. Процесс возвращается из режима ядра в режим задачи, но ядро прерывает его и производит переключение контекста для запуска более высокоприоритетного процесса.
  • 6. Процесс только что создан вызовом fork и находится в переходном состоянии: он существует, но не готов к запуску и не находится в состоянии сна.
  • 7. Процесс выполнил системный вызов exit и перешел в состояние зомби (zombie, defunct). Как такового процесса не существует, но остаются записи, содержащие код возврата и временную статистику его выполнения, доступную для родительского процесса. Это состояние является конечным в жизненном цикле процесса.

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

Наконец, процесс выполняет системный вызов exit() и заканчивает свое выполнение. Процесс может быть также завершен вследствие получения сигнала. В обоих случаях ядро освобождает ресурсы,принадлежавшие процессу, за исключением кода возврата и статистики его выполнения, и переводит процесс в состояние "зомби". В этом состоянии процесс находится до тех пор, пока родительский процесс не выполнит один из системных вызовов после чего вся информация о процессе будет уничтожена, а родитель получит код возврата завершившегося процесса.

Принципы управления памятью

Программы пространства пользователя в Linux не могут обращаться к ядру системы напрямую. Но для получения информации от ядра были созданы несколько специальных директорий с помощью которых любая программа или пользователь могут получить данные о состоянии компьютера и ядра. Это файловая система proc и sys.

Из этих папок можно получить любую информацию о вашей системе. Например сколько памяти подкачки сейчас используется, насколько велик размер кеша процессора, какие модули ядра загружены, сколько дисков или разделов доступно и т д. Все это можно получить в обычном текстовом виде из папки proc linux.

В этой инструкции будет рассмотрена файловая система proc, ее структура, назначения файлов и где найти ту или иную нужную информацию. Но сначала немного теории.

Что такое proc?

На самом деле папка proc - это совсем необычная папка. Ее не существует на диске или даже в оперативной памяти, как это делается в /tmp. Все поддиректории, файлы и хранящаяся в них информация генерируется ядром на лету, как только вы ее запрашиваете. Но работает все настолько прозрачно, что вы не заметите никакой разницы между обычной файловой системой и proc, если откроете ее с помощью файлового менеджера.

Только папка proc linux содержит файлы нулевого размера. А также у каждого файла будет текущая дата создания. Например файл /proc/meminfo будет содержать разные данные при каждом открытии, поскольку использование памяти постоянно колеблется.

С помощью такой системы разработчики придерживаются главной концепции Unix - все есть файл. Все файлы доступны для редактирования любым редактором, и все они в простом текстовом формате, но для того чтобы проанализировать весь каталог вам понадобятся права суперпользователя. Почти все файлы доступны только для чтения, с них мы можем только получать информацию. Но есть и доступные для записи, в частности это /proc/sys с помощью которого вы можете настраивать различные параметры ядра.

Структура файловой системы proc

Дальше будет рассмотрена структура proc linux, назначение файлов и поиск информации в них. Сначала мы рассмотрим файлы находящиеся в корне папки proc, в них больше всего информации о системе.

/proc/buddyinfo

В этом файле хранится информация о фрагментации памяти в ядре Linux. Чаще всего используется для диагностики проблем с фрагментацией памяти. Если в двух словах, то строка означает зону памяти, а номер количество доступных страниц определенного уровня.

Node 0, zone DMA 0 0 0 1 2 0 1 0 1 1 3
Node 0, zone DMA32 421 164 73 49 71 17 53 44 33 7 89
Node 0, zone Normal 387 127 65 39 78 30 29 56 20 9 52

/proc/cgroups

Система контейнеризации и управления ресурсами доступными для процессов cgroups разработанная ребятами из Google позволяет ограничить доступ к любым ресурсам для процесса, а также контролировать его поведение в системе. В этом файле можно посмотреть состояние контрольных групп в вашей системе и их настройки.

/proc/cmdline

В этом файле вы найдете параметры, которые были указанны в строке запуска ядра загрузчиком Grub. Это может быть полезно при поиске и устранении проблем с загрузкой ядра или если необходимо выяснить какой точно файл был использован для загрузки.

/proc/config.gz

Для извлечения информации обычно используется утилита zcat поскольку данные сжаты по алгоритму gzip:

/proc/consoles

tty0 -WU (EC p ) 4:7

/proc/cpuinfo

Здесь хранится очень подробная информация о процессоре. Вы можете посмотреть производителя, количество ядер, кеша, активные ядра, частоту, поддерживаемые расширения и многое другое. Ту же информацию можно получить с помощью специальных команд, но, как видите папка proc тоже предоставляет такие данные. И даже больше, все скрипты, выводящие информацию о процессоре берут ее отсюда.

processor : 0
vendor_id : AuthenticAMD
cpu family : 16
model : 6
model name : AMD Athlon(tm) II X2 250 Processor
stepping : 3
microcode : 0x10000c8
cpu MHz : 3000.000
cache size : 1024 KB
physical id : 0
siblings : 2

/proc/crypto

Здесь перечислены все криптографические шифры, поддерживаемые ядром, а также дополнительная информация по каждому из них.

name : cbc(aes)
driver : cbc(aes-generic)
module : kernel
priority : 100
refcnt : 1
selftest : passed
internal : no
type : blkcipher
blocksize : 16
min keysize : 16
max keysize : 32
ivsize : 16
geniv : <default>

/proc/devices

Здесь отображаются различные блочные и символические устройства подключенные к системе. Кроме тех, для которых не загружены модули ядра. Устройства разделены на символические и блочные. У символических устройств нет буфера и они отправляют ядру данные определенного размера. Блочные устройства имеют буфер для данных и предназначены для сохранения информации, например, на жесткие диски.

Character devices:
1 mem
4 /dev/vc/0
4 tty
4 ttyS
5 /dev/tty
5 /dev/console
5 /dev/ptmx
7 vcs

/proc/diskstats

Статистика ввода и вывода на блочные устройства, в том числе и жесткие диски.

8 0 sda 411 0 6808 1772 0 0 0 0 0 512 1772
8 1 sda1 102 0 1696 804 0 0 0 0 0 444 804
8 2 sda2 96 0 1648 488 0 0 0 0 0 344 488
8 3 sda3 122 0 1856 432 0 0 0 0 0 312 432

Первые две цифры - номер устройства, дальше название. Четвертая цифра - количество удачных чтений с диска, количество объединенных чтений, секторов прочитано, время чтения в миллисекундах, удачные записи, объединенные записи, секторов записано, время записи в миллисекундах, текущие операции ввода и вывода, текущее время работы и общее время операций ввода и вывода.

/proc/fb

В этом файле отображаются устройства фреймбуфера (экраны), а также используемые графические драйвера. Например:

Также здесь может быть указан драйвер Nvidia или catalyst если вы использовали проприетарный драйвер. Это один из способов посмотреть какой драйвер видеокарты используется.

/proc/filesystems

Здесь содержится список файловых систем, которые на данный момент поддерживаются ядром. Например:

nodev sysfs
nodev rootfs
nodev ramfs
nodev bdev
nodev proc
nodev cpuset
ext3
ext4

nodev значит, что это файловая система специального назначения и она не используется для хранения данных на носителях.

/proc/interrupts

В этом файле содержаться все доступные прерывания. Прерывания - это подпрограммы, которые используются другими программами для выполнения стандартных действий, например рисования строки на экране или выхода из программы.

CPU0 CPU1
0: 45 0 IO-APIC-edge timer
1: 0 2 IO-APIC-edge i8042
7: 2 0 IO-APIC-edge parport0
8: 0 1 IO-APIC-edge rtc0
9: 0 0 IO-APIC-fasteoi acpi
12: 1 4 IO-APIC-edge i8042

/proc/iomem

В этом файле содержится текущая карта памяти для всех программ и ядра Linux. Эта информация может быть полезной программистам.

00000000-00000fff : reserved
00001000-0009ebff : System RAM
0009ec00-0009ffff : reserved
000a0000-000bffff : PCI Bus 0000:00
000c0000-000c7fff : Video ROM
000d0000-000dffff : PCI Bus 0000:00
000e4000-000fffff : reserved
000f0000-000fffff : System ROM
00100000-cfe8ffff : System RAM
01000000-0166a9ea : Kernel code
0166a9eb-01f0f67f : Kernel data
0209e000-02219fff : Kernel bss

/proc/ioports

0000-0cf7 : PCI Bus 0000:00
0000-001f : dma1
0020-0021 : pic1
0040-0043 : timer0
0050-0053 : timer1
0060-0060 : keyboard
0061-0061 : PNP0800:00
0064-0064 : keyboard
0070-0071 : rtc0

/proc/kallsyms

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

/proc/kcore

Это все содержимое вашей оперативной памяти представленное в одном файле. В отличии от других файлов у этого есть размер - объем вашей ОЗУ плюс 4 килобайта. Для доступа к нему нужны права суперпользователя. Не нужно открывать этот файл для чтения, у вас ничего не выйдет. Перед тем как с ним работать скопируйте файл в другую папку, а уже потом делайте что нужно, например вы можете попытаться найти определенный фрагмент текста из памяти браузера.

/proc/kmsg

/proc/kpagecount

Для оптимизации работы с памятью, она организуется в страницы. Раньше мы видели как посмотреть количество свободных страниц. В этом же файле каталог proc позволяет нам выяснить размер одной страницы.

/proc/loadavg

Здесь вы можете оценить среднюю нагрузку на систему. Например:

2.58 2.53 1.74 2/569 20842

Первые три цифры показывают нагрузку на процессор сейчас, пять и пятнадцать минут назад, следующие два столбца показывают количество активных процессов и общее количество запущенных процессов. А последняя цифра - это PID идентификатор последнего процесса.

/proc/locks

Здесь содержится список заблокированных ядром ресурсов. Может содержать много отладочной информации и не несет совсем никакой пользы для обычных пользователей:

1: POSIX ADVISORY WRITE 16342 08:16:43386485 1073741825 1073741825
2: POSIX ADVISORY READ 16342 08:16:43386485 1073741826 1073742335
3: POSIX ADVISORY READ 1686 08:16:43253829 124 124
4: POSIX ADVISORY WRITE 16342 08:16:43647306 0 EOF

/proc/meminfo

Еще один очень известный и широко используемый файл, который предоставляет нам папка proc linux. Здесь отображается вся доступная информация об оперативной памяти и пространстве подкачки. Именно с помощью этого файла многие скрипты узнают информацию о доступной памяти.

MemTotal: 6109848 kB
MemFree: 2044352 kB
MemAvailable: 2562056 kB
Buffers: 36872 kB
Cached: 742456 kB
SwapCached: 740888 kB
Active: 2187724 kB

/proc/misc

В этом файле перечислены различные драйверы, загруженные для подключенных устройств или программ:

55 rfkill
200 tun
56 vboxnetctl
57 vboxdrvu
58 vboxdrv
232 kvm
59 memory_bandwidth

/proc/modules

Тоже довольно известный файл. Здесь содержится список всех загруженных модулей ядра. Ту же самую информацию мы можем увидеть выполнив lsmod. Но этой утилите тоже информацию предоставляет структура proc.

/proc/mounts

В этом файле перечислены все точки монтирования и все подключенные файловые системы:

sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
devtmpfs /dev devtmpfs rw,nosuid,size=3016160k,nr_inodes=754040,mode=755 0 0
securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0

То же самое можно увидеть выполнив mount -a.

/proc/partitions

В этом файле отображены все подключенные к системе разделы жестких дисков или других запоминающих устройств:

8 0 488386584 sda
8 1 62914560 sda1
8 2 148064256 sda2
8 3 277406720 sda3
8 16 976762584 sdb

/proc/stat

В этом файле содержится различная статистическая информация о системе. Такая, как частота процессора, количество тактов, количество сброшенных страниц памяти на диск, количество системных прерываний, время загрузки и т д.

/proc/swaps

Здесь находится информация о пространстве подкачки. Подключенные разделы, файлы, а также их размер, приоритет и состояние:

Filename Type Size Used Priority
/dev/sdb2 partition 8388604 0 -1

/proc/sysrq-trigger

Это еще один файл, выделяющийся из большинства других. Он доступен для записи и используется для управления передачи ядру специальных SysRq команд, о которых мы уже говорили в статье перезагрузка компьютера в Linux. Вы можете записывать коды команд с помощью echo или любого текстового редактора.

/proc/uptime

Здесь отображается сколько времени прошло после запуска компьютера. Первое число означает общее количество секунд после запуска компьютера, а второе время в режиме ожидания:

/proc/version

Это еще один способ узнать точную версию ядра, компилятора, и в некоторых случаях, даже дистрибутива:

/proc/vmstat

И снова информация об оперативной памяти. На этот раз информация о виртуальной памяти и ее использовании в системе.

/proc/zoneinfo

Здесь содержится очень похожая информация, на предыдущий файл, но только с разбиением на зоны памяти в зависимости от ее назначения.

/proc/PID/

Файловая система proc состоит не только из файлов, но здесь есть и папки. Больше всего здесь папок с номерами вместо имен. Каждый этот номер означает PID процесса, а эта папка содержит информацию о каждом запущенном в системе процессе. Когда процесс заканчивается, его каталог исчезает из системы. Если открыть любой из этих каталогов в нем есть такие файлы:

ttr cpuset fdinfo mountstats stat
auxv cwd loginuid oom_adj statm
clear_refs environ maps oom_score status
cmdline exe mem root task
coredump_filter fd mounts smaps wchan

Мы не будем рассматривать все, давайте рассмотрим только основные файлы:

  • cmdline - содержит команду с помощью которой был запущен процесс, а также переданные ей параметры
  • cwd - символическая ссылка на текущую рабочую директорию процесса
  • exe - ссылка на исполняемый файл
  • root - ссылка на папку суперпользователя
  • environ - переменные окружения, доступные для процесса
  • fd - содержит файловые дескрипторы, файлы и устройства, которые использует процесс
  • maps, statm,иmem - информация о памяти процесса
  • stat, status - состояние процесса

С помощью этих файлов вы можете составлять различные скрипты. Например если вы хотите уничтожить все зомби процессы, то вы можете сканировать все директории на наличие Z в файле status. Так же само можно проверить запущена ли нужная вам программа просмотрев все cmdline.

/proc/sys/

Эта папка в proc linux не только предоставляет информацию о системе, но и позволяет изменять различные параметры ядра на лету, а также включать дополнительные функции.

Чтобы посмотреть можно ли записывать в файлы используйте команду:

Если у файла есть флаг W, значит в него можно записывать данные. Давайте рассмотрим основные подкаталоги в этой папке:

  • debug - содержит отладочную информацию, она будет вам полезна если вы разработчик ядра
  • dev - параметры различных устройств, подключенных к системе
  • fs - вся информация о файловой системе
  • kernel - позволяет напрямую настраивать ядро
  • net - настройка разных параметров сети
  • vm - взаимодействие с подсистемой vm

Это еще не все что можно сделать с помощью этого каталога подробнее настройка ядра linux будет рассмотрена в одной из следующих статей.

Выводы

Файловая система proc содержит наиболее полную и подробную информацию о внутреннем устройстве и работе операционной системе Linux и позволяет вам точно настроить многие параметры своей работы. Если потратить немного времени на изучение всех тонкостей этой подсистемы, вы получите более совершенную систему Linux. Разве это не то чего мы все хотим?

Читайте также: