Proces versus thread: geheugen, omschakeling en keuzecriteria vergeleken

Een proces is een draaiend programma met een eigen adresruimte en eigen resources. Een thread is een uitvoeringseenheid binnen een proces. Threads van hetzelfde proces delen geheugen, dus ze zijn goedkoop aan te maken en communiceren snel, maar één bug of crash kan het hele proces treffen. Afzonderlijke processen zijn van elkaar geïsoleerd en dus veiliger, maar het aanmaken en de communicatie tussen processen kosten meer.

KenmerkProcesThread
Wat het isEen draaiend programma met een eigen adresruimte en resources zoals bestandenEen uitvoeringsstroom binnen een proces. Heeft een eigen stack en registers
GeheugenAparte virtuele adresruimten. Geïsoleerd van andere processenDeelt de code, de heap en de globale data van het proces. Alleen de stack is eigen
AanmaakkostenHoog. Er moet een nieuwe adresruimte worden voorbereid (copy-on-write beperkt de kosten)Laag. Een nieuwe adresruimte is niet nodig
Context switchDuur. De adresruimte verandert en de translation cache (TLB) kan verloren gaanGoedkoop. Adresruimte en caches blijven behouden
CommunicatieInterprocescommunicatie zoals pipes, sockets of shared memory is nodigDirect lezen en schrijven in gedeeld geheugen, wat snel is
Isolatie en foutenEen crash blijft vaak beperkt tot dat procesDe crash van één thread kan het hele proces meeslepen
SynchronisatieNodig wanneer processen geheugen of bestanden delenAltijd nodig voor gedeelde data. Zonder mutexen of atomaire operaties ontstaan data races en deadlocks
SchedulingBevat een of meer threadsDe eenheid die het besturingssysteem daadwerkelijk aan CPU-cores toewijst
Belangrijkste toepassingenVoor isolatie en veiligheid. Browsertabbladen, services, shell-pipelinesParallelle verwerking binnen één programma. Servers met veel verbindingen, achtergrondtaken, parallelle berekeningen

De getalswaarden zijn typische ordegroottes en variëren per procesgeneratie en product.

Wanneer welke variant?

Proces
Wanneer isolatie, robuustheid en veiligheid gewenst zijn, of wanneer software van verschillende makers geen geheugen mag delen.
Thread
Wanneer taken snel data moeten delen en een programma meerdere CPU-cores moet benutten.
Let op
Dat threads geheugen delen is zowel een sterk punt als een gevaar. Bescherm gedeelde data met locks of atomaire operaties en let op deadlocks.

Veelgestelde vragen

Delen threads geheugen?

Ja. Threads van hetzelfde proces delen de code, de heap en de globale data van dat proces. Elke thread heeft alleen een eigen stack en eigen registers.

Waarom zijn threads goedkoper om aan te maken dan processen?

Een nieuw proces heeft een eigen adresruimte nodig, terwijl een thread de adresruimte van het proces gebruikt. Omschakelen tussen threads is ook goedkoper, omdat de adresruimte niet verandert.

Wat gebeurt er als één thread crasht?

Omdat threads geheugen delen, kan het hele proces worden meegesleurd. De crash van één proces heeft meestal geen gevolgen voor andere processen.

Wanneer moet je processen gebruiken in plaats van threads?

Wanneer isolatie en robuustheid gewenst zijn (browsertabbladen, onafhankelijke services), of wanneer componenten elkaars geheugen niet mogen beschadigen.

Test uw begrip

Welk voordeel van copy-on-write bij het kopiëren van een proces is juist?

  1. AHet gekopieerde en het oorspronkelijke proces kunnen de geschreven inhoud altijd delen
  2. BAlleen beschreven pagina's worden later gekopieerd, dus het is snel en bespaart geheugen
  3. CBij elke schrijfactie worden alle pagina's gekopieerd, waardoor de veiligheid van de gegevens toeneemt
