Время переключения контекста в ядре Linux - PullRequest
0 голосов
/ 11 октября 2018

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

Это всесохранение и загрузка регистров из памяти ядра может занять несколько циклов ЦП.Так что это время попадает под пользовательский процессор / системный процессор или где-то еще

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Думайте об этом так:

  • задача выполняется в пространстве пользователя, но что-то происходит (системный вызов, исключение, IRQ, ...), вызывая переключение задачи наkernel-space

  • ядро ​​вычисляет «время, проведенное в пространстве пользователя» (now - last_time) и обновляет счетчик «пользовательского времени» для задачи, и устанавливает «последний раз» дляпозже (last_time = now).

  • ядро ​​делает что-то (изначально в зависимости от того, что вызвало переключение на пространство ядра), и во время выполнения вещи оно может или не может решить сделать один илибольше задач переключается.Когда происходит каждое переключение задач, ядро ​​вычисляет, сколько времени предыдущая задача провела в ядре (now - last time), добавляет его к «системному времени» задачи и устанавливает «последний раз» на потом (last_time = now)

    * 1018.*
  • ядро ​​в конечном итоге решает, что текущая задача должна вернуться в пользовательское пространство, и непосредственно перед тем, как это произойдет, оно завершает обновление системного времени задачи (снова now - last time) и снова устанавливает «последний раз»позднее (last_time = now), чтобы ядро ​​могло выяснить «время, проведенное в пользовательском пространстве» позже.

  • после того, как задача вернется в пользовательское пространство, вернитесь к первомушаг выше и сделай все снова.

0 голосов
/ 17 октября 2018

Это время определенно должно быть под системным процессором.Любое время, затрачиваемое на системные вызовы и прерывания, должно быть под системным процессором, а не под пользовательским процессором.Процессор пользователя - это время, затрачиваемое на выполнение сборки в ELF, который активно выполняется, и любых вспомогательных библиотек - больше ничего.Даже ввод-вывод считается системным процессором.

Глядя на документацию в разделе 1.8, мы видим

- system: processes executing in kernel mode

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

...