Как реализовать практичный оптоволоконный планировщик? - PullRequest
9 голосов
/ 19 апреля 2009

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

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

Ответы [ 5 ]

7 голосов
/ 28 декабря 2009

Вам нужно будет объединить операции ввода-вывода в интерфейс, основанный на событиях (выбор / опрос), чтобы вы могли использовать операционную систему для ожидания, сохраняя при этом возможность планировать другие волокна. у select / poll есть аргумент timeout - для волокон, которые хотят спать, вы можете создать очередь с приоритетом, которая использует эту опцию select / poll для эмуляции спящего вызова.

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

См. http://swtch.com/libtask/ для рабочей реализации.

5 голосов
/ 04 мая 2009

Вам, вероятно, следует взглянуть на семейство функций setcontext (http://en.wikipedia.org/wiki/Setcontext).). Это будет означать, что в вашем приложении вам нужно будет повторно реализовать все функции, которые могут блокировать (чтение, запись, сон и т. Д.) асинхронные формы и возврат в планировщик.

Только «волокно планировщика» будет ожидать событий завершения, используя select (), poll () или epoll (). Это означает, что когда планировщик находится в режиме ожидания, процесс будет находиться в режиме ожидания в вызове select / poll / epoll и не будет загружать ЦП.

1 голос
/ 20 октября 2014

Вы можете контролировать поток управления также с помощью сопрограмм. Библиотека, поддерживающая их создание, - BOOST.ASIO.

Хороший пример доступен здесь: Boost Stackful Coroutines

1 голос
/ 05 октября 2014

Хотя немного поздно ответить, я хотел бы упомянуть, что у меня есть практическая реализация библиотеки волокон на C, которая называется libevfibers .

Несмотря на то, что это молодой проект, он используется в производстве. Он предоставляет решение не только для классических асинхронных операций, таких как чтение / запись сокета, но и для неблокирующего ввода-вывода файловой системы. В проекте задействованы 3 замечательные библиотеки - libcoro, libev и libeio.

0 голосов
/ 20 апреля 2009

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

Волокно ожидания / ожидания просто означает, что оно не запланировано на данный момент - оно просто переключается на цикл обработки событий.

Кстати, если вы ищете какой-то реальный код, посмотрите на http://svn.cmeerw.net/src/nginetd/trunk/, который все еще находится в стадии разработки, но пытается реализовать планировщик волокна поверх многопоточного цикла событий (с портами завершения ввода-вывода Win32 или управляемым краем epoll).

...