06 сем Семинар 3 Файловая систма proc лр 4.1 - chrislvt/OS GitHub Wiki

1 часть 4ЛР Важность ЛР для Рязановой заключается в том что в этой лр демонстрируется тот огомный объем информации который можем получить о процессах в usermod.

/proc виртуальная файловая система. Она немонтированная. Слово монтируемая является для Linux очень важным, тк любая файловая система как говорят подмонтируется и становится частью дерева каталогов. При этом каждая подмонтированная файловая система имеет свой root. Это отличительная особенность Unix которой нет в Windows.

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

В материале по лр есть жуткие огрехи подобную информацию можно получить набрав в интернете /man/proc//<имя нужного файла>.

Что такое proc/pid

В виртуальной файловой системе proc для каждого процесса существует директория идентификатора процесса. Для получения идентификатора процесса необходимо набрать getpid(). Кроме такого обозначения поддиректории есть обрзначение self (/proc/self). Если хотите посмотреть информацию о конкретном процессе который вы запустили, фактически вы получите информацию об этом процессе.

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

Иногда можно читать что виртуальная файловая система это интерфейс. ЭТО НЕПРАВИЛЬНО! ИНТЕРФЕЙС ЭТО СОВЕРШЕННО ОПРЕДЕЛЁННОЕ ПОНЯТИЕ.

Важно понимать, то что слова файловая система здесь совершенно не случайны. Виртуальная - не существует, файловая система - информацию, которую мы можем получить с помощью proc мы можем получить стандартными средствами работы с файловыми системами(read, write, open). В этом смысл. proc является не единственной файловой системой которая поддерживается в системе, их несколько. Мы рассматриваем proc как наиболее хорошо представленную в литературе. Файловая система proc позволяет на основе стандартного интерфейса файловой системы и системных вызовов получать информацию о процессах и ресурсах.

В директории /proc/self находятся директории и файлы, несущие информацию об окружении процесса, открытых файлах процессов и тд.

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

1 часть 4 лр - пишем приложение в котором используем информацию из соответствующей директории, но в отличие от предыдущих лет она просит воспроизводить её не на экран, а в файл. На все символические ссылки создаёте один файла my_file.txt))0). Туда занести информациюо файлах, которые будут перечислены далее.

1. cmdline - файл, который указывает на директорию процесса.

Процесс - программа в стадии выполнения. До того момента как мы её запустили она была файлом. Файл принадлежит определённой файловой системе и находится в каком-то каталоге.

2. cwd - символическая ссылка. Указывает на директорию процесса.

3. envirom - файл, переводится как окружение.

4. exe - символическая ссылка на файл процесса.

Часто называют как образ процесса.

5. fd - file directory - директория.

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

Пример:

Содержание первой строки

00000000 - 00013000 r-xs 00000400 03:03 1264

  1. 00000000 - начальный адрес выделенного участка памяти

  2. 00013000 - конечный адрес выделенного участка памяти

  3. r-xs - права доступа

r - можно читать, w - можно писать, x - можно выполнять, s - shared разделяемый, p - private

  1. 00000400 - смещение от которого выполняется распределение. Получается что это всегда 400, видимо 400 это для какой-то служебной информации, но руководство об этом указывает.

  2. 03:03 - старший и младший номер устройства. (Студент: -Какого устройства? Н.Ю.: - Смотря где эта информация, если это файл, то устройство - диск. Дело в том, что диск имеет старший номер, а разделы диска имеют каждый свой младший номер. Это идентификация внешних устройств в системе. Об этом будем говорить в конце семестра.)

6)1264 - номер inode

В системе имя файла не является идентификатором. Идентификатором является inode, соответственно inode на самом деле это структура, но есть в системе так называемые метаданные, это номера inode которые мы с вами видели когда набирали ls -ail.

7) mem - файл, но когда пытаешься вывести показывает, что файл пустой. Никакой внятной информации при попытке открыть файл нет. Этот файл мы пропускаем.

8) root - это символическая ссылка(softlink). Указывает на корень файловой системы которой принадлежит образ процесса.

9) stat - файл

Содержит огромный объем информации. Тут находится информация о pid, com(имя файла), state. В тексте(методички) присутствует S - заморозка в ожидании прерывания, Рязанова не несёт ответствености за этот текст. w - заморозка с разрешением прерывания, не понятно откуда это.

Обратить внимание на информацию о времени.

  • utime - количество тиков которые получил процесс выполняясь в режиме пользователя.

  • stime - количество тиков которое процесс получил, выполняясь в режиме ядра.

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

  • counter - размер в тиках или кванта или остатка кванта. Если процесс получил уже какое-то количество процессорного времени и был вытеснен, то для этого процесса запоминается так называемый остаток кванат, то есть процесс возвращается в очередь готовых процессов, если он был вытеснен (так как Unix/Linux системы с вытеснением то есть процесс может быть вытеснен другим, более приоритетным процессом, но возвращается он в очередь готовых процессов, но ему будет выделен в следующий раз не полный квант, так как он уже выполнялся, а так называемый остаток кванта).

  • starttime - время с начала загрузки системы

  • wchan - системный вызов на котором процесс блокирован, эту блокировку можно прервать.

(ещё два поля времени посмотреть самим)

10) statm - файл

