Coroutines aneb thready bez threadu

Jaroslav Benkovsky benkovsk na pha.pvt.cz
Středa Říjen 7 09:36:23 CEST 1998


Martin Mares wrote:
> 
> > A pokud nic takoveho neni (o cemz pochybuju): Bude Linuxu vadit,
> > kdyz si v procesu vezmu spravu zasobniku do vlastnich paratu?
> 
>    Nevadi (uz jsem to nekolikrat pouzil pro vlastni thready :-)), ale ma
> to jeden zasadni problem: neumim to napsat portabilne -- samotne prepnuti
> zasobniku musi byt v assembleru plus program predpoklada, ze vi, kterym
> smerem zasobnik roste a podobne veci.

no, ano, proto by byla lepsi nejaka siroce portova(tel)na
knihovna. Ale zrejme k ni maji nejbliz ty thready :(

> |  Mozna pouzit starsi verzi linuxovych vlaken, ktere si resi vlakna sami,
> | a nepouzivaji podporu jadra.
> 
>    Threadove knihovny nejsou pro coroutiny zrovna dobrym resenim -- uvedomte
> si, ze kazdy thread musi mit svuj vlastni zasobnik, coz coroutiny nemusi.
> Pokud je coroutin nekolik stovek, je uz rozdil dosti znat.

Krizove zejmena v DOSu (kde jsem to puvodne implementoval).

> # Docela vhodne pro tento ucel jsou setjmp() a longjmp(). Jediny
> # platformne zavisly problem je pak inicializace zasobniku.
> 
>    Ne, setjmp() a longjmp() pouzit nejde, jelikoz longjmp() znici vsechny
> stavy ulozene po setjmp() prislusnem k tomuto stavu.

Ale jde. Jenze to bohuzel nestaci.

Pokud by to nekoho zajimalo, tehdy jsem to implementoval takto:

Na nejakem definovanem miste se udela setjmp(A). Z te same funkce
je potom coroutina pustena _poprve_ uplne normalnim volanim funkce.
V okamziku, kdy se ma prerusit, udela setjmp(Bn) (a vysledek
 uschova), naalokuje heap o velikosti prirustku stacku mezi 
bodem A a aktualnim SP, danou cast zasobniku do nej prekopiruje
a udela longjmp(A).

Pokud se ma posleze coroutina opet spustit, ulozi se cast stacku,
kterou ma schovanou zpatky na heap a udela se longjmp(Bn).

Fungovalo to hezky, ale o portabilite si nedelam iluze. Jiste
lze take namitat, ze to neni prilis efektivni (kopirovani
zasobniku). Nejvetsi problem je tam v tom, ze si coroutiny
nemohou predavat data alokovana na zasobniku. Ale v DOSu
byla dulezitejsi ta usporena pamet.

					Edheldil
-- 
GCM/IT d- s:+ a- C++(+++) ULOI++++$ P++ L+++>++++ E+ W++
N w--- PS+ PE++ Y+ PGP R+ tv- b+++ D+ e+++ y+


Další informace o konferenci Linux