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