Unitat 5 · Sistemes Operatius (SO)
El sistemes informàtics estan formats per molts recursos que poden ser utilitzats per un o més processos a la vegada.
Imagineu 2 processos al mateix temps:
El sistema operatiu és l’encarregat de gestionar aquests recursos i garantir que no hi hagi conflictes entre els processos que els utilitzen. Per tant, poden concedir (temporalment) a un procés l’accés exclusiu a certs recursos.
Suposem que un procés (A) està creant un nou fitxer.
Aquesta és una manera de garantir que la informació del sistema de fitxers sigui precisa i consistent.
Suposem l’escenari on tenim dos processos (A i B): Els dos processos tenen la finalitat de grabar un document escanejat en una memòria USB montada a /mnt/USB.
Un interbloqueig és una situació en la qual dos o més processos queden bloquejats. Cada un d’ells espera que l’altre acabi la seva tasca per poder continuar. Aquesta situació pot ser causada per l’ús de recursos compartits.
Els interbloquejos poden produir-se en qualsevol sistema en què hi hagi recursos compartits.
Imagina 5 filòsofs asseguts al voltant d’una taula circular. On cada filòsof pensa i menja de manera cíclica. Si el filòsof vol menjar, necessita agafar els dos coberts que té al costat.

Això és equivalent a processos que necessiten dos recursos exclusius per continuar.
La distinció no depèn del recurs en si, sinó de com el sistema operatiu està implementat.
En alguns sistemes, quan un recurs no està disponible, el procés es bloqueja fins que el recurs torni a estar disponible. En altres sistemes, la petició pot fallar amb un codi d’error, transferint la responsabilitat al procés per gestionar la situació de petició fallida i intentar novament obtenir el recurs després d’un temps determinat.
Normalment, un procés utilitza un bucle de petició de recurs, dormir, nova petició de recurs, dormir, etc. Aquesta tècnica és coneguda com a polling. El procés no es bloqueja, però tampoc pot realitzar cap acció fins que el recurs estigui disponible.
La manera exacta de sol·licitar un recurs depèn en gran mesura del sistema. En alguns sistemes, es proporciona una crida de sistema de petició que permet als processos sol·licitar explícitament recursos. En altres, els únics recursos que el sistema operatiu coneix són fitxers especials que només un procés pot tenir oberts a la vegada. Aquests s’obtenen mitjançant la crida open. Si el fitxer ja està en ús, el procés queda bloquejat fins que l’actual propietari el tanca.
Les condicions perquè es produeixi un interbloqueig de recursos, com van ser presentades per Coffman et al. (1971), són les següents:
Si tots els recursos fossin compartibles simultàniament (no exclusius), cap procés hauria d’esperar: múltiples processos podrien usar el mateix recurs alhora i per tant no s’origina la situació d’un procés esperant indefinidament. Com que sí hi ha deadlock, existeixen recursos que només poden ser ocupats per un procés alhora.
En un deadlock hi ha processos que ja tenen alguns recursos i alhora estan esperant altres recursos. Si cap procés tingués recursos mentre esperava (és a dir, si primer haguessin de sol·licitar tots els recursos a l’inici), llavors no podria donar-se la situació en què un procés retenint recursos impedeix que un altre progressi. Perquè el conjunt \(D\) estigui bloquejat, cada procés \(P_i\) reté almenys un recurs i espera al menys un recurs addicional; així s’està complint mantenir i esperar.
Si els recursos poguessin ser forçosament recuperats (apropiació), el plan de recuperació podria prendre un recurs d’un procés bloquejat i donar-lo al que el necessita, trencant el deadlock. Perquè el deadlock persisteixi indefinidament, no es poden apropiar recursos de manera forçada; els recursos només s’alliberen voluntàriament pels processos. Per tant, la no apropiació ha de ser certa en la situació de deadlock.
Perquè hi hagi un deadlock, cal que hi hagi una dependència circular entre els processos bloquejats. Cada procés dins del conjunt bloquejat \(D\) espera un recurs que és posseït per un altre procés dins de \(D\). Seguint aquestes dependències, s’arriba de nou al primer procés, formant un cicle. Aquesta situació és coneguda com a espera circular. Sense aquest cicle, hi hauria algun procés que podria ser satisfet i desbloquejar la resta. Per tant, per a que hi hagi deadlock, la condició d’espera circular ha de ser certa.
Aquestes condicions estan relacionades amb una política que un sistema pot tenir o no. Pot assignar-se un recurs determinat a més d’un procés alhora? Pot un procés mantenir un recurs i sol·licitar-ne un altre? Poden els recursos ser apropiats? Poden existir esperes circulars?
Totes quatre condicions han de ser presents perquè es produeixi un bloqueig de recursos. Si n’hi ha una que està absent, no és possible un bloqueig de recursos.
Les 4 condicions són necessàries però no sempre suficients per a un interbloqueig.
Un graf d’assignació de recursos és un graf dirigit que representa les relacions entre els processos i els recursos en un sistema. Els nodes del graf representen els processos i els recursos, i les arestes del graf representen les peticions de recursos.



