Preemció és el mecanisme pel qual un sistema operatiu pot interrompre temporalment l'execució d'un procés o fil d'execució per assignar el processador a una altra tasca. Aquesta interrupció pot produir-se perquè ha arribat una tasca amb més prioritat, perquè s'ha esgotat la franja de temps assignada o perquè un esdeveniment del sistema requereix una nova decisió de planificació.

La preemció és un mecanisme central en la multitasca apropiativa, ja que permet que el nucli del sistema operatiu recuperi el control del processador sense dependre que la tasca activa el cedeixi voluntàriament.

Funcionament El planificador de processos d'un sistema operatiu amb preemció, manté una cua amb totes les tasques pendents ordenades segons les seves prioritats. Les tasques més prioritàries s'afegeixen als llocs preferents de la cua per ser executades abans. No obstant, si durant l'execució d'una d'aquestes tasques el planificador detecta que una de més prioritària està preparada per executar-se, llavors es produeix una interrupció que desallotja la tasca actual (tot guardant-ne l'estat per poder resumir-la més endavant) i es passa a executar la nova tasca que ha generat la interrupció, un cop finalitzada es continuaran executant o resumint les tasques pendents segons la cua de processos, sempre que no es produeixin noves interrupcions.

Relació amb la multitasca apropiativa La multitasca apropiativa és una aplicació concreta de la preemció en la planificació de processos i fils. Mentre que la preemció descriu el mecanisme general d'interrompre una tasca en execució, la multitasca apropiativa descriu el model en què el sistema operatiu utilitza aquest mecanisme per repartir el temps de CPU entre diverses tasques actives.

En sistemes d'un sol nucli, aquesta alternança ràpida no implica execució paral·lela real, sinó execució seqüencial per torns. La percepció de simultaneïtat es produeix perquè el planificador canvia de tasca amb prou freqüència perquè diverses aplicacions semblin avançar alhora. En sistemes amb diversos nuclis, aquesta alternança es pot combinar amb l'execució realment paral·lela de diferents processos o fils.

Diferència amb sistemes no-preemtius Els sistemes preemptius permeten que el planificador retiri el processador a una tasca abans que aquesta acabi. Això pot passar per criteris de prioritat, per esgotament del quantum de temps o per altres polítiques de planificació.

En canvi, en sistemes no preemptius, una tasca continua executant-se fins que acaba, queda bloquejada o cedeix voluntàriament el control. Aquest model és més simple, però pot reduir la capacitat de resposta si una tasca triga massa a retornar el control al sistema.

Multitasca preemptiva La multitasca preemptiva és el model de multitasca en què el sistema operatiu pot interrompre una tasca en execució sense que aquesta hagi de cedir voluntàriament el control del processador. En aquest model, el planificador decideix quina tasca s'ha d'executar en cada moment segons criteris com la prioritat, l'estat dels processos, la disponibilitat de recursos o el temps de processador ja consumit per cada tasca.

Aquest mecanisme es diferencia de la multitasca cooperativa, en què les tasques han de retornar el control al sistema de manera explícita. En un sistema cooperatiu, si una aplicació no cedeix el processador, pot reduir la capacitat de resposta del sistema o impedir temporalment que altres tasques s'executin. En canvi, en un sistema preemptiu, el nucli pot recuperar el control encara que la tasca activa no ho sol·liciti. Això permet repartir el temps de processador entre diversos processos o fils d'execució i redueix el risc que una única tasca monopolitzi la CPU.

La multitasca preemptiva és especialment important en sistemes interactius, en què el sistema ha de continuar responent a les accions de l'usuari mentre altres processos s'executen en segon pla. També és rellevant en servidors i sistemes amb moltes peticions simultànies, ja que permet alternar ràpidament entre diferents processos o fils i mantenir una distribució més equilibrada dels recursos.

Canvi de context Quan el planificador decideix interrompre una tasca i executar-ne una altra, el sistema operatiu ha de conservar la informació necessària per reprendre posteriorment la tasca interrompuda. Aquest procés s'anomena canvi de context. El context pot incloure, entre altres elements, el valor dels registres del processador, el comptador de programa, l'estat de la pila i altra informació associada al procés o fil d'execució.

El canvi de context és essencial perquè la preempció sigui transparent per a les tasques. Des del punt de vista d'un procés, l'execució simplement continua a partir del punt on havia estat interrompuda, encara que entremig el processador hagi executat altres tasques. Aquesta capacitat permet simular l'execució simultània de múltiples processos en sistemes amb un sol processador, i coordinar millor el treball en sistemes multiprocessador.

Tot i això, el canvi de context té un cost. Guardar i restaurar l'estat d'execució consumeix temps de processador i pot afectar el rendiment si es produeix amb massa freqüència. Per aquest motiu, els sistemes operatius han d'equilibrar la capacitat de resposta amb l'eficiència global del sistema. Una freqüència elevada de canvis de context pot millorar la sensació de fluïdesa, però també pot incrementar la sobrecàrrega interna del sistema.

Quantum de temps En molts sistemes preemptius, cada procés o fil rep una fracció limitada de temps de processador, anomenada quantum de temps o franja de temps. Quan aquesta franja s'esgota, una interrupció de temporitzador permet al nucli recuperar el control i executar de nou el planificador. Aleshores el sistema pot decidir si la mateixa tasca continua executant-se o si cal donar pas a una altra tasca preparada.

