procfs
procfs — специальнаяфайловая система, используемая вUNIX-подобных операционных системах. Позволяет получить доступ к информации из ядра о системных процессах. Необходима для выполнения таких команд какps,w,top. Обычно её монтируют на/proc. procfs создаёт двухуровневое представление пространств процессов. На верхнем уровне процессы представляют собойкаталоги, именованные в соответствии с ихpid. Также на верхнем уровне располагается ссылка на каталог, соответствующую процессу, выполняющему запрос; она может иметь различное имя в различных ОС (curproc воFreeBSD,self вLinux).
История
[править |править код]![]() | В разделене хватаетссылок на источники (см.рекомендации по поиску). Информация должна бытьпроверяема, иначе она может быть удалена. Вы можетеотредактировать статью, добавив ссылки наавторитетные источники в видесносок.(12 мая 2011) |
8-я редакция UNIX
[править |править код]Впервыеprocfs появилась в вышедшей в 1985 году 8-й редакцииUNIX и была призвана предоставить интерфейс для управления процессами, более удобный, чем вызовptrace. Она была подробно описанаТомом Киллианом в работе «Processes as Files» («Процессы как файлы») в 1984 году. Каждый процесс был представлен файлом, в который могла производиться запись. Количество имеющихся вызововioctl равнялось 11.[1][2]
System V release 4
[править |править код]Данная система, вышедшая в 1990 году, унаследовалаprocfs из UNIX 8, с некоторыми усовершенствованиями. Процессы по-прежнему представлялись простыми файлами, но были доступны уже 37 вызововioctl. ФС стала достаточной для построения на её базе утилит наподобиеps, но оставалась неудобной и плохо расширяемой.[1]
Реализация подробно описана в работе Роджера Фолкнера и Рона Гомеса «The Process File System and Process Model in UNIX System V» в 1991 году.
Plan 9
[править |править код]В 1992 году вышел первый публичный релиз ОСPlan 9. Это был пик развитияprocfs. Всё управление процессами было перенесено сюда. Процессы стали каталогами вместо файлов. Вместоioctl стали использоваться текстовые команды, и управление могло производиться командамиcat иls.[3] При монтировании /proc с другого компьютера через сеть локальный процесс мог взаимодействовать с удалённым так, как будто они находились на одной машине.
Solaris 2.6
[править |править код]Solaris 2.6 во многом унаследовал структуруprocfs отPlan 9, однако все расположенные там файлы были двоичными, предназначенными для использования программой, а не человеком.[1] В целом файловая система стала несколько примитивнее по сравнению с таковой в Plan 9, но несравнимо более развитой по сравнению с SVR4.
4.4 BSD
[править |править код]Это был ещё один шаг назад по сравнению с Solaris. Количество файлов в каждом каталоге уменьшилось до 8 (хотя в более поздних релизах слегка увеличилось). Набор доступных команд также существенно сократился. Стал происходить обратный переход, от файловых интерфейсов к системным вызовам.[1]
В современных версияхFreeBSDprocfs постепенно ликвидируется[4][5].
Linux
[править |править код]Linux несколько выбивается из описанной выше истории. С самого появленияprocfs представляла в нём универсальный интерфейс получения информации от ядра, а не только о процессах. В корне содержатся файлы (в основном, текстовые) и каталоги, предоставляющие самые разнообразные сведения о системе.
В то же время свою первоначальную функцию — управление процессами —procfs почти не выполняет. Интерфейс отправки команд отсутствует, файловая система лишь предоставляет подробную информацию о процессах (и кое-где позволяет изменить некоторые опции, например, /proc/<pid>/oom_adj).[6]
Структура
[править |править код]*BSD
[править |править код]Каждый каталог верхнего уровня содержит следующие файлы:
- ctl — файл только для записи, поддерживающий множество операций, которые записываются в него в виде строк:
- attach — останавливает целевой процесс и подготавливает вызывающий его процесс для выполнения отладки целевого.
- detach — продолжает выполнение целевого процесса и снимает его из-под контроля процесса-отладчика (последний не обязан быть вызывающим процессом).
- run — продолжает выполнение целевого процесса до поступления сигнала, достиженияточки останова или завершения целевого процесса.
- step — выполняет одну команду целевой программы, не генерируя иных сигналов.
- wait — ожидает когда целевой процесс достигнет стабильного состояния, готового для отладки. Целевой процесс должен быть в этом состоянии до того как будут разрешены другие команды.
- dbregs — отладочные регистры, соответствующие struct dbregs в <machine/reg.h>.dbregs сейчас применяется лишь в архитектуре i386.
- etype — тип выполняемого файла к которому идет обращение вfile.
- file — символьная ссылка на файл, из которого читался текст процесса. Это может использоваться для получения доступа к таблице идентификаторов процесса или для запуска новой копии процесса. Если файл не найден, то целевое направление принимает значение «unknown».
- fpregs — регистры с плавающей запятой, соответствующие struct fpregs в <machine/reg.h>.fpregs используется только на машинах с различными множествами универсальных регистров и регистров с плавающей запятой.
- map — карта виртуальной памяти процесса.
- mem — полный образ виртуальной памяти процесса. Можно обратиться лишь к тому адресу, который существует в процессе. Чтение и запись в этот файл изменяют процесс. Запись в текстовый сегмент применяется лишь для этого процесса (изменения не повлияют на другие копии этого процесса).
- note — используется для отправки сигнала процессу. Не применяется.
- notepg — используется для отправки сигнала группе процессов. Не применяется.
- regs — позволяет доступ на чтение и запись к множеству регистров процесса. Данный файл содержит структуру двоичных данных struct regs описанную в <machine/reg.h>.regs доступен на запись только когда процесс остановлен.
- rlimit — файл, доступный только на чтение, содержащий текущий и максимальный размер. Каждая строка имеет формат rlimit current max, где −1 обозначает бесконечность.
- status — статус процесса. Файл доступен только для чтения и содержит единственную строку, состоящую из полей, разделённых пробелами:
- имя команды
- id процесса
- id родительского процесса
- id группы процесса
- id сессии
- major, minor управляемого терминала, или −1, −1 в ином случае
- список флагов процесса: ctty если это управляемый терминал, sldr если процесс управляет сессией, noflags если ни один из вышеперечисленных флагов не установлен
- время запуска процесса в секундах и микросекундах, разделённых запятой
- время пользователя в секундах и микросекундах, разделённых запятой
- системное время в секундах и микросекундах, разделённых запятой
- время ожидания сообщения
- мандат процесса, состоящий из id фактического пользователя и списка групп (первый элемент которого является id фактической группы), разделённых запятой
- имя хоста, в пределах которого запущен процесс, или «-» если процесс запущен без ограничений
Поддержка операционными системами
[править |править код]Примечания
[править |править код]- ↑1234A brief history of /proc (неопр.). Архивировано изоригинала 2 марта 2012 года.
- ↑proc(4) manual page (UNIX, 8th edition) (неопр.). Архивировано изоригинала 2 марта 2012 года.
- ↑proc(3) manual page (Plan 9) (неопр.). Архивировано изоригинала 2 марта 2012 года.
- ↑What's cooking for FreeBSD 8? (неопр.) Архивировано изоригинала 2 марта 2012 года.
- ↑Why is procfs deprecated in favor of procstat? (freebsd-fs mailing list) (неопр.). Архивировано изоригинала 2 марта 2012 года.
- ↑proc(5) manual page (Linux) (неопр.). Архивировано изоригинала 2 марта 2012 года.
Ссылки
[править |править код]- «Изучаем возможности директории /proc» (рус.) — перевод на русский язык статьи про procfs.