Antwoord en toelichting tonen

Antwoord: B. Alleen beschreven pagina's worden later gekopieerd, dus het is snel en bespaart geheugen

Als bij het kopiëren van een proces onmiddellijk het hele geheugen wordt gekopieerd, kost dat tijd en geheugen, en als direct daarna een ander programma wordt geladen, is die kopie verspild. Bij copy-on-write verwijzen beide paginatabellen alleen-lezen naar dezelfde fysieke pagina's; zodra een van beide schrijft, treedt een paginafout op en kopieert het besturingssysteem alleen die pagina. Wat is geschreven wordt niet gedeeld en blijft voor elk proces apart. Er worden ook niet alle pagina's gekopieerd.

Wat moet bij een contextwisseling worden opgeslagen voor het proces waarvan wordt overgeschakeld?

  1. ADe inhoud van de schijfbestanden die het proces gebruikt
  2. BDe uitvoeringstoestand van de CPU, zoals registerwaarden en programmateller
  3. CDe volledige inhoud van het fysieke geheugen van het proces
Antwoord en toelichting tonen

Antwoord: B. De uitvoeringstoestand van de CPU, zoals registerwaarden en programmateller

Bij een contextwisseling worden de CPU-toestand zoals algemene registers, programmateller, stackpointer en werkingsmodus opgeslagen, zodat later vanuit dezelfde toestand kan worden hervat, en wordt de toestand van het volgende proces geladen. Bij het wisselen van proces wordt ook het register omgeschakeld dat de plaats van de paginatabel aangeeft. De inhoud van geheugen en bestanden blijft gewoon staan, dus die hoeft niet bij elke wisseling te worden opgeslagen.

Wat is de belangrijkste reden dat een contextwisseling in de praktijk soms een grotere prestatiedaling veroorzaakt dan de tijd die het opslaan en herstellen van registers kost?

  1. AOmdat bij elke wisseling de kloksnelheid van de CPU daalt
  2. BOmdat het programma bij elke wisseling opnieuw van schijf wordt ingelezen
  3. COmdat na de wisseling het aantal cache- en TLB-misses toeneemt
Antwoord en toelichting tonen

Antwoord: C. Omdat na de wisseling het aantal cache- en TLB-misses toeneemt

Het opslaan en herstellen van registers zelf kost weinig tijd, maar voor het proces waarnaar is overgeschakeld bevatten cache en TLB gegevens van het vorige proces, zodat misses doorgaan tot benodigde gegevens en vertalingen opnieuw zijn ingelezen. Bij CPU's zonder ASID moet bij het omschakelen van adresruimte ook de TLB worden geleegd. Deze indirecte kosten kunnen groter zijn dan de directe wisseltijd. De klok daalt niet en het programma wordt niet opnieuw van schijf gelezen.

  1. Welk voordeel is juist van het toevoegen van een ASID (address space identifier) aan elke TLB-ingang?
  2. Welke vergelijking van een mutex (slapende lock) en een spinlock is juist?
  3. Welk voorbeeld van een deadlock is juist?

Oefenvragen over Besturingssysteem en hardware

Belangrijke termen uitgelegd

Contextwissel (context switch)
Het omschakelen van het proces of de thread dat de CPU uitvoert. De toestand zoals registers en programmateller wordt opgeslagen en hersteld; bij een proceswissel wordt ook de adresruimte omgeschakeld.
Mutex
Lock die slechts door één thread tegelijk kan worden vastgehouden. Gangbare implementatie: een thread die de lock niet kan krijgen gaat slapen en geeft de CPU af, en het besturingssysteem wekt hem wanneer de lock vrijkomt.
Deadlock
Toestand waarin meerdere threads elk een resource vasthouden en wachten op resources van de andere threads, zodat niemand verder kan. Wordt voorkomen door een globale volgorde voor het nemen van locks af te spreken.

Verwante vergelijkingen