# Daemon (Unix)

Daemon is de term die binnen Unix en Unix-achtige besturingssystemen (zoals Linux en FreeBSD) gebruikt wordt om een proces aan te duiden dat op de achtergrond actief is om bepaalde (onderhouds)taken uit te voeren of om diensten te verlenen aan andere computerprogramma's. In Windows worden zulke achtergrondprogramma's meestal services genoemd.

## Het daemon-proces

Het is voor veel standaardtaken van een computer gemeengoed geworden om deze taken te implementeren in een client-server architectuur. Hierbij valt te denken aan afdrukken via een printer of het lezen van bestanden vanaf een harde schijf.
Het voordeel van het verdelen van een dergelijke taak in een client-gedeelte (het gedeelte dat de taak uitgevoerd wil hebben) en een server-gedeelte (dat de taak uitvoert), is dat de identiteit van de client geheel transparant wordt voor de server – het maakt voor de server niet uit wie de taak uitgevoerd wil hebben. Dit maakt het zeer makkelijk om bepaalde mogelijkheden van een computer te delen met andere computers (één netwerkprinter in plaats van een aparte printer voor iedere computer, bestanden op een harde schijf delen met andere gebruikers in plaats van over te moeten zetten tussen computers via een apart medium). Het maakt ook het ontwerp van de software voor een dergelijke taak makkelijker en kan zelfs de interoperabiliteit tussen systemen bevorderen (iedere client die de server aan kan spreken, mag dat – geen gedoe meer over welke bestandsformaten voor op de harde schijf door welke besturingssystemen ondersteund worden).
Voor een dergelijke taak moet een server twee dingen kunnen: verzoeken om de taak uit te voeren aan kunnen nemen en de taak zelf uitvoeren. Het is daarbij gemeengoed (als er toch al meerdere processen in het spel zijn) om deze twee subtaken te verdelen: iedere subtaak zijn eigen proces. Eén proces om de eigenlijke taak uit te voeren, een ander om het verzoek aan te nemen en het uitvoeren te starten. Dat laatste proces wordt in Unix-kringen een daemon-proces genoemd.
Er zijn twee soorten servers of daemon-processen te onderscheiden: concurrente en iteratieve daemons.

## Werking van een concurrent daemon

Normaal gesproken werkt een daemon zo, dat het proces een groot gedeelte van de tijd stil ligt. Alleen als er een verzoek om een dienst binnen komt, heeft de daemon iets te doen. En wat de daemon meestal doet is een apart proces opstarten dat de eigenlijke taak uitvoert (er is dus één uitvoerend proces per verzoek) en ervoor zorgen dat dat aparte proces kan communiceren met de client die het verzoek deed. Daarna laat de daemon het aparte proces zijn gang gaan en gaat weer "slapen", wachtend op het volgende verzoek.
De reden achter deze opzet is de volgende: om over het netwerk met een server te kunnen praten, moet een client het adres van de server weten: de computer waar de server op draait en de plaats waar de server precies op die computer aangesproken kan worden (dit heet de poort). De combinatie van IP adres en poort heet een socket. Over een socket kan echter maar één verbinding tegelijkertijd geopend worden. Is de listener van een server dus met een client bezig over die ene socket, dan kan Unix nog zo multitaskend zijn, een volgende client moet wachten totdat de listener met de voorgaande client klaar is. Door de server nu op te splitsen in meerdere processen (in het Engels heet dit forking) kan het volgende plaatsvinden: de daemon neemt het verzoek van de client aan op de standaard poort (degene die alle clients kennen voor die server). Dan start de daemon een uitvoerend proces op. De server kan nu de client helpen door middel van het uitvoerende proces. Het uitvoerende proces en de client communiceren verder over een andere, niet-standaard poort. Daardoor kan de daemon weer op de standaard poort gaan luisteren totdat de volgende connectie binnenkomt. Zo kan de server meerdere clients tegelijkertijd helpen.
In het bovenstaande kan in plaats van een proces ook een taak of thread worden gestart, afhankelijk van de modellen die door het besturingssysteem ondersteund worden.

## Werking van een iteratieve daemon

De werking van een iteratieve daemon is nog eenvoudiger dan die van een concurrente daemon. Iteratieve daemons binden ook een socket en luisteren op een poort, zoals concurrente daemons, maar zij verwerken slechts een verzoek per keer. Als een client bediend wordt, kunnen geen andere clients de socket openen. In veel gevallen zal dit simpelere model niet voldoen, en zal daarom een concurrente daemon worden gebruikt.

## Localhost

Nu blijft als enige vraag over: wat gebeurt er nu als een client van een dienst gebruik wil maken die beschikbaar gesteld wordt door dezelfde computer als die waar de client op draait? Want dat is geen verbinding over het netwerk meer. Moeten client en server dan iets heel aparts doen voor dat specifieke geval? Gelukkig is het antwoord op die vraag "nee" (anders zou het wel heel moeilijk worden om een fatsoenlijke server te schrijven). Unix-omgevingen bieden allerlei faciliteiten voor processen om netwerkcommunicatie te simuleren, zodat een computer met zichzelf kan praten en het toch lijkt alsof het "gewoon" een netwerkverbinding is. Een dergelijke verbinding loopt meestal over een virtuele "netwerkkaart" in de computer, genaamd een "loopback device". Dit wordt doorgaans localhost genoemd.

## Oorsprong van de naam daemon

De naam daemon is bedacht door de programmeurs van het Project MAC van MIT. Het is een verwijzing naar Maxwells demon, een beroemd gedachte-experiment uit 1867, van de Schotse natuurkundige James Clerk Maxwell. Deze demon werkt constant in de achtergrond waar hij moleculen aan het sorteren is. Deze interpretatie komt overeen met de Griekse opvatting van demonen als mythische wezens die constant in de achtergrond werken zonder voorkeur voor goed of kwaad.
Volgens sommigen staat DAEMON voor "Disk And Execution MONitor", dit is echter niet de oorspronkelijke betekenis, maar eerder een backroniem.

## Vergelijkbare programma's in andere besturings-systemen

In de DOS-omgeving werden gelijkwaardige programma's geschreven als Terminate and Stay Resident-software (TSR). Onder Microsoft Windows worden daemons services genoemd. Op de oorspronkelijke Mac OS noemt men dergelijke programma's extensies. Mac OS X, dat van Unix afstamt, heeft daemons.