Liever geen threads meer?

 
04 maart 2010

De afgelopen tijd lijkt er een verschuiving plaats gevonden te hebben in software ontwikkeling. Waar we voorheen aan het experimenteren waren met verschillende frameworks en technieken zoals inversion of control en object relational mappers  lijken we de laatste tijd ons weer meer te richten op andere en nieuwe talen. Op het Java platform zijn Scala en Clojure erbij gekomen. Microsoft voegde F# toe aan het .NET spectrum en experimenteerde met Axum. Zelfs Google presenteerde een nieuwe taal. Wat al deze talen gemeen lijken te hebben is dat ze elementen van functionele talen lenen en een andere manier van parallellisatie toe staan.

Het gelijktijdig uitvoeren van taken in software is in de meeste gevallen niet zo moeilijk. Process A voert taak 1 uit en process B voert taak 2 uit en functioneren volledig los van elkaar. Het enige waar een ontwikkelaar naar hoeft te kijken is dat beide processen ook opgestart worden. De situatie wordt echter complexer als de processen met gezamelijke resources omgaan. De talen die in de praktijk gebruikt worden lossen dit in het algemeen op door de processes deze resources samen te laten beheren. De processen hebben geen eigen specifieke resources, maar delen een gezamelijke bron waar elk proces vrij toegang toe heeft.

Voordeel van deze methode is dat de communicatie tussen de processen impliciet is. De afzonderlijke taken hebben geen kennis nodig van andere processen. Het enige wat ze moeten weten is waar de benodigde informatie te vinden is.  Ook is deze vorm van communicatie tussen processen snel en eenvoudig voor de processor. Het aanspreken van resources als geheugen kan zonder controle direct gebeuren en heeft daarmee weinig overhead.

Nadeel van de shared resources aanpak is dat het ondoorzichtig is en gevoelig voor fouten.  Er is niets dat voorkomt dat processen tegelijkertijd dezelfde resources aanspreken of manipuleren. Voor de ontwikkelaar is het een handmatige taak om te voorkomen dat gelijktijdigheids fouten voorkomen. Dit is een taak waarvoor veel kennis nodig is over hoe en wanneer de verschillende resources afegschermd moeten worden. Te weinig afscherming hoeft niet onmiddelijk een fout op te leveren, maar kan maanden of jaren later catstrofale gevolgen hebben. Teveel afschermen leidt weer to processen die veel op elkaar wachten en daardoor de voordelen van parallelliteit niet optimaal benutten.

Het gevolg is dat ontwikkelaars vaak huiverig zijn om concurrency toe te passen in software en dit meestal achterwege laten als het niet strict noodzakelijk is. Toch wordt het steeds belangrijker. Computers bevatten steeds meer processoren en processoren bevatten steeds meer cores. Om deze capaciteit aan te kunnen spreken is het noodzakelijk dat de software parallel werkt zodat verschillende taken aan verschillende processoren of cores uitbesteed kunnen worden.

Om parallellisatie toegankelijker te maken lenen de nieuwe talen concepten van functionele talen. Functioneel programmeren steunt op het principe dat functies of operaties geen neveneffecten hebben. Ze hebben slechts invoer en uitvoer en delen geen informatie met elkaar. Daarom is in veel functionele talen de communicatie tussen processen anders opgelost. Processen sturen elkaar expliciete berichten met gegevens om te communiceren. Deze vorm van concurrency wordt wel message-based of actor-based concurrency genoemd.

Nadeel van deze vorm van parallellisatie is dat communicatie expliciet gedefineerd moet worden en het versturen van een message een bepaalde overhead met zich meebrengt. Voordeel is echter dat het robuuster is en minder gevoelig voor fouten. Ook kunnen ontwikkelaars beter inzicht krijgen in de communicatie tussen processen door de berichten te traceren. Het expliciet versturen van berichten vertaalt ook rechtstreeks naar gedistibueerd werken zodat het conceptuele verschil tussen lokaal ontwikkelen of ontwikkelen voor “de cloud” minimaal wordt.

De nieuwe talen proberen dus concurrency op een andere manier aan te pakken. We zijn aan het zoeken naar een manier om de kracht die in onze hardware en het internet zit te gebruiken en deze talen zijn de experimenten om ons daarbij proberen te helpen. De aanpassingen houden echter meer in dan meer en eenvoudiger processen opstarten in onze applicatie. Ik denk dat we als software ontwikkelaars de komende tijd moet gaan nadenken wat de gevolgen zijn voor de algemene opzet van onze applicaties.


Werken met ?
Kijk dan bij onze mogelijkheden voor starters en/of ervaren IT'ers.


Categorieën: Development