När du ska använda multitasking

Det finns två sätt att implementera multitasking: som en enda process med flera trådar eller som flera processer, var och en med en eller flera trådar. Ett program kan placera varje tråd som kräver ett privat adressutrymme och privata resurser i sin egen process för att skydda den från andra processtrådars aktiviteter.

En flertrådad process kan hantera ömsesidigt uteslutande uppgifter med trådar, till exempel att tillhandahålla ett användargränssnitt och utföra bakgrundsberäkningar. Att skapa en flertrådad process kan också vara ett bekvämt sätt att strukturera ett program som utför flera liknande eller identiska uppgifter samtidigt. En namngiven pipe-server kan till exempel skapa en tråd för varje klientprocess som ansluter till röret. Den här tråden hanterar kommunikationen mellan servern och klienten. Processen kan använda flera trådar för att utföra följande uppgifter:

  • Hantera indata för flera fönster.
  • Hantera indata från flera kommunikationsenheter.
  • Särskilja uppgifter med varierande prioritet. En tråd med hög prioritet hanterar till exempel tidskritiska uppgifter och en tråd med låg prioritet utför andra uppgifter.
  • Tillåt att användargränssnittet förblir responsivt och samtidigt allokera tid till bakgrundsaktiviteter.

Det är vanligtvis mer effektivt för ett program att implementera multitasking genom att skapa en enda, flertrådad process i stället för att skapa flera processer av följande skäl:

  • Systemet kan utföra en kontextväxling snabbare för trådar än processer, eftersom en process har mer omkostnader än en tråd gör (processkontexten är större än trådkontexten).
  • Alla trådar i en process delar samma adressutrymme och har åtkomst till processens globala variabler, vilket kan förenkla kommunikationen mellan trådar.
  • Alla trådar i en process kan dela öppna referenser till resurser, till exempel filer och rör.

Det finns andra tekniker som du kan använda i stället för multitrådning. De viktigaste av dessa är följande: asynkrona indata och utdata (I/O), I/O-slutförandeportar, asynkrona proceduranrop (APC) och möjligheten att vänta på flera händelser.

En enda tråd kan initiera flera tidskrävande I/O-begäranden som kan köras samtidigt med asynkron I/O. Asynkron I/O kan utföras på filer, rör och seriell kommunikationsenheter. Mer information finns i synkronisering och överlappande indata och utdata.

En enskild tråd kan blockera sin egen körning medan den väntar på att någon eller alla av flera händelser ska inträffa. Detta är effektivare än att använda flera trådar, var och en väntar på en enskild händelse och effektivare än att använda en enda tråd som förbrukar processortid genom att kontinuerligt söka efter händelser som ska inträffa. Mer information finns i Wait Functions.