Обратить внимание на resident. Слово резидент по отношению к операционным системам использовалось в следующем смысле: у операционной системы (такой как DOS) существует две части: резидентная и транзитная. Резидентная часть операционной системы, это часть операционной системы которая постоянно находится в памяти. Транзитная часть - это часть операционной системы которая загружается в память по мере необходимости.

До сих пор адресное пространство диска делится на две неравные части: бОльшая часть адресного пространства диска, управляется операционной системой, другая часть адресного пространства диска определяется как область свопинга. То есть в принципе туда в эту область свопинга должны выгружаться неиспользуемые там страницы или сегменты, но сейчас это уходит из рассмотрения, ну надо сказать что каких-то внятных учебников не существует, но ещё раз повторяю это принятое деление адресного пространства диска. Но в современных системах пытаются перейти к так называемой одноуровневой памяти, может быть в материалах по управлению памяти это и было когда-то. Насколько Наталья Юрьевна помнит, на лекциях она говорила нам про книгу AS400. Эта книга - технический роман, её написал человек который в составе группы, созданой IBM, разрабатывал компьютер для среднего бизнеса, многопроцесорный ( систему AS400). И он рассказывал как они это делали, какие идеи возникали, как реализовывали. Вот там у него есть глава "Одноуровневая память". Когда exe лежит на диске - он файл, но у этого файла на диске есть адресное пространство. Это приводит к тому, что надо иметь адрес каждого блока. То есть на самом деле дисковый inode файла должен хранить информацию о каждом блоке в котором находится информация из данного файла. Таким образом происходит адресация информации, хранящейся в файле. Наши системы поддерживают файлы очень большого размера. То есть файлы не хранятся в непрерывных адресах, это невозможно в современной системе. У файла есть логическое представление, как у программы. У нас есть логическое адресное пространство, каждая программа думает что она начинается с нулевого адреса. Точно так же каждый файл "думает" что он непрерывный и начинается с нуля. На самом деле физически всё не так.

У файла есть собственое адресное пространство и вот этот вот пейджинг осуществялется в адресное пространство файла. Если вы открывали книгу Рихтера, вы могли прочитать, что в Windows все экзешники выполняются как файлы, отображаемые в памяти. Это и есть как раз одноуровневая память.

resident

  • size - общее число страниц выделенное процессу в виртуальной памяти.

корреляции Н. Ю. не увидела, размер не получается в сумме. Надо разбираться более глубоко, её задача показать особо одарённым студентам, что при написании курсовой работы по ОСам выводить информацию которая доступна в юзере легко не стоит.

Логическое адресное пространство базируется на том, что каждая программа думает что она начинается с нулевого адреса. В итоге в программах находятся смещения.

Поговорим о 32х-разрядных системах.

Мы с вами говорили, что виртуальное адресное пространство процесса может иметь размер 4ГБ. Эти 4Гб в Windows чаще всего делятся на две равные части. 2ГБ - защищённое адресное пространство и 2ГБ - отображение системы. Это видно когда мы рассматривали с вами стандартное страничное преобразование и PAE. В стандартном преобразовании половина таблиц страниц отводится на защищённое адресное пространство, половина на отображение системы. UNIX/Linux используют неравное деление. Традиционно 1ГБ mapping system, 3Гб - защищённое адресное пространство. Во-первых понятно, что UNIX/Linux имеет минимизированное ядро, поэтому по самой сути операционной системы им столько не надо. В частности если посмотреть Соломона Руссиновича, то в этом защищённом адресном пространстве например находится таблица страниц, но самое главное в этом адресном пространстве (в mapping) таблицы страниц находится так называемая область данных ядра, где создаются семафоры, разделяемые сегменты, каналы и тд. Вот здесь уже указываются виртуальные адреса. Например в Windows 4MБ пропускается, то есть наша программа сможет занимать адреса начиная с 4МБ. Соответственно, поскольку остаётся деление на сегменты, но адресное пространство делится на страницы. Это адресное пространство описывается таблицами страниц. У каждой страницы виртуальной есть виртуальный адрес. К адресу виртуальной страницы добавляете смещение, получаете вот этот виртуальный адрес. Но никто об этом не пишет. Но вот про 4МБ надо прочитать. Посмотреть распределение 4МБ которые она нам привела в лабораторной оптимизация fork прошлого семестра.

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

image

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

  • trs - общее количество кода в физической памяти

/proc/interrupts - файл, в котором перечисленны доступные прерывания.

/proc/apm - можно посмотреть состояние батареи ноутбука

/proc/devices - информация об активных драйверах устройств

Пример как вывести на экран информацию об окружении процесса (environ)

#include <stdio.h>
#define BVF_SIZE 0x100
int main(int argc, char* argv[])
{
    char buf[BUF_SIZE];
    int let, i;
    FILE *f;
    f = fopen("/procself/environ", "r");
    while ((len = fread(buf, 2, BUF_SIZE, f)) > 0)
    {
        for (i = 0; i < len; i++)
        {
            if (buf[i] == 0)
                buf[i] = 10;
            buf[len] = 0;
            print("%s", buf);
        }
    fclose(f);
    return 0; 
    }
}

В environ нет символа конца строки, его код - 10. Для того чтобы файл стал читабельным, мы добавляем символ коца строки

⚠️ **GitHub.com Fallback** ⚠️