Происходит ли переключение контекста в системе, чья очередь готовности имеет только один процесс и которая использует циклическое планирование? - PullRequest
5 голосов
/ 25 января 2012

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

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

Мои рассуждения такие, как показано ниже

Шаги, которые могут иметь место, когда в типичном случае происходит прерывание по таймеру:

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

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

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

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

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

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

1 Ответ

6 голосов
/ 25 января 2012

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

Например, я даю вам код из ядра 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 {
     ............
...