Увеличивающиеся часы - PullRequest
       19

Увеличивающиеся часы

0 голосов
/ 05 февраля 2011

Когда процесс настроен на запуск с начальным интервалом времени, например, 10, кто-то в аппаратном обеспечении должен знать этот начальный интервал времени и уменьшать его, а когда интервал времени становится равным 0, прерывание должно запускаться!

В ядре freeBSD я понимаю, что hardclock и softclock выполняют эту задачу учета. Но мой вопрос заключается в том, является ли это уменьшение такта параллельным выполнению процесса?

Ответы [ 2 ]

1 голос
/ 05 февраля 2011

В туманном прошлом это было проще: тактовая микросхема - дискретное устройство на материнской плате - была бы настроена на периодическое срабатывание прерываний с частотой X Гц.Каждый раз, когда происходило «прерывание по таймеру», выполнение текущей программы приостанавливалось (как и любое другое прерывание), и код планировщика ядра уменьшал свой временной интервал.Когда временной интервал достигает нуля, ядро ​​отнимает процессор от программы и передает его другому.Микросхема тактовой частоты, будучи отделена от ЦП, очевидно, работает параллельно с выполнением программы, но бухгалтерия ядра должна прерывать программу (это туманное прошлое, о котором мы говорим, поэтому есть только один ЦП,поэтому код ядра и пользовательский код не могут работать одновременно).

В настоящее время часы - это не дискретное устройство, это часть ЦП, и их можно запрограммировать на любые умные действия.Наиболее важно, что он может быть запрограммирован на запуск одного прерывания через N микросекунд, где N может быть довольно большим;это позволяет ядру простаивать ЦП в течение очень длительного времени (в терминах компьютера; может быть, целую секунду), если для этого нет ничего конструктивного, экономя энергию.Между тем, уже трудно найти одноядерный процессор, ядра делают все умные трюки, чтобы перенести свою бухгалтерию на процессоры, которые не имеют ничего лучше, а учет временных интервалов значительно усложняется.В настоящее время в Linux используется « Полностью честный планировщик », который даже не имеет понятия «временных интервалов».Я не знаю, что есть у FreeBSD, но я был бы удивлен, если бы это было просто.

Так что короткий ответ на ваш вопрос «в основном параллельно, в большей степени сейчас, чем в прошлом, но это не удаленнотак же просто, как таймер обратного отсчета ".

1 голос
/ 05 февраля 2011

Я буду использовать PIT в качестве примера здесь, потому что это самый простой механизм синхронизации (и он уже довольно давно).

Кроме того, этот ответ довольно специфичен для x86;а также ОС-агностик.Я не знаю достаточно о внутренностях FreeBSD и Linux, чтобы отвечать за них конкретно.Кто-то еще может быть более способным к этому.

По существу, временной интервал «уменьшается» параллельно с выполнением процесса, поскольку таймер создает IRQ для каждого «тика» (обратите внимание, что таймеры, такие как HPET, могутсделать режим «one-shot», который запускает IRQ после определенной задержки, которая также может использоваться для планирования).Как только временной интервал уменьшается до нуля, планировщик получает уведомление и происходит переключение задач.Все это происходит «одновременно» с вашим процессом: IRQ включается, запускает некоторый код, а затем позволяет вашему процессу продолжать работу до тех пор, пока не истечет временной интервал.

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

...