Что такое «добровольное переключение контекста»?

Я предполагаю, что ваше ядро ​​не считает их приоритетными :)

Если вы посмотрите на свое изображение, вы увидите, что ваши процессы Python имеют приоритет 20. Это значение по умолчанию. Это означает, что если мы отбросим другие факторы планирования (уже выделенное время ЦП, состояние процесса и т. Д.), Ваши сценарии Python будут считаться такими же важными, как top , rcu_shed , sshd , ... Теперь, хотя этим процессам не всегда есть чем заняться, они все равно получают доступ к ЦП всякий раз, когда переходят в состояние РАБОТА .

Процессы Linux выполняются в квантах времени (или квантах времени). Это означает, что каждые n миллисекунд ядро ​​ вытесняет (приостанавливает) текущий выполняющийся процесс (на ядре) и ищет другой процесс для планирования. По умолчанию значение временного интервала составляет 100 мсек ( или около того ).

Поскольку ваша машина имеет 24 ядра, вы можете предположить, что 24 процесса можно запланировать для одновременного запуска. (24) процесса, которые выбираются (каждые 100 мс) для планирования, выбираются на основе нескольких факторов. Кроме того, процесс также может быть прерван, если он переходит в состояние ожидания до истечения его временного интервала. Начиная с Linux 2.6, ядро ​​по умолчанию использует алгоритм Completely Fair Scheduler .Приоритет планирования процессов в основном основан на времени, которое каждый процесс уже потратил на выполнение, и учитывает «пользовательский приоритет» (удобство использования) через коэффициент спада :

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

Теперь можно (из пользовательской среды) запустить процесс с настраиваемым значением удобства с помощью команды nice :

nice [OPTION] [COMMAND [ARG]...]
    Run  COMMAND  with an adjusted niceness, which affects  process scheduling. 
    With no COMMAND, print the  current niceness. Niceness  values range  from 
    -20 (most favorable to the process) to 19 (least favorable to the process).

Просто имейте в виду, что планировщик Linux не использует этот приоритет как абсолютная вещь. Это значение будет учитываться всякий раз, когда ядру нужно выбрать процесс, но будут приниматься во внимание и другие факторы: жадность ваших процессов снижает вероятность их выбора в любом случае (название алгоритма само собой разумеющееся). пояснения к этому: p) .

34
10.05.2018, 13:27
1 ответ

Справочная страница дляtimeобъясняет концепцию произвольного и непроизвольного переключения контекста :

.
The resource specifiers [...] are:
   c      Number of times the process was context-switched involuntarily
          (because the time slice expired).
   w      Number of times that the program was context-switched voluntarily, 
          for instance while waiting for an I/O operation to complete.

(цитата взята из моей системы Debian, связанная справочная страница имеет немного другой текст)

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


То, как все это связано с программой проверки пароля -, зависит от того, что на самом деле делает программа.

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

В Linux вы также должны увидеть вызовы с strace.

Окончательная задержка возникает из-за рандомизированного сна T * (rand() % 3), т.е. 0, 1 или 2 раза постоянная. Это довольно грубая степень детализации, поэтому ее легко усреднить, выполнив несколько попыток с одним и тем же паролем.

37
27.01.2020, 19:37

Теги

Похожие вопросы