В чем разница между этими методами для получения ресурсов? - PullRequest
2 голосов
/ 24 марта 2020

В Linux мы можем использовать два способа поиска ресурсов, таких как время, сбои страниц, перестановки страниц, переключение контекста . Один из способов - использовать функцию getrusage () , другой - использовать команду / usr / bin / time -v [команда для проверки использования] . В чем разница между этими способами поиска ресурсов?

1 Ответ

2 голосов
/ 30 марта 2020

Когда вы используете такую ​​команду, как time (1) , она должна использовать системный вызов, такой как getrusage (2) через свою оболочку системной библиотеки, Это создает запрос с правильным номером системного вызова и структурой, указывающей, что он хочет получить информацию об использовании для дочерних процессов.

Для совместимости между операционными системами UNIX / POSIX, которая задает c функции, выбранные для построения команды, выполняются из иерархии параметров, чтобы адекватно охватывать операционные системы, на которых выполняется команда. (Некоторые операционные системы могут не реализовывать все или иметь разные причуды.)

В случае time предпочтет группировать ожидания ребенка и использовать его для вызова wait3 который, в свою очередь, реализован как оболочка для еще более сложного wait4, который имеет свой собственный номер системного вызова .

И wait3 / 4, и getrusage заполняют одну и ту же структуру rusage информацией, и с тех пор time только напрямую вызывает один дочерний процесс, вызывая wait3(), как он это делает, или разбивая его на менее функциональные вызовы, такие как wait();getrusage(RUSAGE_CHILDREN), по сути то же самое. Следовательно, время эффективно отображает те же данные, которые предоставляет getrusage (вместе с некоторыми более общими данными, которые он собирает из системы, например, в реальном времени, используя вызовы gettimeofday).

Реальные Разница между функциями-обертками systemcall заключается в следующем:

  • У getrusage есть еще один аргумент, позволяющий процессу самому взглянуть на себя.
  • wait4 может быть нацелен только на одного прямого потомка и потомков этого потомка. 1033 *
  • wait3 - это упрощение или wait4, или использования wait();getrusage(), которое не так универсально, как и то, но просто достаточно для команды time (1), как она реализована. (Следовательно, wait3 - это самый простой и безопасный вариант использования времени в операционных системах, где он доступен.)

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

  while ((caught = wait3 (&status, 0, NULL)) != pid)
    {
      if (caught == -1) {
         getrusage(RUSAGE_CHILDREN, &resp->ru);
         return 0;
      }
    }
...