La manera més senzilla d’evitar els interbloquejos és l’algorisme de l’estruç: posar el cap sota la sorra i fingir que no hi ha cap problema.
Imagina un sistema operatiu que no detecta els interbloquejos. Si un interbloqueig es produeix una vegada cada 10 anys, el sistema operatiu no hauria de preocupar-se per aquest problema. Si un interbloqueig es produeix una vegada cada 10 minuts, el sistema operatiu hauria de prendre mesures per evitar-lo.
Si un procés obté el recurs d’un USB i un altre obra la impressora i després cada procés intenta obrir el recurs de l’altre i es bloqueja, tenim un interbloqueig. Pocs sistemes actuals detectaran això.
Spooling: Tècnica de gestió de recursos que consisteix en fer una cua de peticions de recursos. Aquesta tècnica es pot aplicar a qualsevol recurs, però és més comuna en els dispositius d’entrada/sortida.
Assumirem que hi ha un únic recurs de cada tipus. Això significa que només hi ha una instància de cada recurs. Per aquest sistemes, podem utilitzar un graf d’assignació de recursos per determinar si hi ha un interbloqueig. Si hi ha un cicle, existeix un interbloqueig, i qualsevol procés del cicle es troba involucrat. En canvi, si no existeix cap cicle, no hi ha interbloqueig.

Existeix un interbloqueig? Quins processos estan involucrats?
1 cicle → Interbloqueig. Els processos involucrats són: \(D\), \(E\), \(G\).
def detectar_cicle(NodeActual, LlistaArcs, L):
Afegir NodeActual al final de L
# Si el NodeActual ja era al camí → hem format un cicle
si L.count(NodeActual) > 1:
Imprimir "El graf conté un cicle: ", L
Finalitzar l'algorisme
# Obtenir arcs de sortida no marcats
ArcsNoMarcats = [arc per arc en LlistaArcs
si arc.origen == NodeActual i no arc.marcat]
si ArcsNoMarcats != []:
# Seleccionar un arc i baixar al node destí
arc = Seleccionar_Arc_Atzar(ArcsNoMarcats)
arc.marcat = True
NodeSeguent = arc.desti
detectar_cicle(NodeSeguent, LlistaArcs, L)
sinó:
# No hi ha més arcs: cal retrocedir
# Retirem el NodeActual del camí i tornem enrere
L.pop()
si L == []:
Imprimir "El subgraf explorat no conté cicles"
retornar
NodeAnterior = L[-1]
detectar_cicle(NodeAnterior, LlistaArcs, L)Assumeix que tenim un graf dirigit amb 4 nodes (A,B,C,D) i 4 arestes (A→B, B→C, C→D, D→A). Si començem amb el Node A com a node inicial:
Un graf d’espera es construeix a partir d’un graf d’assignació de recursos. Els nodes del graf d’espera són els processos, i les arestes són les peticions de recursos. Una aresta del graf d’espera indica que el procés que es troba a l’origen de l’aresta està esperant un recurs que té el procés que es troba al final de l’aresta.