La durada del quantum és un paràmetre important en el comportament del sistema. Si és massa curt, el sistema pot dedicar una part excessiva del temps a fer canvis de context en lloc d'executar treball útil. Si és massa llarg, una tasca pot mantenir el processador durant massa temps i reduir la capacitat de resposta percebuda per l'usuari. Per això, la tria del quantum ha de buscar un equilibri entre rendiment, justícia en el repartiment del processador i rapidesa de resposta.

Aquest concepte és especialment visible en sistemes de temps compartit, on diversos processos competeixen pel mateix processador. Encara que només una tasca s'executi físicament en cada nucli en un instant concret, l'alternança ràpida entre tasques crea la impressió que diverses aplicacions avancen alhora. En sistemes amb diversos nuclis, aquesta alternança es combina amb l'execució realment paral·lela de diferents fils o processos.

Mode d'usuari i mode nucli La preempció també es pot analitzar segons el nivell de privilegi en què s'executa el codi. Els sistemes operatius moderns solen distingir entre mode d'usuari i mode nucli. En mode d'usuari s'executen les aplicacions ordinàries, amb permisos limitats. En mode nucli s'executa el codi central del sistema operatiu, que té accés a recursos crítics com la memòria, els dispositius d'entrada i sortida i les estructures internes de planificació.

Interrompre una tasca mentre s'executa en mode d'usuari és una operació habitual en un sistema preemptiu. En canvi, interrompre codi que s'està executant en mode nucli pot ser més delicat, perquè el nucli pot estar modificant dades compartides o gestionant recursos essencials. Si una interrupció es produeix en un moment inadequat, es poden generar problemes de concurrència, condicions de cursa o inconsistències en l'estat intern del sistema.

Per aquest motiu, alguns sistemes operatius limiten la preempció dins de determinades parts del nucli. Altres sistemes utilitzen un nucli preemptiu, dissenyat perquè fins i tot el codi del nucli pugui ser interromput en certes condicions. Aquest enfocament pot reduir la latència i millorar la resposta davant esdeveniments urgents, però també obliga a utilitzar mecanismes de sincronització més acurats.

En un nucli preemptiu, les seccions crítiques han d'estar protegides mitjançant mecanismes com bloquejos, semàfors o altres formes de sincronització. Aquests mecanismes impedeixen que dues tasques accedeixin simultàniament a una mateixa estructura compartida quan això podria deixar el sistema en un estat inconsistent. Així, la preempció millora la flexibilitat i la capacitat de resposta, però requereix una gestió més complexa de la concurrència.

Relació amb els fils d'execució La preempció no només s'aplica als processos, sinó també als fils d'execució o threads. Un procés pot contenir diversos fils que comparteixen el mateix espai d'adreces però executen fluxos d'instruccions diferents. El planificador pot interrompre un fil i donar pas a un altre, fins i tot si tots dos pertanyen al mateix procés.

Aquesta característica permet que una aplicació mantingui diverses activitats en curs. Per exemple, un programa pot conservar una interfície d'usuari activa mentre un altre fil realitza càlculs, accedeix a fitxers o espera dades de xarxa. La preempció facilita que aquests fils avancin de manera alternada sense que un d'ells bloquegi completament la resta de l'aplicació.

Tanmateix, l'ús de fils preemptius també introdueix riscos de sincronització. Com que un fil pot ser interromput en gairebé qualsevol moment, cal protegir adequadament les dades compartides. Si dos fils modifiquen simultàniament una mateixa variable o estructura sense coordinació, el resultat pot ser incorrecte o imprevisible. Per això, la programació concurrent en entorns preemptius requereix mecanismes de control d'accés i una gestió rigorosa de les seccions crítiques.

Avantatges, riscos i limitacions La preempció presenta diversos avantatges relacionats amb la gestió eficient dels recursos del sistema. Un dels més importants és la millora de la capacitat de resposta, sobretot en sistemes interactius on múltiples aplicacions s'executen de forma simultània. Aquest mecanisme evita que una única tasca monopolitzi el processador durant períodes prolongats de temps i facilita una distribució més equilibrada del temps d'execució entre processos.

Aquest model és àmpliament utilitzat en sistemes operatius moderns i entorns multitarea, ja que permet gestionar múltiples processos de manera eficient i millorar l'aprofitament dels recursos disponibles. A més, facilita l'execució de diferents serveis i aplicacions sense que una única tasca bloquegi la resta del sistema.

Els sistemes preemptius també poden prioritzar determinats processos en funció de la seva importància o urgència. Aquesta característica és especialment important en sistemes en temps real, on certes tasques necessiten una resposta ràpida per garantir el correcte funcionament del sistema.

Tot i això, la preempció també incrementa la complexitat interna del sistema operatiu. Cada canvi de context entre processos implica guardar i restaurar informació relacionada amb l'estat d'execució dels processos, fet que introdueix una certa sobrecàrrega i pot afectar el rendiment en determinades situacions.

En alguns casos, la preempció també pot provocar problemes de sincronització quan diversos processos comparteixen recursos comuns. Per aquest motiu, molts sistemes operatius utilitzen mecanismes addicionals, com semàfors o mutexos, per controlar l'accés als recursos compartits i evitar conflictes entre processos.

Un altre risc associat a la preempció és la inanició, que es pot produir quan les tasques de baixa prioritat reben poc o cap temps de processador perquè altres tasques més prioritàries ocupen repetidament la CPU. Per evitar-ho, alguns planificadors incorporen mecanismes d'envelliment de prioritats o altres polítiques d'equitat.

Aplicacions