Происходит ли переключение контекста в системе, очередь готовности которой имеет только один процесс и которая использует циклическое планирование?

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

Предположим, что текущий пакет ЦП одиночного процесса охватывает более одного временного интервала алгоритма циклического перебора.

Мои рассуждения следующие

Действия, которые могут иметь место при возникновении прерывания таймера в типичном случае:

  1. Возникает прерывание. Перейти в режим ядра
  2. ОС сохраняет текущий контекст на плате (сохраняет регистры, состояние процесса и информацию об управлении памятью текущего процесса)
  3. Выполнять множество архитектурно-зависимых операций, включая очистку кэшей данных и инструкций, а также TLB.
  4. Поместите текущий процесс в очередь готовности
  5. Выберите новый процесс для выполнения
  6. Загрузить контекст из платы этого процесса
  7. Перейти в пользовательский режим. Начать выполнение нового процесса

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

Это то, что происходит? Или происходит правильное переключение контекста, включающее ненужное сохранение текущего состояния одиночного процесса и его восстановление?

Если позже все же произойдет, есть ли особая причина?

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

Я надеюсь, что люди, изучавшие код ядра, смогут пролить свет на это. Таким образом, этот вопрос о stackoverflow.


person Abhijith Madhav    schedule 25.01.2012    source источник


Ответы (1)


Следующий код из ядра Linux прояснит ваши сомнения. В разное время ядро ​​вызывает планировщик, чтобы выбрать новый процесс для запуска. Но может оказаться, что планировщик не находит другой задачи, кроме текущей запущенной задачи. В этом случае планировщик не будет выполнять «переключение контекста», а просто вернется, ничего не делая.

Например, я даю вам код из ядра Linux

   .........
   if (likely(prev != next)) {<-- if next and current are same, then no context switch
            sched_info_switch(prev, next);
            perf_event_task_sched_out(prev, next);

            rq->nr_switches++;
            rq->curr = next;
            ++*switch_count;

            context_switch(rq, prev, next); /* unlocks the rq */
            /*
             * The context switch have flipped the stack from under us
             * and restored the local variables which were saved when
             * this task called schedule() in the past. prev == current
             * is still correct, but it can be moved to another cpu/rq.
             */
            cpu = smp_processor_id();
            rq = cpu_rq(cpu);
    } else {
     ............
person Saurabh    schedule 25.01.2012
comment
Я не хотел сказать, что это были точные шаги и в таком порядке. Я хотел сказать, что это были возможные шаги и что они могли бы не понадобиться, если бы не было другого процесса в готовом Q. Я постараюсь прояснить это в своем вопросе. И да, они из учебника. Сейчас я изучаю операционные системы. - person Abhijith Madhav; 25.01.2012
comment
хороший! В книге будет перечислено, что делает ОС в общем случае. Но фактическая реализация позаботится о угловых случаях, как вы упомянули. Обратите внимание, что в соответствии с политикой планирования, даже если имеется более одного готового процесса, ОС может выбрать процесс, временной интервал которого только что закончился. Так что это очень полезная проверка. Вы не хотите запускать дополнительный код только для того, чтобы обнаружить, что он замедляет работу вашей системы. - person Saurabh; 25.01.2012
comment
Я хочу принять ваш ответ по той причине, что приведенный вами код linux ясно показывает, что переключение контекста не происходит, если есть только один процесс. Однако я считаю, что объяснение выше кода не приводит естественным образом к тому, что выражено в коде. Это произошло до моего разъяснения вопроса. Не могли бы вы отредактировать свой ответ (часть кода, отличного от Linux), чтобы я мог принять ваш ответ. Любые предложения по редактированию моего вопроса приветствуются. - person Abhijith Madhav; 17.03.2012
comment
Спасибо. Более того, предыдущее объяснение было слишком вырванным из контекста. - person Saurabh; 23.04.2012