Si el graf d’espera conté un cicle, hi ha un interbloqueig.
Si creem una matriu \(A\) de mida \(N \times N\) on \(N\) és el nombre de processos, i \(A_{ij}\) és el nombre d’arestes del graf d’espera que connecten el procés \(P_i\) amb el procés \(P_j\), podem utilitzar aquesta matriu per detectar interbloquejos.
Per fer-ho, inicialitzarem \(A\) a 0. Si existeix un arc del procés \(P_i\) al procés \(P_j\), incrementarem \(A_{ij}\) en 1. Multipliquem la matriu \(A\) per ella mateixa: \(A^k = A^{k-1} \times A\). Aquesta operació es pot realitzar de manera eficient utilitzant l’algorisme de Strassen. Si apareix un nombre diferent a 0 a la diagonal de la matriu \(A^k\), hi ha un interbloqueig.
\[ A = \begin{bmatrix} 0 & 1 & 0 \\ 0 & 0 & 1 \\ 1 & 1 & 0 \\ \end{bmatrix} \]
\[ A^2 = A \cdot A = \begin{bmatrix} 0 & 0 & 1 \\ 1 & 1 & 0 \\ 0 & 1 & 1 \\ \end{bmatrix} \]
P2 i P3 tenen un interbloqueig de longitud 2.
\[ A^3 = A \cdot A^2 = \begin{bmatrix} 1 & 1 & 0 \\ 0 & 1 & 1 \\ 1 & 1 & 1 \\ \end{bmatrix} \]
P1,P2 i P3 tenen un interbloqueig de longitud 3.
Assumirem:
Definirem:
Definirem la disponibilitat de recursos es pot calcular com \(A_j = E_j - \sum_{i=0}^{n}C_{ij}\).
Si \(R_{ij} > A_j\), el procés \(P_i\) no pot obtenir el recurs \(R_j\) i es bloqueja.

