Приоритеты темы в Lua

Я взглянул на книгу по Lua и узнал, что многопоточность в Lua совместна. То, что я не смог найти, это некоторая информация о приоритетах потоков. Я предполагаю, что потоки с одинаковым приоритетом работают до завершения, так как многопоточность является кооперативной, или выход завершен. Как насчет потока, который имеет более высокий приоритет, чем другой?

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

2 ответа

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

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

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

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

редактировать

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

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

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

В Lua потоки не могут работать в параллельном режиме (то есть на нескольких ядрах) в пределах одного состояния Lua. Там нет параллелизма, так как это совместная многозадачность. Только когда один поток приостанавливает выполнение (возвращает), другой поток может возобновить работу. Ни при каких условиях два потока Lua не могут выполняться одновременно в одном состоянии Lua.

Вы говорите о вытеснении - планировщике, прерывающем один поток для выполнения другого.

Другие вопросы по тегам