Cooperative Multitask

User avatar
ZeroHero
Level 36 - Tron
Posts: 362
Joined: 21 Jul 2009, 19:03
Location: England
Contact:

Cooperative Multitask

Unread post by ZeroHero » 16 Mar 2015, 22:09

Jeg har faaet til opgave at lave en co-operative multitask i en single threaded program skrevet i C++. Den skal kunne anvendes som kernen i en mini-operativ styresystem. Man skal kunne tilfoeje nogle opgaver til den som vil blive eksekveret naar manageren/scheduler'en priorterer tid til den. Efter noget research kan jeg godt forstaa de store hoved traek. Dere er dog et problem jeg ikke kan forstaa. Manageren skal kunne saette en opgave i pause tilstand og starte en ny opgave for derefter at kunne vende tilbage og faerdiggoere opgaven som den var igang med. Som eksempel skal opgaverne finde ud af om nogle binaere traeer er balancerede eller ubalancerede. Til det bliver man naesten noedt til at lave en recursive soegning. Saa jeg gaar ud fra at i hver recursion skal funktionen spoerge manageren om den kan fortsette med sin soegningen eller den skal saettes i pause tilstand, saa manageren kan begynde paa en ny opgave. Men hvordan kan man vende tilbage til sin recursive soegning efter at havde udfoert en anden opgave? Som sagt saa er det hele single-threaded. Er der nogle herinde der kan kaste lys paa dette for mig?

Med andre ord, I det store hele saa skal man altsaa lave et single-threaded system som kan udfoerer opgaver (asynkronisk) uden at blokere systemet paa noget tidspunkt.

Niels Jørgensen
Level 22 - Imp
Posts: 225
Joined: 24 Oct 2008, 09:31

Re: Cooperative Multitask

Unread post by Niels Jørgensen » 17 Mar 2015, 09:58

Personligt ville jeg ignorere rekursion helt - hvis en task i et co-op multitasking system bruger rekursion så er det dens egen opgave at bliver færdig hurtigt. Kan den ikke det så må den implementeres på en anden måde. Det er en uskik at lade task'en kalde tilbage til manageren for at pause IMO - den skal gemme sin state og afslutte med en return så den kan fortsætte hvor den var næste gang den bliver kaldt.

Recursion er et eller andet sted bare suger coating på din implementering - det drejer sig om at gemme N states og hente dem tilbage igen i omvendt rækkefølge og kan altid implementeres på en ikke rekursiv måde. Koden bliver ofte ikke så pæn, men performer ofte bedre ;)

Hvis du absolut vil lave noget mere fancy kan du jo kigge på Unity's "yield" implementering - ved ikke hvordan den har det med recursion, men kan godt forestille mig at det bliver noget rod (eller bare meget langsomt).

User avatar
ZeroHero
Level 36 - Tron
Posts: 362
Joined: 21 Jul 2009, 19:03
Location: England
Contact:

Re: Cooperative Multitask

Unread post by ZeroHero » 17 Mar 2015, 10:36

Jeg har faaet implementeret en prototype som skulle vaere fint for nu. Jeg tror jeg er blev lidt forvirret undervejs i min research, fordi jeg startede med at laese denne artikel: https://msdn.microsoft.com/en-us/magazine/jj553509.aspx Det virker til at han tilgaar cooperative multitasking det paa en anderledes maade end hvad min opgave var tiltaenkt. Jeg haaber jeg en dag vil kunne forstaa denne artikel fuldt ud og er vil blive i stand tilat kunne implementere det en dag. Men hvis jeg ikke tager helt fejl, saa bruger han ikke en manager/scheduler? Det ser ogsaa ud til at artikelen bruger en masse 'beskidte' macro magi. Har du evt. proevet at implementere en cooperative multitasking paa denne maade Niels?

Niels Jørgensen
Level 22 - Imp
Posts: 225
Joined: 24 Oct 2008, 09:31

Re: Cooperative Multitask

Unread post by Niels Jørgensen » 17 Mar 2015, 11:11

Skimmede det lidt hurtigt - og umiddelbart ser det ud til at han laver en del stack gymnastik hvilket helt klart er måden at gøre det på - effektivt set får hver task sin egen stack og den bliver så task'ens state machine så uanset hvor meget den kalder sig selv så kan "manageren" altid fortsætte sit eget loop fordi det er en separat stak. Det er det samme en pre-emptive scheduler gør, bare på en timer interrupt.

Jeg har aldrig lavet en co-op kernel, men jeg har implementeret en pre-emptive real-time kernel for 20 år siden da jeg gik på DIA. Men det er jo lidt tid siden, så jeg er lidt rusten ;)

User avatar
ZeroHero
Level 36 - Tron
Posts: 362
Joined: 21 Jul 2009, 19:03
Location: England
Contact:

Re: Cooperative Multitask

Unread post by ZeroHero » 17 Mar 2015, 12:01

Inden jeg indsender min opgave er det muligt jeg kan faa dig til at tjekke det igennem for mig? Jeg kan sende dig kildekoden per mail eller lign. Det er ikke ret meget kode og det er rimligt overskuligt skrevet. Jeg haaber paa om du kunne vurdere om jeg er helt ude i skoven og vende :-) Det burde ikke tage mere end 10 minutter at gaa igennem da der kun er 3 klasser.

Niels Jørgensen
Level 22 - Imp
Posts: 225
Joined: 24 Oct 2008, 09:31

Re: Cooperative Multitask

Unread post by Niels Jørgensen » 17 Mar 2015, 12:08

Jeg kan godt tage et hurtigt kig, men det er ingen garanti for kvalitet - 20år du ved ;)

Du kan også poste den her hvis der skulle være andre der har et mindre rustent input end mit - op til dig...

User avatar
ZeroHero
Level 36 - Tron
Posts: 362
Joined: 21 Jul 2009, 19:03
Location: England
Contact:

Re: Cooperative Multitask

Unread post by ZeroHero » 17 Mar 2015, 12:25

Jeg ville ikke havde noget imod at poste det her men opgaven maa ikke vises offenligt af indehaveren saa det vil naturligvis respektere.
Hvis du giver mig din email addresse saa vil jeg sende den til dig - du kan sende din email addresse over en pm besked hvis du vil :-)
... og mange tak :-)

Niels Jørgensen
Level 22 - Imp
Posts: 225
Joined: 24 Oct 2008, 09:31

Re: Cooperative Multitask

Unread post by Niels Jørgensen » 17 Mar 2015, 12:30

nj-at-boaneo.com

User avatar
ZeroHero
Level 36 - Tron
Posts: 362
Joined: 21 Jul 2009, 19:03
Location: England
Contact:

Re: Cooperative Multitask

Unread post by ZeroHero » 17 Mar 2015, 13:25

Saa skulle den vaeere sendt.

Post Reply