Verder Terug Inhoud

6. Wat gebeurt er als je programma's vanuit de shell draait?

De shell is de interpreter voor de Unix-commando's die je intikt; het wordt een shell genoemd omdat het omhulsel is van de kernel en het de kernel verbergt. De normale shell geeft je de '$' prompt die je na het inloggen ziet (tenzij je het hebt aangepast om iets anders te doen). We zullen het hier niet over shell-syntax hebben en de makkelijke zaken die je op het scherm kunt zien; in plaats daarvan zullen we een blik achter de schermen werpen over wat er vanuit het gezichtspunt van de computer gebeurt.

Na het booten en voordat je een programma draait, kun je aan je computer denken als een dierentuin vol met processen die allen wachten om iets te kunnen doen. Ze wachten allemaal op events. Een event kan zijn dat je een toets indrukt of een muis beweegt. Of een event kan een datapakket zijn, dat via het netwerk binnenkomt, als je computer op een netwerk is aangesloten.

De kernel is één van deze processen. Het is een speciale, omdat het bepaalt wanneer de andere gebruikersprocessen kunnen draaien, en het is normaal gesproken het enige proces met directe toegang tot de hardware van de computer. In feite moeten gebruikersprocessen een verzoek indienen aan de kernel als ze toetsenbordinvoer willen ophalen, naar je scherm willen schrijven, van of naar disk willen schrijven, of gewoon alles willen doen anders dan in het geheugen vermalen van bits. Deze verzoeken staan bekend als system calls.

Normaal gesproken gaat alle I/O via de kernel dus het kan de bewerkingen regelen en voorkomen dat processen elkaar in de weg zitten. Van een paar speciale gebruikersprocessen is het toegestaan dat ze de kernel ongemerkt voorbijgaan, gewoonlijk doordat er directe toegang tot I/O poorten wordt gegeven. X-servers (de programma's die op de meeste Unix boxen grafische schermverzoeken van andere programma's afhandelen) zijn hier het meest algemene voorbeeld van. Maar we zijn nog niet bij de X server aangekomen; je kijkt naar een shell-prompt op een character console.

De shell is gewoon een gebruikersproces, en niet een bijzonder speciaal proces. Het wacht op je toetsaanslagen, luistert (via de kernel) naar de toetsenbord I/O poort. Als de kernel ze ziet, echoot hij ze naar je scherm en geeft ze vervolgens door aan de shell. Als de kernel een `Enter' ziet geeft het een regel tekst door aan de shell. De shell probeert deze toetsaanslagen als commando's te interpreteren.

Laten we ervan uitgaan dat je `ls' en Enter intikt om de Unix directorylijst aan te roepen. De shell volgt zijn interne regels om er achter te komen dat je het uitvoerbare commando in het bestand `/bin/ls' wilt uitvoeren. Het genereert een system call door de kernel /bin/ls als een nieuw kind proces op te starten en het toegang te geven tot het scherm en toetsenbord via de kernel. Vervolgens gaat de shell slapen, in afwachting tot ls is beëindigd.

Als /bin/ls klaar is, vertelt het de kernel dat het klaar is door een exit system call aan te roepen. De kernel schudt vervolgens de shell wakker en vertelt het dat het verder kan gaan met de uitvoering. De shell roept een andere prompt aan en wacht op een andere regel invoer.

Er kunnen zich echter andere dingen afspelen als `ls' wordt uitgevoerd, (we moeten er van uit gaan dat je een zeer lange directorylijst laat weergeven). Je zou bijvoorbeeld naar een andere virtuele console kunnen schakelen, daar inloggen en het spel Quake opstarten. Of, veronderstel dat je bent aangesloten op het Internet, dan zou je computer mail kunnen verzenden of ontvangen op het moment dat /bin/ls wordt uitgevoerd.


Verder Terug Inhoud