Возобновление потока после графика () - PullRequest
2 голосов
/ 24 июля 2011

Еще один вопрос новичка:

В следующем коде, что делать, если поток прерывается после вызова set_current_state, но перед вызовом schedule.Когда код снова запланирован, он начинается с вызова «schedule» и удаляется из очереди выполнения?Или вызов «schedule» на этот раз игнорируется и начинается с оператора set_current_state (TASK_RUNNING)?

{
...
set_current_state(TASK_INTERRUPTIBLE); /* suppose thread is preempted just after this function call */
schedule();
set_current_state(TASK_RUNNING);
...
} 

1 Ответ

6 голосов
/ 24 июля 2011

Вот (более или менее), что произойдет, если принудительное вытеснение произойдет после первой строки и перед второй:

  1. Планировщик запустится (функция scheduler () из sched.c) - поскольку это означает то, что означает вытеснение.

  2. Поскольку ваша задача помечена как неработоспособная, планировщик удалит ее из очереди выполнения и выберет другую задачу.

  3. Теперь ваша задача не будет запланирована, пока что-то внешнее не пометит ее снова как работоспособную. Это может произойти из-за сигнала, отправленного задаче, или, если задача находится в очереди в очереди ожидания, из-за события, к которому относится очередь пробуждения, но что-то внешнее ДОЛЖНО пометить задачу как выполняемую снова, иначе она никогда не будет запланирована , Вот почему, если вы посмотрите на код очереди ожидания, он сначала помещает задачу в очередь ожидания, а только затем делает что-то похожее на ваш код.

  4. Когда ваша задача помечена как выполняемая, в какой-то момент планировщик выберет ее и переключит контекст в код задачи.

  5. Затем будет вызвана функция schedule (). По всей вероятности, планировщик собирается выбрать ту же задачу еще раз, поскольку она только что была выбрана им как наиболее подходящая для выполнения, и маловероятно, что она изменилась.

  6. На обратном пути из планировщика последнее set_current_state в основном будет без операции, поскольку задача к этому времени уже помечена как работоспособная в этом сценарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...