Как многозадачность реализуется на начальном уровне? - PullRequest
1 голос
/ 06 февраля 2012

Как многозадачность реализована на базовом уровне?Чтобы прояснить мой вопрос, скажем, нам дали среду выполнения C, чтобы создать приложение, которое реализует многозадачность, которое может запускать только одну задачу за раз на одноядерном процессоре, скажем, вызывая функцию main() этого приложения "многозадачности",Как стандартные ядра ОС реализуют это?Как это меняется с многоядерными процессорами

Ответы [ 2 ]

1 голос
/ 22 декабря 2014

ОС устанавливает таймер прерывания и запускает программу.По истечении времени таймера поток управления переходит к коду ОС для переключения контекста.

При переключении контекста ОС сохраняет регистры и данные поддержки текущего процесса и заменяет их в ЦПУ данными следующего процесса в очереди.,Затем он устанавливает другой таймер прерывания и позволяет следующей программе запускаться с того места, где она была прервана.

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

Механика прозрачна для программ.

Выполнить.Переключатель.Повторение.:)

0 голосов
/ 10 февраля 2012

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

  1. Если я правильно помню, x86 поддерживает аппаратное переключение задач.(У меня был минимальный опыт работы с этим типом многозадачности.) Из того, что я помню, когда процессор обнаруживает условия для переключения задач, он автоматически сохраняет все регистры исходящей задачи в свой сегмент состояния задачи (x86)и загружает все регистры из сегмента состояния задачи входящей задачи.При таком подходе существуют различные предостережения и ограничения, такие как установка «занятого бита» и возможность переключения на «занятую задачу» только в особых условиях.Лично я не считаю этот метод особенно полезным для меня.

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

Надеюсь, это поможет.

...