LINUX.ORG.RU

Кооперативная многозадачность


0

0

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

У меня есть реализация кооперативной многозадачности (в данный момент для языка Free Pascal). Семафоры и передача сообщений реализованы, есть тестовые примеры.

Модуль не использует системные вызовы и привилегированные команды процессора, поэтому его можно компилировать под любую ОС.

Может, кто-нибудь ещё этим интересуется?

Несколько вопросов навскидку:

1) без системных вызовов - это как? Переключение контекстов и выделение стеков встроенным асмом? Тогда о любой ОС можно забыть, так как детали асма отличаются везде. 2) как решена проблема блокирования на примитивах ввода вывода? то есть, когда одна "нить" заблокировалась на read, другие должны работать. Как это можно сделать, не надстраиваясь над системными вызовами? 3) а кому-то вообще фри паскаль нужен? а для Си есть, например GNU pth

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

anonymous
()
Ответ на: комментарий от anonymous

>1) без системных вызовов - это как? Переключение контекстов и выделение стеков встроенным асмом?

  Да, но асма немного. Можете посмотреть исходник: www.gursky.nm.ru/distr.zip

>2) как решена проблема блокирования на примитивах ввода вывода? то есть, когда одна "нить" заблокировалась на read, другие должны работать. Как это можно сделать, не надстраиваясь над системными вызовами?

  Многозадачность кооперативная, т.е. без ведома потока переключения не происходит.

>3) а кому-то вообще фри паскаль нужен?

  Довольно хороший, кстати, язык.

ivan_gur
() автор топика

Если интересна теоретически красивая и стройная реализация - то смотреть на нитки в Bigloo.

Так же - все, кто имеет дело с многозадачностью, обязаны предварительно изучить Пи-исчисление. Без него очень легко запутаться.

flamer
()
Ответ на: комментарий от flamer

> Если интересна теоретически красивая и стройная реализация - то смотреть на нитки в Bigloo

Нет, Луговский, не интересна. Интересно только посмеяться над таким клоуном как ты:

http://anonymouse.ws/cgi-bin/anon-www.cgi/http://bacek.com/blog/2003_04_04_111.h tml

Умора!

anonymous
()
Ответ на: комментарий от flamer

> Если интересна теоретически красивая и стройная реализация - то смотреть на нитки в Bigloo

Нет, Луговский, не интересна. Интересно только посмеяться над таким клоуном как ты:

http://bacek.com/blog/2003_04_04_111.h tml

Умора! Давно так не смеялся над твоими "сверхценными идеями" после "Русские Физики выбирают Slackware":))

Анонимнвый Анонимус

anonymous
()

Хе. Я тоже похожее (по-видимому) делал.

Задача переключалась тупым сохранением регистров (pusha), стека, восстановлением стека и регистров другой задачи и прыжком на ее точку прерывания. Это чудо даже как-то работало :) Обмена сообщений, правда, не было совсем, единственная команда была sleep (переключение задачи с засыпанием), ну и yield (аналогично sleep(0)).

Хотел эту псевдо-многозадачность в скриптовом движке использовать (причем скрипты чтобы были нативные) :) Но оказались слишком высокие накладные расходы на стек задачек, если их несколько тысяч делать :)

К сожалению, исходники я похоже куда-то потерял :(

WFrag ★★★★
()
Ответ на: комментарий от WFrag

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

Я сохранял только ESP, EBP. Переключение задач делается очень просто: в ESP загружается адрес вершины стека следующей задачи, и уже в этом стеке выполняется инструкция возврата (см. исходный код).

>Обмена сообщений, правда, не было совсем, единственная команда была sleep (переключение задачи с засыпанием), ну и yield (аналогично sleep(0)).

Обмен сообщениями несложно реализовать, когда реализованы семафоры.

>Хотел эту псевдо-многозадачность в скриптовом движке использовать (причем скрипты чтобы были нативные) :)

У меня тоже есть идея ввести в компилятор помимо поддержки вызовов функций работу с потоками.

>Но оказались слишком высокие накладные расходы на стек задачек, если их несколько тысяч делать :)

Несколько тысяч понадобится редко :) (Тем более, что в моей реализации с 4096-байтным стеком на одну задачу уходит порядка 4 Кб).

ivan_gur
() автор топика
Ответ на: комментарий от ivan_gur

>Я сохранял только ESP, EBP.

Да, я когда делал как-то не подумал (или не знал), что функция после вызова не обязана все регистры сохранять (в Windows вроде обязательно EBX сохранять, например). Поэтому сохранял все. :)

>Переключение задач делается очень просто: в ESP загружается адрес вершины стека следующей задачи, и уже в этом стеке выполняется инструкция возврата (см. исходный код).

Да, точно, я так и делал, если мне не изменяет память.

>Обмен сообщениями несложно реализовать, когда реализованы семафоры.

Не совсем понял, зачем?

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

WFrag ★★★★
()
Ответ на: комментарий от WFrag

>Не совсем понял, зачем?

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

Не всегда удобно использовать глобальные переменные - посмотрите хотя бы переключатель консолей.

Особенно трудно обойтись без синхронизации при составлении конвейера обработки информации (одно из основных применений подобной библиотеки).

ivan_gur
() автор топика

На http://www.gursky.nm.ru/fth.pas я выложил немного другую версию.

PS: Оказывается, подобными вещами занимался даже Microsoft: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcemain4/htm...

>The SwitchToFiber function saves the state information of the current fiber and restores the state of the specified fiber. You can call SwitchToFiber with the address of a fiber created by a different thread.

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

ivan_gur
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.