Ядро Linux в комментариях



Sys_sysinfo


Системный вызов имеет возможность вернуть только одно целочисленное значение (int). В том случае, когда требуется вернуть больший объем информации, придется прибегнуть к тем же ухищрениям, что имели место при передаче более четырех аргументов в системный вызов — к возврату информации через указатель на структуру. Хороший пример — это системный вызов sysinfo, который собирает статистику по использованным системным ресурсам.

Распределение в памяти и обнуление struct sysinfo (строка ), предназначенной для временного хранения возвращаемых значений. sys_sysinfo могла бы копировать каждое поле структуры по отдельности, однако это более медленный, неудобный и менее читабельный способ.

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

Поле uptime в структуре sysinfo хранит количество секунд, в течение которых работает система с момента запуска. Упомянутое значение вычисляется на основе jiffies (строка ), которая подсчитывает тики внутреннего таймера в течение работы системы, и HZ, представляющим собой системный параметр, равный количеству тиков внутреннего таймера в секунду.

Массив avenrun (строка ) хранит среднюю длину очереди выполнения (т.е. среднее количество процессов, готовых для передачи в ЦП) за последние 1, 5 и 15 секунд. Эти значения периодически пересчитываются за счет обращения к calc_load (строка ). Поскольку разработчики ядра сознательно избегали операций с плавающей точкой, вычисления производятся с фиксированной точкой, поэтому в них присутствует некоторая неточность.

Записывается общее количество процессов, присутствующих (и присутствовавших) в системе.

Функция si_meminfo (строка ) заполняет поля структуры, относящиеся к использованию оперативной памяти, в то время как si_swapinfo (строка ) — поля, фиксирующие статистику по использованию виртуальной памяти.

Заполнение структуры завершено. sys_sysinfo пытается скопировать ее обратно в пространство пользователя, возвращая 0 в случае успешного исхода и EFAULT — в случае ошибки.




Содержание  Назад