La multitasca apropiativa (en anglès, preemptive multitasking) és un model de planificació en el qual el sistema operatiu manté el control complet sobre el repartiment del temps de CPU entre les tasques actives. El planificador (scheduler) pot interrompre l'execució d'un procés en qualsevol moment, sense que aquest hi consenti, per cedir la CPU a una altra tasca en espera. Aquesta capacitat d'interrupció forçosa és el que distingeix aquest model de la multitasca cooperativa, on són els mateixos processos els que han de cedir el control voluntàriament.
Context històric Els primers sistemes amb multitasca apropiativa van aparèixer als anys seixanta amb Multics i sistemes mainframe d'IBM com l'OS/360. La família Unix va adoptar aquest model des dels seus inicis a la dècada del 1970, fet que va contribuir decisivament a la seva difusió en entorns acadèmics i de servidors. En el món dels ordinadors personals, Microsoft Windows va mantenir un model cooperatiu fins a la versió 3.x; la transició cap a la multitasca apropiativa va arribar amb Windows NT (1993) i Windows 95 (1995), tot i que aquest últim va conservar suport cooperatiu per a aplicacions de 16 bits per raons de compatibilitat.
Funcionament Un planificador apropiatiu assegura que totes les tasques preparades per executar-se tinguin l'oportunitat de fer-ho. Selecciona la primera tasca preparada d'una cua de processos i la posa en estat d'execució durant un temps determinat. Esgotat aquest temps, si la tasca no ha finalitzat, el planificador la desallotja de la CPU i la torna a enviar a la cua de tasques preparades. Aquest mecanisme garanteix que cap aplicació, ni tan sols una que entri en un bucle infinit, pugui monopolitzar el processador i deixar la resta del sistema bloquejat.
A canvi d'aquesta robustesa, el model imposa una càrrega important al programador. Com que una tasca pot ser desallotjada enmig d'una operació, com ara la modificació d'una estructura de dades compartida, el codi ha d'estar preparat per a aquestes interrupcions. Per evitar que dues tasques accedeixin simultàniament a un mateix recurs i el corrompin, cal utilitzar primitives de sincronització com mutexs, semàfors o seccions crítiques. Aquestes eines garanteixen l'exclusió mútua i són essencials per prevenir les anomenades condicions de cursa.
Canvi de context Perquè la multitasca apropiativa funcioni, el maquinari ha de proporcionar un mecanisme que permeti al sistema operatiu recuperar el control periòdicament. Aquest mecanisme és el temporitzador d'intervals programable, un component que envia interrupcions a la CPU a intervals regulars anomenats franges de temps o quants (time slices).
Quan es produeix una d'aquestes interrupcions, té lloc el següent procés: La CPU suspèn immediatament l'execució de la tasca actual. Es desa l'estat del procés (incloent els registres, el punter de pila i el comptador de programa) en una estructura del nucli anomenada Bloc de Control de Procés (PCB). El control passa al gestor d'interrupcions, que invoca el planificador per decidir quina tasca s'executarà a continuació.
Aquest procediment es coneix com a canvi de context (context switch) i té un cost mesurable en cicles de CPU, especialment si es produeix amb molta freqüència.
Algorismes de planificació El planificador pot utilitzar diversos algorismes per decidir l'ordre d'execució de les tasques. Els més habituals són:
Round Robin: assigna a cada procés un temps fix d'execució en una cua circular. És l'algorisme més simple i serveix de base per a molts altres. Cues multinivell amb retroalimentació (multilevel feedback queues): ajusten dinàmicament la prioritat dels processos, prioritzant els que fan operacions d'entrada/sortida (perquè cedeixen ràpidament la CPU) i penalitzant els que mantenen el processador ocupat amb càlculs intensius. Sistemes de temps real (RTOS): segueixen un esquema determinista basat en prioritats fixes, on una tasca de prioritat alta apropia immediatament el processador tan bon punt esdevé executable.
El nucli Linux utilitza el Completely Fair Scheduler (CFS) des de la versió 2.6.23, un algorisme dissenyat per garantir una distribució equitativa del temps de CPU entre processos amb diferents prioritats.
El planificador apropiatiu pot incorporar mecanismes per implementar un sistema de prioritats de tal forma que determinades tasques, com les rutines d'interrupció, tinguin preferència en l'execució.
Comparació amb la multitasca cooperativa La diferència fonamental entre tots dos models és qui decideix quan una tasca cedeix la CPU. En la multitasca apropiativa és el sistema operatiu qui pren la decisió mitjançant interrupcions de maquinari; en la multitasca cooperativa, són les pròpies tasques les que decideixen explícitament quan pausen-se.
Aspecte Multitasca apropiativa Multitasca cooperativa Qui cedeix la CPU El sistema operatiu La pròpia tasca Robustesa davant bucles infinits Alta Baixa Cost del canvi de context Elevat Reduït Necessitat de sincronització Alta (mutexs, semàfors) Baixa Predictibilitat del codi Baixa Alta Aprofitament multinucli Natural Requereix múltiples processos
Els sistemes operatius moderns de propòsit general utilitzen majoritàriament el model apropiatiu, mentre que el model cooperatiu ha ressorgit en entorns de programació asíncrona com asyncio o el bucle d'esdeveniments de JavaScript.
Vegeu també Multitasca cooperativa Multitasca
Referències
Categoria:Sistemes operatius Categoria:Programació