L’algorisme de detecció d’interbloquejos es basa en la comparació de vectors. Definirem la relació \(A \leq B\) en dos vectors \(A\) i \(B\) per indicar que cada element de \(A\) és menor o igual que el corresponent element de \(B\). Matemàticament, \(A \leq B\) es compleix si i només si \(A_i \leq B_i\) per a tots els valors de \(i\) entre 1 i \(m\) (\(1 \leq i \leq m\)).
Aquest algorisme assumeix un escenari de pitjor cas: tots els processos mantenen tots els recursos adquirits fins que surten.
\[ A = \begin{bmatrix} 2 & 1 & 0 & 0 \end{bmatrix} \]
\[ E = \begin{bmatrix} 4 & 2 & 3 & 1 \end{bmatrix} \]
\[ C = \begin{bmatrix} 0 & 0 & 1 & 0 \\ 2 & 0 & 0 & 1 \\ 0 & 1 & 2 & 0 \\ \end{bmatrix} \]
\[ R = \begin{bmatrix} 2 & 0 & 0 & 1 \\ 1 & 0 & 1 & 0 \\ 2 & 1 & 0 & 0 \\ \end{bmatrix} \]
\[ A = \begin{bmatrix} 2 & 1 & 0 & 0 \end{bmatrix} \]
\[ E = \begin{bmatrix} 4 & 2 & 3 & 1 \end{bmatrix} \]
\[ C = \begin{bmatrix} 0 & 0 & 1 & 0 \\ 2 & 0 & 0 & 1 \\ 0 & 1 & 2 & 0 \\ \end{bmatrix} \]
\[ R = \begin{bmatrix} 2 & 0 & 0 & 1 \\ 1 & 0 & 1 & 0 \\ 2 & 1 & 0 & 0 \\ \end{bmatrix} \]
Amb aquests recursos alliberats, podem satisfer les sol·licituds de \(P1\) i \(P2\). Per tant no hi ha interbloqueig. Si \(P3\) hagués sol·licitat 1 instacia de \(R4\) llavors no es podria satisfer cap sol·licitud i tindríem un interbloqueig.
Ara que sabem com detectar interbloquejos, assumint que coneixem amb antelació la sol·licitud de recursos (estàtic), la pregunta és quan hauríem de buscar-los.
Una possibilitat és comprovar-ho cada vegada que es fa una sol·licitud de recursos. Això assegura detectar-los tan aviat com sigui possible, però pot ser potencialment costos en termes de temps de CPU. → Sobrecàrrega del sistema.
Una estratègia alternativa és comprovar-ho cada k minuts, o quan la utilització de la CPU hagi baixat per sota d’un cert llindar \(\theta\). → Pot ser que no es detectin interbloquejos immediatament, si existeixen cicles diferents, pot ser difícil determinar quin procés està involucrat en cada cicle.
La raó per considerar la utilització de la CPU és que si suficients processos estan interbloquejats, hi haurà pocs processos executables, i la CPU sovint estarà inactiva.
Suposeu que un sistema operatiu detecta un interbloqueig. Què hauria de fer el sistema operatiu? Hi ha dues possibilitats:
La recuperació amb apropiació de recursos és una tècnica que permet prendre temporalment un recurs d’un procés, permetre que un altre procés el faci servir i després tornar-lo al procés original sense que aquest se’n adoni. No obstant això, aquesta capacitat de recuperació depèn en gran mesura de la naturalesa específica del recurs.
Metàfora: Imaginem que tenim una impressora compartida entre diversos usuaris. Un usuari està realitzant una gran tasca d’impressió, mentre que un altre usuari necessita imprimir un document urgent. El sistema operatiu pot prendre temporalment la impressora del primer usuari i donar-la al segon usuari. Quan el segon usuari acabi d’imprimir, el sistema operatiu pot tornar la impressora al primer usuari.
A la realitat la impressora no es pot apropiar d’un usuari a un altre sense que l’usuari original se n’adoni.
La recuperació per rollback es basa en l’ús de checkpoints.
Quan es detecta un interbloqueig, s’observen els recursos necessaris i es selecciona un procés que els tingui assignats. A continuació, es realitza un rollback d’aquest procés a un punt anterior en el temps, abans que adquirís els recursos. Això allibera els recursos i permet que altres processos els utilitzin.
Es perden totes les instruccions executades des del checkpoint, ja que el procés es reinicia a un estat anterior.
La manera més simple de recuperar-se d’un interbloqueig és finalitzar un procés. Això alliberarà els recursos que el procés té assignats i permetrà que altres processos continuïn. De forma dràstica, es pot finalitzar tots els processos que estan involucrats en el cicle d’interbloqueig.
En aquesta selecció es pot tenir en compte la prioritat dels processos, el temps que porten en execució, el nombre de recursos que tenen assignats, etc.
La evitació dels interbloquejos es basa en dos algorismes. L’agorisme del banquer proposat per Dijkstra i l’algorisme de seguretat proposat per Coffman.
L’algorisme del banquer és un algorisme d’evitació d’interbloquejos que es basa en la idea de prevenir-los. Aquest algorisme es basa en el fet que si un sistema es troba en un estat segur, no es produirà un interbloqueig.
\[ \begin{bmatrix} & Assignat & Max \\ A & 0 & 6 \\ B & 0 & 5 \\ C & 0 & 4 \\ D & 0 & 7 \\ \end{bmatrix} \]
Si hi ha diponibles 10 recursos. Estat segur, tots poden finalitzar amb èxit.
\[ \begin{bmatrix} & Assignat & Max \\ A & 1 & 6 \\ B & 1 & 5 \\ C & 2 & 4 \\ D & 4 & 7 \\ \end{bmatrix} \]
Si hi ha diponibles 2 recursos. Estat segur, C primer i després la resta.
\[ \begin{bmatrix} & Assignat & Max \\ A & 1 & 6 \\ B & 2 & 5 \\ C & 2 & 4 \\ D & 4 & 7 \\ \end{bmatrix} \]
Si hi ha diponibles 1 recurs. Estat insegur, ningú pot acabar.
L’algorisme del banquer es pot generalitzar per a sistemes amb múltiples recursos de cada tipus. En aquest cas, el sistema operatiu ha de mantenir una matriu \(A\) de mida \(M \times N\) on \(M\) és el nombre de recursos i \(N\) és el nombre de processos. Els elements de la matriu \(A_{ij}\) indiquen el nombre d’instàncies del recurs \(R_i\) que el procés \(P_j\) té assignades.
procedure banquer(M: integer, N: integer, C: matrix, R: matrix)
// M: nombre de recursos, N: nombre de processos, C: matriu d'estat actual del sistema (disponibilitat dels recursos)
// R: matriu de màxims requerits pels processos
finish: array of boolean of length N // indica si un procés ha finalitzat
work: array of integer of length M // matriu que representa els recursos disponibles
for i := 1 to M do
work[i] := C[0, i] // inicialitzar work amb la disponibilitat actual de recursos
for i := 1 to N do
finish[i] := false // inicialitzar tots els processos com a no finalitzats
repeat
found := false // indica si s'ha trobat un procés adequat en aquesta iteració
for i := 1 to N do
if not finish[i] and all(R[i, j] <= work[j] for j := 1 to M) then
// El procés i no ha finalitzat i la seva demanda és menor o igual als recursos disponibles
for j := 1 to M do
work[j] := work[j] + C[i, j] // alliberar els recursos del procés i
finish[i] := true // marcar el procés com a finalitzat
found := true // indicar que s'ha trobat un procés en aquesta iteració
break
until not found
// Comprovar si tots els processos s'han finalitzat
if all(finish[i] for i := 1 to N) then print("L'estat és segur")
else print("L'estat és insegur")
end procedure\[ Disponible = \begin{bmatrix} R1 & R2 & R3 \\ 3 & 3 & 2 \\ \end{bmatrix} \]
\[ Max = \begin{bmatrix} & R1 & R2 & R3 \\ P1 & 7 & 5 & 3 \\ P2 & 3 & 2 & 2 \\ P3 & 9 & 0 & 2 \\ P4 & 2 & 2 & 2 \\ P5 & 4 & 3 & 3 \\ \end{bmatrix} \]
P1 sol·licita una instància de \(R1\) i dos de \(R3\). Es concediran?
\[ Necessito = \begin{bmatrix} & R1 & R2 & R3 \\ P1 & 7 & 4 & 3 \\ P2 & 0 & 2 & 0 \\ P3 & 6 & 0 & 0 \\ P4 & 0 & 1 & 1 \\ P5 & 4 & 3 & 1 \\ \end{bmatrix} \]
\[ Assignat = \begin{bmatrix} & R1 & R2 & R3 \\ P1 & 0 & 1 & 0 \\ P2 & 3 & 0 & 2 \\ P3 & 3 & 0 & 2 \\ P4 & 2 & 1 & 1 \\ P5 & 0 & 0 & 2 \\ \end{bmatrix} \]
P1 sol·licita 1 instància de R1 i 2 instàncies de R3.
P1 obté els recursos.
\[ D = \begin{bmatrix} R1 & R2 & R3 \\ 2 & 3 & 0 \\ \end{bmatrix} \]
\[ N = \begin{bmatrix} & R1 & R2 & R3 \\ P1 & 6 & 4 & 1 \\ P2 & 0 & 2 & 0 \\ P3 & 6 & 0 & 0 \\ P4 & 0 & 1 & 1 \\ P5 & 4 & 3 & 1 \\ \end{bmatrix} \]
\[ A = \begin{bmatrix} & R1 & R2 & R3 \\ P1 & 1 & 1 & 2 \\ P2 & 3 & 0 & 2 \\ P3 & 3 & 0 & 2 \\ P4 & 2 & 1 & 1 \\ P5 & 0 & 0 & 2 \\ \end{bmatrix} \]
\[ D = \begin{bmatrix} R1 & R2 & R3 \\ 2 & 3 & 0 \\ \end{bmatrix} \]
\[ N = \begin{bmatrix} & R1 & R2 & R3 \\ P1 & 6 & 4 & 1 \\ P2 & 0 & 2 & 0 \\ P3 & 6 & 0 & 0 \\ P4 & 0 & 1 & 1 \\ P5 & 4 & 3 & 1 \\ \end{bmatrix} \]
\[ A = \begin{bmatrix} & R1 & R2 & R3 \\ P1 & 1 & 1 & 2 \\ P2 & 3 & 0 & 2 \\ P3 & 3 & 0 & 2 \\ P4 & 2 & 1 & 1 \\ P5 & 0 & 0 & 2 \\ \end{bmatrix} \]
\[ D = \begin{bmatrix} R1 & R2 & R3 \\ 2 & 3 & 0 \\ \end{bmatrix} \]
\[ N = \begin{bmatrix} & R1 & R2 & R3 \\ P1 & 6 & 4 & 1 \\ P2 & 0 & 2 & 0 \\ P3 & 6 & 0 & 0 \\ P4 & 0 & 1 & 1 \\ P5 & 4 & 3 & 1 \\ \end{bmatrix} \]
\[ A = \begin{bmatrix} & R1 & R2 & R3 \\ P1 & 1 & 1 & 2 \\ P2 & 3 & 0 & 2 \\ P3 & 3 & 0 & 2 \\ P4 & 2 & 1 & 1 \\ P5 & 0 & 0 & 2 \\ \end{bmatrix} \]
\[ D = \begin{bmatrix} R1 & R2 & R3 \\ 2 & 3 & 0 \\ \end{bmatrix} \]
\[ N = \begin{bmatrix} & R1 & R2 & R3 \\ P1 & 6 & 4 & 1 \\ P2 & 0 & 2 & 0 \\ P3 & 6 & 0 & 0 \\ P4 & 0 & 1 & 1 \\ P5 & 4 & 3 & 1 \\ \end{bmatrix} \]
\[ A = \begin{bmatrix} & R1 & R2 & R3 \\ P1 & 1 & 1 & 2 \\ P2 & 3 & 0 & 2 \\ P3 & 3 & 0 & 2 \\ P4 & 2 & 1 & 1 \\ P5 & 0 & 0 & 2 \\ \end{bmatrix} \]
\[ D = \begin{bmatrix} R1 & R2 & R3 \\ 2 & 3 & 0 \\ \end{bmatrix} \]
\[ N = \begin{bmatrix} & R1 & R2 & R3 \\ P1 & 6 & 4 & 1 \\ P2 & 0 & 2 & 0 \\ P3 & 6 & 0 & 0 \\ P4 & 0 & 1 & 1 \\ P5 & 4 & 3 & 1 \\ \end{bmatrix} \]
\[ A = \begin{bmatrix} & R1 & R2 & R3 \\ P1 & 1 & 1 & 2 \\ P2 & 3 & 0 & 2 \\ P3 & 3 & 0 & 2 \\ P4 & 2 & 1 & 1 \\ P5 & 0 & 0 & 2 \\ \end{bmatrix} \]
La sol·licitud de recursos de P1 (1 instància de R1 i 2 instàncies de R3) pot ser concedida, ja que l’estat resultant és segur.
En la mateixa situació inicial anterior, P1 sol·licita 1 instàncies de R1, 2 instàncies de R2 i 2 instàncies de R3. Es concediran?
\[ N = \begin{bmatrix} & R1 & R2 & R3 \\ P1 & 6 & 4 & 1 \\ P2 & 0 & 2 & 0 \\ P3 & 6 & 0 & 0 \\ P4 & 0 & 1 & 1 \\ P5 & 4 & 3 & 1 \\ \end{bmatrix} \]
No es pot concedir la sol·licitud de P1, ja que l’estat resultant és insegur.
Evitar els interbloquejos en sistemes reals és molt difícil. → Complexitat en predir apriori les necessitats de recursos dels processos.
Ignora el problema: No fer res. → Últim recurs quan no hi ha altres opcions disponible.
Detecció i recuperació: Detectar interbloquejos i prendre mesures per recuperar-se d’ells. (solució preferida quan hi ha mecanismes adients de detecció i recuperació disponibles).
Els sistemes reals eviten interbloquejos quan no poden prevenir-los globalment.
Protocol WAIT-DIE (esperar-morir): Assigna a cada transacció un timestamp d’arribada. Si una transacció demana un recurs bloquejat:
Protocol WOUND-WAIT (ferida-espera): Al revés:
Tots dos protocols trenquen l’ESPERA CIRCULAR sense necessitat d’analitzar cicles.
Timestamp Ordering (TO): En lloc de bloquejar recursos, s’ordenen totes les operacions per timestamps.
Multiversió Concurrency Control (MVCC): Manté múltiples versions de les dades.
En sistemes operatius generalistes com Linux, Windows o Android, no s’utilitzen algorismes d’evitació com l’algorisme del banquer.
Aquests SO gestionen centenars o milers de processos amb patrons de consum de recursos imprevisibles, cosa que fa que els mètodes basats en demandes màximes conegudes siguin inviables.
Per què NO s’utilitza el banquer?
A Linux, els interbloquejos d’espai d’usuari acostumen a ser causats per competició sobre fitxers, sockets o mutexos en aplicacions, mentre que al kernel normalment provenen de spinlocks i ordres incorrectes d’adquisició de locks.
lsof, fuser, ps, timeouts, hung task detector a Linux).(No els eliminen, però els fan molt poc freqüents.)
No els eliminen, però els fan molt poc freqüents.
La AMD Ryzen Threadripper PRO 7985WX fa servir el subsistema CPPC (Collaborative Processor Performance Control) per coordinar amb el firmware (UEFI) quina freqüència o estat de rendiment ha de tenir la CPU. Un kthread del kernel de Linux és l’encarregat de llegir i actualitzar aquesta informació de manera contínua.
Un servidor de còmput quedava bloquejat cada cert temps, sense missatges d’error aparents, i només es podia recuperar amb un reinici manual. A efectes pràctics: un deadlock.
El kthread responsable del CPPC quedava atrapat en un estat d’espera o en un bucle infinit perquè el firmware proporcionava taules CPPC incompletes o inconsistents. En quedar bloquejat aquest fil del kernel, la gestió de freqüències i altres subsistemes quedaven afectats fins paralitzar el sistema.
Personalitzar i adaptar els parametres CPPC i de la CPU al firmware específic de la placa base, evitant així les condicions que provocaven el bloqueig del kthread.

Unitat 5 · Sistemes Operatius (SO) 🏠