Nee jullie hebben allebei ongelijk...
Multitasken is gewoon een woordje voor 'meerdere taken tegelijk' en heeft in principe niks met cores of threads te maken. Op een computer kan je op allerlei manieren multitasken:
- Softwarematig, zoals co-operative CPU sharing via het OS + event-driven applicaties (Windows 3.11 stijl),
- Software + hardware zoals de preemptive multitasking waarbij de CPU hardware interrupts genereert waarna het OS besluit welke applicaties of threads te servicen en de CPU van context laat switchen (timeslicing dus, zoals op Win9x en later), of
- Hardwarematig zoals op multicore systemen waarbij threads of applicaties volledig onafhankelijk van elkaar draaien (I/O en synchronisatie even buiten beschouwing latend), op verschillende delen van de CPU.
Alleen het laatste is (natuurlijk) niet mogelijk op een single-core CPU. Onder DOS had je ook al applicaties waarmee je kon 'mutltitasken', zelfs op 8086 CPU's die niet eens hardware support hadden voor context switching etc. In principe zou je de manier van werken op een iPad, waar 1 applicatie tegelijk draait maar wel elke applicatie zijn state opslaat en restored plus het systeem van push notifications ook best 'multitasking' noemen, alleen praat je dan niet over wat de hardware doet maar hoe je het apparaat gebruikt (de illusie van multitasking dus).
Wat betreft de terminologie:
Multithreading:
Een applicatie voert meerdere dingen tegelijk uit door ze als onafhankelijk subtaken op te delen. Op een abstracte manier bekeken lopen de subtaken tegelijk, maar op een singlecore CPU voert er telkens maar 1 thread van 1 applicatie tegelijk instructies uit (zoals bij pre-emptive multitasking bijvoorbeeld). Doordat het OS zo eerlijk mogelijk alle threads en processen tijd op de CPU geeft lijkt het net alsof de taken echt tegelijk werken. Op een multicore CPU kunnen verschillende threads op verschillende cores draaien (maar dat hoeft niet), en op een multi-CPU systeem op verschillende CPU's (maar dat hoeft ook niet). Het OS beslist welke thread op welke core van welke CPU draait.
Multiprocessing:
Hetzelfde als multithreading maar dan op applicatie (proces) niveau, waarbij processen mogelijkerwijs per applicatie weer verdeeld zijn in meerdere threads. Dit is wezenlijk anders dan multithreaden, omdat verschillende threads van hetzelfde proces in dezelfde geheugenruimte lopen en dus elkaars geheugen kunnen benaderen, terwijl bij multiprocessing elk proces in zijn eigen geheugenruimte draait en dus helemaal onafhankelijk is van andere processen (wederom shared memory, I/O, etc buiten beschouwing latend).
Dus hoewel het inderdaad zo is dat je kan 'multitasken' op een single-core CPU, kan je ook gewoon multithreaden op een single-core CPU. Het kost iets meer werk en het OS moet het kunnen, maar dat geldt voor multithreaden op meerdere cores of meerdere CPU's net zo goed. Multithreading op een single-core CPU is al sinds de 386 grotendeels een hardware aangelegenheid, het OS hoeft (kort door de bocht) alleen maar te reageren op een hardware interrupt, kiezen wie er aan de beurt is, de stack van dat proces of die thread te restoren, en dan tegen de CPU te zeggen 'switch maar van context' en dan doet de CPU de rest. Zelfs op een multicore-CPU kan het prima dat meerdere threads op dezelfde core draaien (sterken nog, dat is heel vaak zo), en dan gebeurt er exact hetzelfde als op een single-core CPU.
[Reactie gewijzigd door johnbetonschaar op donderdag 28 januari 2010 20:49]
Een "proces" is niets meer dan de "state" van je CPU; dat wil zeggen: alle registers, inclusief de Instruction Pointer, alsmede alle interne vlaggen en de stack.
Om te switchen tussen processen, moet je CPU dus zijn volledige subset aan registers ergens in het geheugen opslaan, en de nieuwe set uit het geheugen lezen. Dit heet in CPU-land een "context-switch".
Het nadeel van een context-switch is dat deze relatief traag is, omdat de gehele state van de CPU in het werk-geheugen (RAM) moet worden opgeslagen en de nieuwe set daarna weer moet worden uitgelezen. Ook al lijkt RAM geheugen heel snel, voor een CPU duurt een memory-lookup/write een relatieve eeuwigheid.
Op een gegeven moment kwam een paar slimme informatici erachter dat bijna 80% van alle context-switches in de praktijk werden veroorzaakt door processen van dezelfde applicatie. Omdat deze processen vaak al in dezelfde geheugen-regionen werkzaam waren, en vaak moesten beschikken over dezelfde data, bleek het efficient om de process-scheduler in de OS-kernel een soort van 'light-weight' context-switch te laten maken, waarbij alleen de relevante registers werden gezet, en de CPU grotendeels in zijn huidige state kon blijven doordraaien. Processen die op deze manier "light-weight" tussen elkaar kunnen context-switchen worden 'threads' genoemd.
Zowel multitasking (proces-basis) als multithreading (thread-basis) zijn uiteindelijk dus software implementaties in de kernel (scheduler) van het OS.
Een CPU is zelf in principe dan ook niet 'multithreaded'. Wel kan een CPU meerdere cores (of hyperthreads) bevatten, waarop individuele processen en threads kunnen draaien. Maar een single-core processor heeft niet meer of minder ondersteuning in zijn instructieset voor multithreading dan een multi-core....alleen minder cores, dus; De kernel van het OS bepaalt vervolgens hoe efficient deze cores worden gebruikt door eventuele ondersteuning voor multithreading en multitasking.
[Reactie gewijzigd door tofus op vrijdag 29 januari 2010 00:34]