| Processen in UNIX-achtige besturingssystemen (waaronder Linux, macOS, BSD, enz.) worden gemaakt en verwijderd door een combinatie van systeemaanroepen en interne kernelmechanismen.
Procescreatie:
De voornaamste manier waarop een nieuw proces wordt aangemaakt is via de systeemaanroep `fork()`. `fork()` creëert een bijna identieke kopie van het aanroepende proces (het *bovenliggende* proces). Zowel het ouderproces als het nieuw gemaakte *child*-proces gaan door met de uitvoering vanaf het punt van de `fork()`-aanroep. Het belangrijkste verschil is de retourwaarde van `fork()`:
* In het bovenliggende proces: `fork()` retourneert de proces-ID (PID) van het onderliggende proces. Deze PID is een unieke identificatie voor het kind.
* In het onderliggende proces: `fork()` retourneert 0.
Na `fork()` volgen de bovenliggende en onderliggende processen doorgaans verschillende uitvoeringspaden. Het onderliggende proces gebruikt vaak de `exec()` familie van systeemaanroepen (`execl`, `execv`, `execvp`, etc.) om zijn huidige image te vervangen door een nieuw programma. `exec()` overschrijft de geheugenruimte van het kind met de code en gegevens van het nieuwe programma. Als het kind `exec()` niet gebruikt, gaat het door met het uitvoeren van dezelfde code als de ouder, waardoor een echte kloon ontstaat.
Andere manieren waarop processen worden gecreëerd zijn onder meer:
* `vfork()` (minder vaak voorkomend en mogelijk problematisch): Vergelijkbaar met `fork()`, maar met subtiele verschillen in het delen van geheugen. Over het algemeen vermeden vanwege mogelijke impasses.
* `clone()` (gevorderder): Biedt een fijnmaziger controle over de bronnen die worden gedeeld tussen de bovenliggende en onderliggende processen. Gebruikt in bibliotheken en geavanceerde draadsnijmodellen.
* Systeeminitialisatie: Het init-proces (PID 1) is de voorloper van alle andere processen in het systeem. Het is verantwoordelijk voor het starten van andere processen tijdens het opstarten.
* `pthread_create()`: Deze functie wordt gebruikt voor het maken van threads binnen een proces. Hoewel threads dezelfde geheugenruimte delen als hun bovenliggende proces, worden ze nog steeds beschouwd als afzonderlijke uitvoeringseenheden die door de kernel worden beheerd.
Procesverwijdering (beëindiging):
Een proces wordt onder verschillende omstandigheden beëindigd (wordt verwijderd):
* Normale beëindiging: Het proces voltooit de uitvoering ervan en roept de systeemaanroep `exit()` aan. Dit geeft aan het besturingssysteem aan dat het klaar is. De exitstatus kan worden gebruikt om succes of mislukking aan te geven.
* Abnormale beëindiging: Het proces loopt vast vanwege een segmentatiefout, illegale instructie of een andere fout. De kernel beëindigt het proces.
* Signaalbeëindiging: Een ander proces (of de kernel zelf) kan een signaal (bijvoorbeeld `SIGTERM`, `SIGKILL`) naar een proces sturen, waardoor de beëindiging ervan wordt afgedwongen. Met `SIGTERM` kan het proces worden opgeschoond voordat het wordt afgesloten, terwijl `SIGKILL` het proces onmiddellijk beëindigt zonder enige opschoning.
* Beëindiging bovenliggend proces: Als een bovenliggend proces wordt beëindigd, kunnen de onderliggende processen ook worden beëindigd, afhankelijk van de instellingen van het besturingssysteem (vaak overgenomen van de procesgroep van het bovenliggende proces). Bij het 'init'-proces worden doorgaans weeskinderen geadopteerd.
De rol van de kernel:
De kernel speelt een cruciale rol bij het beheren van processen gedurende hun hele levenscyclus. Het zorgt voor het maken van processen, planning, geheugentoewijzing, resourcebeheer, signaalverwerking en procesbeëindiging. De kernel onderhoudt datastructuren (zoals de procestabel) om informatie over elk lopend proces bij te houden.
Samenvattend wordt het aanmaken en verwijderen van processen in UNIX zorgvuldig georkestreerd door de kernel en omvat het een reeks systeemaanroepen waarmee programmeurs de proceslevenscyclus kunnen controleren. De `fork()` en `exec()` familie (voor creatie) en `exit()` en signalen (voor verwijdering) zijn de kerncomponenten. |