Vam tancar la lliçó anterior amb una pregunta oberta: hi ha deu processos en estat R i quatre nuclis, a quin se li dona la CPU i durant quant de temps? Aquesta decisió es pren a meteo-01 uns quants milers de vegades per segon, i d'ella depèn que una consulta a meteo-api respongui en 8 ms o en 400 ms, que l'ingestor no perdi lectures i que l'agregador acabi les seves mitjanes horàries abans de l'hora següent.
En aquesta lliçó entendràs per què cal planificar, quins criteris entren en conflicte (perquè no es poden optimitzar tots alhora), com funcionen els algorismes clàssics —calculant-los tu mateix sobre paper, que és l'única manera d'entendre'ls de debò— i què fa realment el planificador de Linux quan executes renice. En acabar sabràs decidir amb criteri quina prioritat mereix cada procés de Meteora i per què.
Contingut
- Per què cal planificar: el cicle de ràfegues
- Processos limitats per CPU i per E/S
- Els tres planificadors i el despatxador
- Criteris d'avaluació i els seus compromisos
- Planificació apropiativa davant de cooperativa
- FCFS: primer a arribar, primer a servir-se
- SJF i SRTF: la feina més curta primer
- Planificació per prioritats, inanició i envelliment
- Round Robin i l'efecte del quantum
- Cues multinivell i cues amb realimentació
- El planificador real de Linux: CFS, EEVDF i
nice - Polítiques de temps real:
SCHED_FIFO,SCHED_RR,SCHED_DEADLINE - Multiprocessador: afinitat i balanceig de càrrega
Per què cal planificar: el cicle de ràfegues
Cap procés no fa servir la CPU de manera contínua. Si observes el que fa l'ingestor, hi veuràs un patró que es repeteix:
espera dades ── calcula ── escriu ── espera dades ── calcula ── escriu ── (E/S) (CPU) (E/S) (E/S) (CPU) (E/S) 40 ms 0,3 ms 0,8 ms 40 ms 0,3 ms 0,8 ms
Cada tram de càlcul és una ràfega de CPU i cada espera és una ràfega d'E/S. Tot procés alterna entre totes dues fins que acaba. Aquesta observació, que sembla trivial, és la base de tota la planificació:
- Si un procés només fes servir la CPU, n'hi hauria prou d'executar-lo fins al final. No caldria planificar res.
- Com que es bloqueja constantment esperant E/S, deixa la CPU lliure, i seria un malbaratament no donar-la a un altre mentrestant.
La distribució de les ràfegues de CPU en sistemes reals és molt característica: moltíssimes ràfegues curtes i poquíssimes de llargues. En una càrrega típica, el 70-80 % de les ràfegues dura menys de 8 ms. Això té una conseqüència enorme que veurem en parlar de Round Robin: si tries bé el quantum, la majoria de processos acaben la seva ràfega abans d'exhaurir-lo i es bloquegen sols, sense que calgui apropiar-los la CPU.
Processos limitats per CPU i per E/S
Els processos es classifiquen segons quin tipus de ràfega hi domina:
| Limitat per E/S (I/O-bound) | Limitat per CPU (CPU-bound) | |
|---|---|---|
| Ràfegues de CPU | Moltes i molt curtes | Poques i llargues |
| Temps dominant | Esperant dispositius | Calculant |
| Exemple a Meteora | ingestor, meteo-api |
agregador |
| Canvis de context | Molts de voluntaris | Molts d'involuntaris |
| Què necessita | Baixa latència de resposta | Molt temps de CPU seguit |
| Si se'l retarda | Es perden dades o la resposta triga | Només acaba més tard |
Aquesta classificació no és acadèmica: és la que dicta la decisió operativa. Tornem a les dades reals que vam veure a 02-01:
$ for p in 1842 1877 1901; do
echo -n "PID $p: "
grep -E 'ctxt_switches' /proc/$p/status | tr '\n' ' '
echo
done
PID 1842: voluntary_ctxt_switches: 94013 nonvoluntary_ctxt_switches: 118
PID 1877: voluntary_ctxt_switches: 18422 nonvoluntary_ctxt_switches: 291
PID 1901: voluntary_ctxt_switches: 210884 nonvoluntary_ctxt_switches: 44La lectura és directa:
ingestor(1842): 94.013 bloquejos voluntaris davant de 118 apropiacions. Ràtio de 796 a 1. Fortament limitat per E/S: gairebé sempre està esperant paquets de les estacions.meteo-api(1901): ràtio de 4.792 a 1. Encara més extrem. Espera peticions HTTP.agregador(1877): ràtio de 63 a 1. Continua havent-hi E/S (llegeix fitxers de/var/lib/meteora/lectures/), però passa molt més temps calculant.
Un bon planificador afavoreix els processos limitats per E/S. Pot sonar contraintuïtiu —per què prioritzar el que menys CPU fa servir?—, però la lògica és sòlida: si dones la CPU a l'ingestor tan bon punt arriben dades, la fa servir 0,3 ms i es torna a bloquejar, alliberant-la gairebé de seguida. El cost d'atendre'l aviat és mínim i el benefici és que el dispositiu de xarxa torna a estar ocupat. Si en canvi dones la CPU a l'agregador, la reté mil·lisegons sencers mentre l'ingestor acumula lectures sense processar i les memòries intermèdies de xarxa s'omplen.
La regla general: prioritzar el que és curt manté tots els recursos ocupats en paral·lel.
Els tres planificadors i el despatxador
Un sistema operatiu complet no pren una sola decisió de planificació, sinó tres, en escales de temps molt diferents:
| Planificador | Què decideix | Freqüència | El té Linux? |
|---|---|---|---|
| Llarg termini (admissió) | Quines feines entren al sistema | Segons o minuts | No com a tal |
| Mitjà termini (intercanvi) | Quins processos s'expulsen a swap | Segons | Sí, lligat a memòria |
| Curt termini (CPU) | Quin procés preparat passa a la CPU | Mil·lisegons | Sí, és el planificador |
- El de llarg termini ve dels sistemes per lots dels anys 60 (els vam veure a 01-02): amb memòria escassíssima, calia decidir quantes feines admetre simultàniament. En un Linux modern no existeix: qualsevol pot llançar un procés fins a exhaurir recursos. El més semblant són els límits de cgroups (mòdul 6) i els sistemes de cues tipus Slurm en supercomputació.
- El de mitjà termini sí que existeix: quan falta memòria, el nucli expulsa pàgines de processos inactius a swap. Ho veurem a Memòria Virtual i Paginació.
- El de curt termini és del qual parla aquesta lliçó. Actua cada pocs mil·lisegons, i per això el seu propi codi ha de ser extremadament ràpid: si trigués 1 ms a decidir, es menjaria el 25 % d'un quantum de 4 ms.
El despatxador (dispatcher) és el component que executa la decisió: fa el canvi de context que vam estudiar a 02-01, canvia a mode usuari i salta a la instrucció on el procés escollit s'havia quedat. El seu temps de feina s'anomena latència de despatx, i a Linux és de l'ordre d'1-3 µs.
stateDiagram-v2
direction LR
[*] --> CuaPreparats: procés nou
CuaPreparats --> CPU: el planificador de curt termini tria
CPU --> CuaPreparats: fi de quantum
CPU --> CuaEspera: petició d'E/S
CuaEspera --> CuaPreparats: E/S completada
CuaPreparats --> Suspes: planificador de mitjà termini (swap out)
Suspes --> CuaPreparats: swap in
CPU --> [*]: exit()
Criteris d'avaluació i els seus compromisos
Per comparar algorismes calen mètriques. Aquestes són les cinc clàssiques:
| Criteri | Definició | Es vol | Interessa sobretot a |
|---|---|---|---|
| Ús de CPU | % de temps que la CPU no està ociosa | Maximitzar | L'administrador |
| Productivitat (throughput) | Processos completats per unitat de temps | Maximitzar | Sistemes per lots |
| Temps de retorn (turnaround) | Des que arriba fins que acaba | Minimitzar | L'usuari final |
| Temps d'espera | Temps total a la cua de preparats | Minimitzar | Mètrica per comparar algorismes |
| Temps de resposta | Des que arriba fins a la primera reacció | Minimitzar | Sistemes interactius |
Les relacions entre ells:
Temps de retorn = Temps d'espera + Temps de CPU + Temps d'E/S Temps d'espera = Temps de retorn − Temps de servei
El temps d'espera és la mètrica que es fa servir per comparar algorismes perquè és l'única part en què el planificador pot influir: el temps de CPU i el d'E/S els fixa la feina mateixa, no la planificació.
I aquí hi ha l'important: aquests criteris es contradiuen entre si. No existeix cap algorisme que els optimitzi tots.
| Conflicte | Explicació |
|---|---|
| Productivitat ↔ Temps de resposta | Canviar de procés sovint millora la resposta però gasta CPU en canvis de context |
| Temps mitjà ↔ Variància | Un algorisme pot donar bona mitjana i ser terrible per a alguns processos concrets |
| Justícia ↔ Eficiència | Repartir per igual perjudica qui més ho necessita |
| Prioritat ↔ Inanició | Afavorir-ne uns en condemna d'altres |
A Meteora això és una decisió de negoci, no tècnica: si optimitzes la productivitat total, l'agregador acabarà abans però meteo-api respondrà amb pics de latència. Si optimitzes el temps de resposta, l'API va fina i l'agregador triga més a tancar l'hora. Cal triar, i triar requereix saber què fa més mal si falla.
Planificació apropiativa davant de cooperativa
Ja vam introduir totes dues a 01-03. Ara podem precisar quan pot actuar el planificador. Hi ha quatre moments:
- El procés passa d'Executant a Bloquejat (demana E/S).
- El procés passa d'Executant a Preparat (s'exhaureix el quantum, arriba una interrupció).
- El procés passa de Bloquejat a Preparat (acaba la seva E/S).
- El procés acaba.
Si el planificador només actua en els casos 1 i 4 —quan el procés amolla la CPU per voluntat pròpia—, és cooperatiu (o no apropiatiu). Si també actua en el 2 i el 3, és apropiatiu.
| Cooperativa | Apropiativa | |
|---|---|---|
| Qui amolla la CPU | El procés mateix | El nucli li la pot treure |
| Requereix maquinari | Res d'especial | Temporitzador programable |
| Un bucle infinit | Penja el sistema | No afecta els altres |
| Cost | Mínim | Canvis de context freqüents |
| Dades compartides | Segures per construcció | Necessiten sincronització |
| Sistemes | Windows 3.1, Mac OS 9, corutines | Tots els SO moderns |
L'apropiació és el que fa possible que a meteo-01 un agregador amb un bucle mal escrit no bloquegi tota la màquina. El preu que s'ha de pagar és que les dades compartides entre processos poden quedar en estats inconsistents si se'ls interromp a mitges, i aquest preu és exactament el que estudiarem al mòdul 3.
FCFS: primer a arribar, primer a servir-se
El més simple: una cua FIFO. El primer que arriba és el primer que s'executa, i fins que no acaba la seva ràfega no n'entra un altre. És no apropiatiu.
Treballem amb aquest conjunt de processos, que reutilitzarem en tots els algorismes:
| Procés | Arribada | Ràfega de CPU |
|---|---|---|
P1 (agregador) |
0 | 24 ms |
P2 (ingestor) |
1 | 3 ms |
P3 (meteo-api) |
2 | 3 ms |
Diagrama de Gantt amb FCFS:
Càlcul pas a pas:
| Procés | Arribada | Inici | Fi | Retorn (Fi−Arribada) | Espera (Retorn−Ràfega) |
|---|---|---|---|---|---|
| P1 | 0 | 0 | 24 | 24 | 0 |
| P2 | 1 | 24 | 27 | 26 | 23 |
| P3 | 2 | 27 | 30 | 28 | 25 |
Temps mitjà d'espera = (0 + 23 + 25) / 3 = 16,00 ms Temps mitjà de retorn = (24 + 26 + 28) / 3 = 26,00 ms
Ara invertim l'ordre d'arribada: que arribin primer P2 i P3, i P1 al final.
| Procés | Espera |
|---|---|
| P2 | 0 |
| P3 | 2 |
| P1 | 4 |
De 16 ms a 2 ms sense canviar l'algorisme, només l'ordre d'arribada. Aquesta sensibilitat extrema és el gran defecte de FCFS.
L'efecte comboi
El fenomen té nom: efecte comboi. Un procés llarg limitat per CPU ocupa el processador, i al darrere s'hi acumula una filera de processos curts limitats per E/S que només necessitarien uns microsegons. Mentre esperen, els dispositius d'E/S estan ociosos, perquè els processos que els farien servir són a la cua.
En termes de Meteora: si l'agregador arrenca el seu càlcul horari de 24 ms i al darrere s'hi posen a la cua 40 peticions a meteo-api de 0,5 ms cadascuna, l'última espera 24 ms per fer una feina de mig mil·lisegon. I durant aquests 24 ms, la targeta de xarxa no té res per enviar.
La imatge mental és exacta: un camió lent en una carretera d'un sol carril amb 40 cotxes al darrere.
SJF i SRTF: la feina més curta primer
Si el problema és que els llargs bloquegen els curts, la solució òbvia és executar primer el més curt. Això és SJF (Shortest Job First).
Amb els nostres processos i suposant que tots han arribat en t=0:
Mitjana d'espera: 2,00 ms. I això no és casualitat:
SJF és demostrablement òptim: cap algorisme no pot donar un temps mitjà d'espera menor per a un conjunt donat de processos.
La intuïció de la demostració: si un procés llarg va abans que un de curt, intercanviar-los redueix molt l'espera del curt i augmenta poc la del llarg. Repetint l'intercanvi s'arriba a l'ordre ascendent.
SRTF: la versió apropiativa
SRTF (Shortest Remaining Time First) hi afegeix apropiació: si arriba un procés la ràfega del qual és menor que el que li queda a l'actual, se li treu la CPU.
Un exemple amb arribades esglaonades:
| Procés | Arribada | Ràfega |
|---|---|---|
| A | 0 | 8 |
| B | 1 | 4 |
| C | 2 | 9 |
| D | 3 | 5 |
Simulació instant a instant:
- t=0: només A. Executa A (li'n queden 8).
- t=1: arriba B amb 4 < 7 restants d'A. Apropiació: entra B.
- t=2: arriba C amb 9 > 3 restants de B. Continua B.
- t=3: arriba D amb 5 > 2 restants de B. Continua B.
- t=5: B acaba. Candidats: A (7), C (9), D (5). Entra D.
- t=10: D acaba. Candidats: A (7), C (9). Entra A.
- t=17: A acaba. Entra C.
- t=26: C acaba.
| Procés | Arribada | Fi | Retorn | Ràfega | Espera |
|---|---|---|---|---|---|
| A | 0 | 17 | 17 | 8 | 9 |
| B | 1 | 5 | 4 | 4 | 0 |
| C | 2 | 26 | 24 | 9 | 15 |
| D | 3 | 10 | 7 | 5 | 2 |
Comparat amb FCFS sobre el mateix conjunt (que donaria 7,75 ms) és millor, i SRTF és òptim entre els apropiatius.
El problema insalvable de SJF
Requereix conèixer la durada de la ràfega següent, que és el futur. No hi ha manera de saber-la.
La solució pràctica és estimar-la a partir de l'historial, amb una mitjana exponencial:
on t(n) és la durada real de l'última ràfega, τ(n) l'estimació anterior i α un pes entre 0 i 1 (típicament 0,5).
Exemple numèric amb α = 0,5 i estimació inicial τ = 10:
Ràfega real t |
Càlcul | Nova estimació τ |
|---|---|---|
| 6 | 0,5·6 + 0,5·10 | 8,0 |
| 4 | 0,5·4 + 0,5·8 | 6,0 |
| 6 | 0,5·6 + 0,5·6 | 6,0 |
| 4 | 0,5·4 + 0,5·6 | 5,0 |
| 13 | 0,5·13 + 0,5·5 | 9,0 |
Observa el comportament: l'estimació convergeix suaument i reacciona davant del canvi brusc de l'última ràfega sense disparar-se del tot. Amb α = 1 només comptaria l'última ràfega (molt reactiu, molt inestable); amb α = 0 no canviaria mai.
Segon problema de SJF: inanició. Un procés llarg pot no executar-se mai si no paren d'arribar processos curts. En un sistema amb meteo-api rebent peticions constants, l'agregador podria no arrencar mai.
Planificació per prioritats, inanició i envelliment
S'assigna un número de prioritat a cada procés i es tria el de prioritat més alta. SJF és en realitat un cas particular: la prioritat és la inversa de la durada de la ràfega.
Amb aquest conjunt (menor número = major prioritat, convenció habitual):
| Procés | Ràfega | Prioritat |
|---|---|---|
| P1 | 10 | 3 |
| P2 | 1 | 1 |
| P3 | 2 | 4 |
| P4 | 1 | 5 |
| P5 | 5 | 2 |
| Procés | Espera |
|---|---|
| P2 | 0 |
| P5 | 1 |
| P1 | 6 |
| P3 | 16 |
| P4 | 18 |
Les prioritats es poden assignar per criteris interns (mida de memòria, ràtio d'E/S, temps consumit) o externs (importància de l'usuari, diners pagats, criticitat del servei).
Inanició i envelliment
El problema és el mateix que a SJF: un procés de prioritat baixa pot esperar indefinidament. L'anècdota clàssica —potser apòcrifa, però molt il·lustrativa— explica que en apagar l'IBM 7094 de l'MIT el 1973 hi van trobar una feina de prioritat baixa enviada el 1967 que mai no va arribar a executar-se.
La solució és l'envelliment (aging): incrementar gradualment la prioritat dels processos que fa molt de temps que esperen.
Prioritat inicial de l'agregador: 15 (baixa) Regla: +1 de prioritat per cada segon esperant t=0 s: prioritat 15 — no s'executa t=5 s: prioritat 10 — continua sense executar-se t=10 s: prioritat 5 — comença a competir t=14 s: prioritat 1 — s'executa segur
Amb aquesta regla, cap procés no espera més de 14 segons per molt baixa que sigui la seva prioritat. L'envelliment converteix una garantia impossible ("tots s'executen") en una d'acotada ("ningú no espera més de X"), que és la mena de garantia amb què sí que es pot treballar.
Round Robin i l'efecte del quantum
Round Robin és FCFS amb apropiació per temps: cada procés rep un quantum fix; si no acaba, torna al final de la cua.
Amb els nostres tres processos originals (P1=24, P2=3, P3=3) i quantum = 4 ms:
| Procés | Fi | Retorn | Ràfega | Espera |
|---|---|---|---|---|
| P1 | 30 | 30 | 24 | 6 |
| P2 | 7 | 6 | 3 | 3 |
| P3 | 10 | 8 | 3 | 5 |
Pitjor que SJF (2,00 ms), però moltíssim millor que FCFS (16,00 ms). I, sobretot, amb una propietat que els altres no tenen: el temps de resposta està acotat. Amb n processos i quantum q, cap no espera més de (n−1)·q per al seu primer torn. Amb 10 processos i q=4 ms, la pitjor espera és de 36 ms. Això és una garantia útil per a un sistema interactiu.
L'efecte del quantum
Triar q és un compromís directe:
| Quantum | Comportament | Sobrecost de canvis | S'assembla a |
|---|---|---|---|
| Molt gran (∞) | Cada procés corre fins a bloquejar-se | Nul | FCFS |
| Gran (100 ms) | Resposta lenta | Baix | FCFS suavitzat |
| Mitjà (4-10 ms) | Equilibrat | Acceptable | Round Robin útil |
| Petit (1 ms) | Molt reactiu | Notable | — |
| Minúscul (10 µs) | La CPU es dedica a canviar de procés | Ruïnós | Res d'útil |
Amb el cost de canvi de context de 5 µs que vam calcular a 02-01:
| Quantum | Sobrecost | Feina útil |
|---|---|---|
| 100 µs | 5/105 = 4,8 % | 95,2 % |
| 1 ms | 5/1005 = 0,50 % | 99,5 % |
| 4 ms | 5/4005 = 0,12 % | 99,88 % |
| 100 ms | 5/100005 = 0,005 % | 99,995 % |
La regla pràctica: el quantum ha de ser prou gran perquè el 80 % de les ràfegues de CPU acabin dins seu. Com que la majoria de ràfegues duren menys de 8 ms, un quantum d'aquesta magnitud aconsegueix que la majoria de processos es bloquegin sols i que l'apropiació sigui l'excepció, no la norma.
Un matís important: el temps de retorn no millora monòtonament en reduir el quantum. Pot empitjorar, perquè un procés que necessitaria 7 ms seguits amb q=7 acaba d'una tirada, i amb q=2 necessita quatre torns repartits.
Cues multinivell i cues amb realimentació
Els algorismes anteriors tracten tots els processos igual. A la realitat no ho són: un procés interactiu i un procés per lots necessiten polítiques diferents.
A les cues multinivell, la cua de preparats es divideix en diverses cues, cadascuna amb el seu propi algorisme:
Prioritat 0 (màxima) │ Processos de sistema │ Round Robin q=1ms Prioritat 1 │ Processos interactius │ Round Robin q=4ms Prioritat 2 │ Processos d'edició │ Round Robin q=8ms Prioritat 3 (mínima) │ Processos per lots │ FCFS
Entre cues es planifica normalment per prioritat absoluta: no s'executa res de la cua 2 si hi ha alguna cosa a la 0 o a la 1. Això és ràpid però causa inanició. L'alternativa és repartir percentatges de CPU: 60 % a la cua 0, 25 % a la 1, 10 % a la 2 i 5 % a la 3.
El problema de les cues multinivell pures: un procés queda fixat a la seva cua per sempre, i la seva naturalesa pot canviar. L'agregador és limitat per CPU mentre calcula, però limitat per E/S mentre llegeix fitxers.
Les cues multinivell amb realimentació (multilevel feedback queue) resolen això permetent que els processos pugin i baixin de cua segons el seu comportament observat:
flowchart TD
N[Procés nou] --> Q0
Q0["Cua 0 — RR, quantum 8 ms"] -->|exhaureix el quantum| Q1
Q0 -->|es bloqueja per E/S| B0[Surt a espera]
Q1["Cua 1 — RR, quantum 16 ms"] -->|exhaureix el quantum| Q2
Q1 -->|es bloqueja per E/S| B1[Surt a espera i puja a Cua 0]
Q2["Cua 2 — FCFS"] -->|envelliment| Q1
B0 --> Q0
B1 --> Q0
La lògica és elegant:
- Tot procés comença a dalt, amb la màxima prioritat i el quantum més curt.
- Si exhaureix el seu quantum sense bloquejar-se, és senyal que està limitat per CPU: baixa una cua, on tindrà menys prioritat però un quantum més llarg (que és el que li convé).
- Si es bloqueja per E/S abans d'exhaurir-lo, és interactiu: es manté o puja.
- L'envelliment puja els processos que fa molt que esperen a baix, evitant la inanició.
Aquest esquema dedueix del comportament el que no pot saber per endavant: aproxima SJF sense necessitat d'endevinar el futur. Va ser el disseny dels planificadors dels UNIX tradicionals, de Windows NT i del planificador O(1) de Linux fins al 2007.
El planificador real de Linux: CFS, EEVDF i nice
Linux va abandonar l'enfocament de cues amb realimentació a la versió 2.6.23 (2007) pel CFS (Completely Fair Scheduler), i des de la 6.6 (2023) per EEVDF (Earliest Eligible Virtual Deadline First), que refina la mateixa idea.
El punt de partida del CFS és diferent i molt potent: en lloc de quàntums fixos i cues, modela quanta CPU li correspondria a cada procés en una màquina ideal i corregeix la desviació.
- Si hi ha n processos executables, cadascun hauria de tenir 1/n de la CPU.
- CFS porta el compte del temps virtual d'execució (
vruntime) de cada procés: el temps de CPU que ha consumit, ponderat per la seva prioritat. - Sempre tria el procés amb el
vruntimemés baix, és a dir, el que va més endarrerit respecte a la seva part justa. - Els processos s'emmagatzemen en un arbre roig-negre ordenat per
vruntime, així que triar el següent és agafar el node de més a l'esquerra: O(1) a la pràctica, O(log n) en inserir.
La conseqüència bonica: un procés que es bloqueja per E/S no acumula vruntime mentre espera, així que quan es desperta té el vruntime més baix de tots i s'executa immediatament. Els processos interactius obtenen bona resposta sense cap heurística especial: surt de franc del model.
nice i la ponderació
El valor nice va de −20 (màxima prioritat) a +19 (mínima), amb 0 per defecte. El nom ve de "com d'amable ets amb els altres": un nice alt significa que cedeixes el pas.
A CFS, nice no dona torns extra: modifica el ritme al qual avança el vruntime.
Cada unitat de nice canvia el pes en un factor d'aproximadament 1,25, cosa que es tradueix en una regla molt fàcil de recordar:
Cada punt de
nicecanvia la quota de CPU al voltant d'un 10 %.
nice |
Pes intern | Quota amb un altre procés a nice 0 |
|---|---|---|
| −20 | 88.761 | 98,8 % |
| −10 | 9.548 | 90,3 % |
| −5 | 3.121 | 75,3 % |
| 0 | 1.024 | 50 % |
| +5 | 335 | 24,7 % |
| +10 | 110 | 9,7 % |
| +19 | 15 | 1,4 % |
Aplicat a Meteora:
$ ps -eo pid,ni,pri,comm -u meteora
PID NI PRI COMMAND
1842 -5 24 ingestor
1877 5 14 agregador
1901 0 19 meteo-api
$ sudo renice -n 10 -p 1877
1877 (ID de procés) prioritat antiga 5, prioritat nova 10
$ nice -n 15 /opt/meteora/bin/reproces-historic --desde 2026-01-01Què fa cada ordre:
renice -n 10 -p 1877rebaixa l'agregadoranice10. Ara, competint ambmeteo-api(nice 0), rebrà aproximadament un 9,7 % de la CPU quan tots dos vulguin executar-se. Quanmeteo-apiestigui bloquejat esperant peticions —que és gairebé sempre—, l'agregadorfarà servir el 100 %. Aquesta és la clau que molta gent no capta:niceno limita el consum, només decideix qui cedeix en cas de conflicte. Per limitar de debò calen cgroups (06-02).nice -n 15 ...llança el reprocessament històric amb prioritat mínima. És l'ordre correcta per a feines pesades que no han de molestar: consumirà tota la CPU sobrant i s'apartarà a l'instant tan bon punt arribi una petició.- Abaixar el
nice(valors negatius) requereix privilegis de root, perquè altrament qualsevol usuari podria monopolitzar el sistema.
Un avís important sobre nice que gairebé sempre agafa desprevingut: només afecta la CPU. Si l'agregador satura el disc llegint /var/lib/meteora/lectures/, renice no arreglarà res. Per a això existeix ionice, que veurem a Gestió d'Emmagatzematge.
Polítiques de temps real: SCHED_FIFO, SCHED_RR, SCHED_DEADLINE
Linux implementa diverses polítiques de planificació que conviuen. nice només s'aplica a la primera:
| Política | Tipus | Prioritat | Comportament |
|---|---|---|---|
SCHED_OTHER |
Normal | nice −20..+19 |
CFS/EEVDF, repartiment just |
SCHED_BATCH |
Normal | nice |
Com OTHER però s'assumeix no interactiu |
SCHED_IDLE |
Normal | Mínima absoluta | Només amb CPU totalment ociosa |
SCHED_FIFO |
Temps real | 1..99 | Executa fins a bloquejar-se o cedir. Sense quantum |
SCHED_RR |
Temps real | 1..99 | Com FIFO però amb quantum entre iguals |
SCHED_DEADLINE |
Temps real | Per damunt de tot | Es declaren termini, període i temps de còmput |
Regla d'or: qualsevol procés de temps real desplaça tots els normals. Un SCHED_FIFO de prioritat 1 s'executa abans que un SCHED_OTHER de nice −20.
$ chrt -p 1842 pid 1842's current scheduling policy: SCHED_OTHER pid 1842's current scheduling priority: 0 $ sudo chrt -f -p 10 1842 $ chrt -p 1842 pid 1842's current scheduling policy: SCHED_FIFO pid 1842's current scheduling priority: 10
Amb això l'ingestor passa a SCHED_FIFO amb prioritat 10: tan bon punt tingui un paquet per processar, desplaça agregador i meteo-api immediatament.
És bona idea? Amb matisos. SCHED_FIFO és adequat aquí perquè l'ingestor està limitat per E/S: fa servir la CPU 0,3 ms i es bloqueja. Però comporta un perill real: un SCHED_FIFO que entri en un bucle infinit bloqueja el seu nucli per complet, i no podràs ni obrir un intèrpret d'ordres per matar-lo. Linux es protegeix parcialment amb:
Els processos de temps real poden fer servir com a màxim 950.000 µs de cada 1.000.000 µs, és a dir el 95 %. El 5 % restant queda reservat perquè el sistema continuï sent administrable. És una xarxa de seguretat dissenyada exactament per a l'escenari del bucle infinit.
SCHED_DEADLINE és més modern i més segur: en lloc d'una prioritat, declares "necessito 2 ms de còmput cada 10 ms, amb termini als 8 ms" i el nucli rebutja la petició si no ho pot garantir. El detall d'aquestes garanties correspon a Sistemes Operatius Mòbils i de Temps Real.
Multiprocessador: afinitat i balanceig de càrrega
meteo-01 té 4 nuclis, així que en realitat cal decidir quin procés i en quin nucli.
Linux manté una cua d'execució per nucli, no una de global. És una decisió deliberada: una cua global necessitaria un forrellat compartit per tots els nuclis, i aquest forrellat es convertiria en el coll d'ampolla del sistema amb 64 o 128 nuclis.
Dos conceptes governen el repartiment:
Afinitat de processador. Quan un procés fa una estona que és al nucli 2, les memòries cau L1 i L2 d'aquest nucli són plenes de les seves dades. Migrar-lo al nucli 3 significa començar en fred: centenars de fallades de memòria cau a ~100 ns cadascuna. Per això el planificador prefereix mantenir cada procés on era (afinitat tova), i només el migra quan el desequilibri ho justifica.
L'afinitat dura es fixa a mà:
$ taskset -cp 1877 pid 1877's current affinity list: 0-3 $ sudo taskset -cp 2,3 1877 pid 1877's new affinity list: 2,3 $ sudo taskset -c 0,1 /opt/meteora/bin/ingestor --puerto 9010
Amb això has particionat la màquina: l'agregador només pot fer servir els nuclis 2 i 3, i l'ingestor el 0 i l'1. Ni tan sols competeixen. És una tècnica vàlida quan coneixes bé la càrrega, i es fa servir molt en sistemes de baixa latència, però té un cost: si l'ingestor està ociós, els seus dos nuclis es malbaraten perquè l'agregador no els pot tocar. L'afinitat dura canvia flexibilitat per previsibilitat.
Balanceig de càrrega. Periòdicament, el nucli comprova si unes cues estan molt més carregades que d'altres i migra processos. Ho fa tenint en compte la topologia: migrar entre dos nuclis que comparteixen memòria cau L3 és barat; migrar entre dos sòcols NUMA diferents és car, perquè a més de la memòria cau freda, el procés quedaria accedint a memòria d'un altre sòcol.
$ nproc 4 $ mpstat -P ALL 1 1 CPU %usr %nice %sys %iowait %idle all 23,1 4,2 6,3 1,8 64,6 0 31,2 0,0 8,1 3,0 57,7 1 28,9 0,0 7,2 2,1 61,8 2 16,4 16,8 4,9 0,9 61,0 3 15,9 0,0 5,0 1,2 77,9
Interpretació: la columna %nice mesura el temps consumit per processos amb nice positiu. Aquest 16,8 % al nucli 2 és exactament l'agregador amb el seu nice 10, i confirma que l'afinitat està fent el que li demanem. El %iowait baix indica que el disc no és el coll d'ampolla avui.
Errors Habituals i Consells
Creure que nice limita el consum de CPU. No ho fa. Un procés amb nice 19 farà servir el 100 % de la CPU si ningú més no la vol. nice només decideix qui cedeix en cas de conflicte. Per posar-hi un sostre real necessites cgroups (CPUQuota a systemd), tema de 06-02.
Posar processos en SCHED_FIFO "per si de cas". És la manera més ràpida de deixar una màquina inaccessible. Només té sentit per a processos que es bloquegen amb freqüència i de manera demostrada. I abans de fer-ho, prova amb nice -20: gairebé sempre n'hi ha prou.
Confondre la prioritat PRI amb NI. NI és el que tu demanes; PRI és el que el nucli calcula a partir d'això. A més, ps mostra PRI amb una escala invertida respecte a la interna del nucli, cosa que despista molt. Per saber què passa, mira NI i la política (chrt -p).
Aplicar el diagrama de Gantt de l'examen a la realitat. Els exercicis assumeixen una ràfega per procés i cap E/S. A la realitat cada procés alterna desenes de ràfegues, entren i surten processos nous i hi ha diversos nuclis. Els càlculs serveixen per entendre els algorismes, no per predir temps reals.
Buscar l'algorisme òptim. No existeix. SJF minimitza l'espera mitjana però causa inanició i necessita endevinar el futur. Round Robin acota la resposta però empitjora la mitjana. La pregunta correcta mai no és "quin és millor", sinó "què em fa més mal si va malament: la latència de meteo-api o el retard de l'agregador".
Oblidar que un procés bloquejat no competeix. És l'error de raonament més freqüent en analitzar càrrega real. Si meteo-api està el 99 % del temps esperant peticions, donar-li nice -10 gairebé no canvia res, perquè quan vol CPU normalment està lliure.
Consell pràctic: abans de tocar prioritats, comprova que la CPU és de debò el problema. Mira %iowait a mpstat i la columna b de vmstat: si hi ha processos bloquejats i %iowait alt, el coll d'ampolla és el disc i cap prioritat de CPU no ho arreglarà.
Exercicis
Exercici 1: comparar quatre algorismes numèricament
A meteo-01 arriben aquestes quatre feines:
| Procés | Arribada | Ràfega (ms) |
|---|---|---|
P1 (agregador) |
0 | 10 |
P2 (meteo-api) |
1 | 2 |
P3 (ingestor) |
2 | 4 |
P4 (neteja) |
3 | 6 |
Calcula el diagrama de Gantt i el temps mitjà d'espera per a: (a) FCFS, (b) SJF no apropiatiu, (c) SRTF, (d) Round Robin amb quantum 3 ms. Després indica quin algorisme triaries per a Meteora i per què.
Exercici 2: decidir prioritats reals
A meteo-01 (4 nuclis) tens aquesta situació durant el pic de les 8:00, quan les estacions envien la seva ràfega matinal:
ingestor: rep 800 lectures/segon. Si la seva memòria intermèdia de socket s'omple, es perden lectures irrecuperablement.meteo-api: 40 peticions/segon, amb un objectiu de servei de 200 ms al percentil 99.agregador: calcula les mitjanes de l'hora anterior. Ha d'acabar abans de les 9:00.backup-diari: comprimeix/var/lib/meteora/lectures/cap a un altre servidor. Triga 25 minuts i no té termini estricte.
Decideix política i prioritat per a cadascun, escriu les ordres concretes i justifica cada decisió. Indica també quin risc introdueix la teva configuració.
Exercici 3: calcular l'impacte del quantum
Un sistema té 12 processos executables. El cost del canvi de context és de 6 µs. El 75 % de les ràfegues de CPU dura menys de 5 ms.
- Calcula el sobrecost percentual i el temps màxim de resposta amb quantum de 500 µs, 5 ms i 50 ms.
- Quin triaries per a un servidor on
meteo-apiha de respondre per sota de 200 ms? - Si la màquina passés a tenir 200 processos executables, canviaria la teva resposta?
Solucions
Solució 1
(a) FCFS — per ordre d'arribada: P1, P2, P3, P4.
| Procés | Arribada | Inici | Fi | Espera (Inici−Arribada) |
|---|---|---|---|---|
| P1 | 0 | 0 | 10 | 0 |
| P2 | 1 | 10 | 12 | 9 |
| P3 | 2 | 12 | 16 | 10 |
| P4 | 3 | 16 | 22 | 13 |
(b) SJF no apropiatiu — en triar, s'agafa el més curt dels que ja han arribat.
- t=0: només P1. Executa P1 fins a t=10 (no apropiatiu).
- t=10: han arribat P2 (2), P3 (4), P4 (6). El més curt és P2 → fins a t=12.
- t=12: P3 (4) davant de P4 (6). Entra P3 → fins a t=16.
- t=16: P4 → fins a t=22.
Coincideix amb FCFS per casualitat, perquè P1 va acaparar el començament:
Aquest resultat és instructiu: SJF no apropiatiu no ajuda si la feina llarga arriba primer. El seu avantatge només apareix quan hi ha elecció real.
(c) SRTF (apropiatiu):
- t=0: P1 (10). Executa P1.
- t=1: arriba P2 (2) < 9 restants de P1. Apropiació → P2.
- t=2: arriba P3 (4) > 1 restant de P2. Continua P2.
- t=3: P2 acaba. Candidats: P1 (9), P3 (4), P4 (6). Entra P3.
- t=7: P3 acaba. Candidats: P1 (9), P4 (6). Entra P4.
- t=13: P4 acaba. Entra P1.
- t=22: P1 acaba.
| Procés | Arribada | Fi | Retorn | Ràfega | Espera |
|---|---|---|---|---|---|
| P1 | 0 | 22 | 22 | 10 | 12 |
| P2 | 1 | 3 | 2 | 2 | 0 |
| P3 | 2 | 7 | 5 | 4 | 1 |
| P4 | 3 | 13 | 10 | 6 | 4 |
(d) Round Robin, q=3 ms. Cua inicial: P1. S'hi van incorporant al final a mesura que arriben.
- t=0-3: P1 (li'n queden 7). En acabar el torn ja han arribat P2, P3, P4 → cua: P2, P3, P4, P1.
- t=3-5: P2 (necessita 2, acaba abans del quantum). Cua: P3, P4, P1.
- t=5-8: P3 (li'n queda 1). Cua: P4, P1, P3.
- t=8-11: P4 (li'n queden 3). Cua: P1, P3, P4.
- t=11-14: P1 (li'n queden 4). Cua: P3, P4, P1.
- t=14-15: P3 acaba.
- t=15-18: P4 acaba.
- t=18-22: P1 acaba.
| Procés | Arribada | Fi | Retorn | Ràfega | Espera |
|---|---|---|---|---|---|
| P1 | 0 | 22 | 22 | 10 | 12 |
| P2 | 1 | 5 | 4 | 2 | 2 |
| P3 | 2 | 15 | 13 | 4 | 9 |
| P4 | 3 | 18 | 15 | 6 | 9 |
Comparació final:
| Algorisme | Espera mitjana | Pitjor espera individual |
|---|---|---|
| FCFS | 8,00 ms | 13 ms (P4) |
| SJF | 8,00 ms | 13 ms (P4) |
| SRTF | 4,25 ms | 12 ms (P1) |
| Round Robin q=3 | 8,00 ms | 12 ms (P1) |
Què triaria per a Meteora: cap dels quatre purs, sinó Round Robin amb prioritats, que és essencialment el que fa CFS. El raonament:
- SRTF guanya en la mitjana, però és inaplicable: no es coneix la durada de les ràfegues i, sobretot, condemnaria l'
agregadora la inanició quanmeteo-apirebés peticions contínues. - FCFS provocaria l'efecte comboi: els 10 ms de l'
agregadorbloquejarien totes les peticions a l'API. - Round Robin pur tracta igual els quatre, quan
ingestoriagregadortenen necessitats oposades.
La configuració pràctica seria Round Robin amb nice diferenciat: ingestor a −5, meteo-api a 0, agregador a 10 i neteja a 19. Cal notar a més que aquests càlculs suposen un sol nucli; amb els 4 de meteo-01 els quatre processos correrien gairebé en paral·lel i l'espera mitjana cauria dràsticament en tots els algorismes.
Solució 2
Anàlisi prèvia. El primer és classificar per cost del retard, no per importància percebuda:
| Procés | Tipus | Cost de retardar-lo |
|---|---|---|
ingestor |
E/S, ràfegues mínimes | Irreversible: dades perdudes |
meteo-api |
E/S, ràfegues curtes | Contractual: incomplir l'objectiu de 200 ms |
agregador |
CPU, ràfegues llargues | Recuperable: n'hi ha prou d'acabar abans de les 9:00 |
backup-diari |
CPU + disc | Cap: pot córrer quan sobri temps |
Configuració proposada:
# 1. ingestor: màxima prioritat normal. Perdre lectures és irreversible. $ sudo renice -n -10 -p $(pgrep -f ingestor) # 2. meteo-api: prioritat lleugerament elevada. $ sudo renice -n -3 -p $(pgrep -f meteo-api) # 3. agregador: prioritat baixa, confinat a 2 dels 4 nuclis. $ sudo renice -n 10 -p $(pgrep -f agregador) $ sudo taskset -cp 2,3 $(pgrep -f agregador) # 4. backup: prioritat mínima de CPU i de disc. $ sudo renice -n 19 -p $(pgrep -f backup-diari) $ sudo ionice -c 3 -p $(pgrep -f backup-diari)
Justificació de cada decisió:
-
ingestoranice −10, no aSCHED_FIFO. Ambnice −10obté un 90 % de la CPU davant d'un procés normal en cas de conflicte, més que suficient per a un procés que només fa servir 0,3 ms per lectura.SCHED_FIFOdonaria una garantia més forta però introduiria el risc de bloquejar un nucli sencer si l'ingestortingués una fallada. La regla és no fer servir temps real siniceen té prou, i aquí en té prou amb folgança. -
meteo-apianice −3. Necessita respondre ràpid, però està limitat per E/S: passa gairebé tot el temps bloquejat, i quan es desperta CFS ja li dona preferència per tenir elvruntimemés baix. Una empenta moderada és suficient i evita que competeixi amb l'ingestor. -
agregadoranice 10i confinat a 2 nuclis. És l'únic limitat per CPU i el que pot fer mal als altres. Ambnice 10rep un ~10 % en conflicte i el 100 % quan els altres dormen, que és gairebé sempre. Confinar-lo als nuclis 2 i 3 garanteix que els nuclis 0 i 1 estiguin sempre disponibles per al pic de les 8:00. Com que ha d'acabar en una hora i el seu càlcul real dura minuts, té marge de sobres. -
backup-diarianice 19iionice -c 3. Aquí hi ha la clau que sempre s'oblida: el backup comprimeix i transfereix, així que competeix per CPU i per disc.renicenomés resol el primer.ionice -c 3(classe idle) fa que només faci servir el disc quan ningú més no el demana, i això protegeix les lectures de/var/lib/meteora/lectures/de l'agregador.
Riscos que introdueix aquesta configuració:
- L'afinitat dura malbarata capacitat. Si
ingestorimeteo-apiestan ociosos a les 3 de la matinada, els nuclis 0 i 1 queden sense fer servir mentre l'agregadores limita a dos. Seria millor aplicar l'afinitat només a la franja de pic, amb un temporitzador, o eliminar-la si l'agregadorcomença a apurar el termini. ionice -c 3pot provocar inanició del backup en un servidor amb activitat de disc contínua. Si el backup deixa de completar-se, cal apujar-lo a-c 2 -n 7(millor esforç, prioritat mínima), que sí que garanteix progrés.- Res d'això no limita la memòria. Si l'
agregadorconsumeix tota la RAM, l'OOM killer podria matarmeteo-apiamb independència de les prioritats de CPU. Aquest front es cobreix amb cgroups, a 06-02.
Solució 3
1. Càlculs. Amb 12 processos i canvi de context de 6 µs, la pitjor espera per al primer torn és (n−1)·(q + cost) = 11·(q + 6 µs).
| Quantum | Sobrecost = 6/(q+6) | Pitjor temps de resposta | Ràfegues de 5 ms completades |
|---|---|---|---|
| 500 µs | 6/506 = 1,19 % | 11 × 506 µs = 5,57 ms | No (necessita 10 torns) |
| 5 ms | 6/5006 = 0,12 % | 11 × 5,006 ms = 55,1 ms | Sí, just |
| 50 ms | 6/50006 = 0,012 % | 11 × 50,006 ms = 550 ms | Sí, amb folgança |
2. Elecció per a meteo-api amb objectiu de 200 ms: quantum de 5 ms.
- 500 µs es descarta encara que el seu temps de resposta sigui excel·lent, perquè el 75 % de les ràfegues dura menys de 5 ms i amb q=500 µs una ràfega típica necessitaria fins a 10 torns. Cada torn intercalat significa reentrar amb les memòries cau contaminades pels altres 11 processos: el sobrecost real és molt més gran que l'1,19 % nominal, que només compta el canvi de context i no les fallades de memòria cau.
- 50 ms es descarta directament: 550 ms de pitjor cas supera de bon tros l'objectiu de 200 ms. N'hi hauria prou amb un pic de càrrega per incomplir-lo.
- 5 ms és el punt correcte: sobrecost menyspreable (0,12 %), 55 ms de pitjor resposta —amb un marge de 3,6× sobre l'objectiu— i coincideix amb el llindar en què el 75 % de les ràfegues acaben soles, que és justament la regla pràctica de l'apartat del quantum.
3. Amb 200 processos executables: sí, canviaria, i de manera dràstica.
Gairebé cinc vegades l'objectiu de 200 ms. Per tornar-lo a complir:
Caldria abaixar el quantum a 1 ms, acceptant cinc vegades més sobrecost de canvis de context.
I aquí hi ha l'observació més valuosa de l'exercici: aquesta és exactament la raó per la qual CFS no fa servir un quantum fix. Linux defineix una latència objectiu (sched_latency_ns, 6 ms per defecte) que és el període en què tot procés executable ha de rebre CPU almenys una vegada, i calcula el quantum dividint-la entre el nombre de processos executables. Amb un terra de granularitat mínima (sched_min_granularity_ns, ~0,75 ms) perquè no degeneri:
$ cat /proc/sys/kernel/sched_latency_ns 2>/dev/null || echo "(EEVDF: substituït per sched_base_slice_ns)"
6000000
12 processos: 6 ms / 12 = 0,5 ms → per sota del terra, es fa servir 0,75 ms
200 processos: 6 ms / 200 = 0,03 ms → es fa servir el terra de 0,75 ms
i la latència real s'estira a 200 × 0,75 = 150 msÉs a dir: el planificador manté la latència objectiu mentre pot, i quan hi ha massa processos prefereix estirar-la abans que arruïnar el rendiment amb quàntums minúsculs. Aquesta degradació controlada és una decisió de disseny conscient, i explica per què un servidor amb 2.000 processos executables se sent lent encara que la CPU no estigui al 100 %: no li falta CPU, li falta torn.
Conclusió
Cal planificar perquè els processos alternen ràfegues de CPU i d'E/S, i quan un es bloqueja la CPU quedaria malbaratada. La distinció entre processos limitats per CPU i limitats per E/S és la que guia tota decisió pràctica, i es llegeix directament en la proporció de canvis de context voluntaris davant d'involuntaris de /proc/<pid>/status. Afavorir els curts no és caritat: és el que manté tots els recursos ocupats alhora.
Els criteris es contradiuen: no hi ha cap algorisme que optimitzi alhora productivitat, temps de retorn i temps de resposta. FCFS és trivial però pateix l'efecte comboi; SJF/SRTF són òptims en espera mitjana però requereixen endevinar el futur i causen inanició; les prioritats necessiten envelliment per no condemnar ningú; Round Robin sacrifica la mitjana a canvi d'acotar la resposta, amb el quantum com a comandament central; i les cues amb realimentació dedueixen del comportament el que no poden saber per endavant.
Linux resol tot això amb CFS/EEVDF, que substitueix cues i quàntums per un temps virtual i tria sempre el més endarrerit respecte a la seva part justa. Aquí encaixa nice: no reparteix torns, sinó que canvia el ritme del rellotge virtual, amb la regla d'un ~10 % de quota per punt. I nice només actua en cas de conflicte i només sobre la CPU, dos límits que cal tenir sempre presents. Per damunt hi ha les polítiques de temps real, potents i perilloses a parts iguals, i per sota el repartiment entre nuclis amb afinitat i balanceig.
Fins aquí hem repartit la CPU donant per fet que cada procés té la seva memòria i no trepitja la dels altres. És hora de preguntar-se com s'aconsegueix això: com diversos processos comparteixen una memòria física limitada sense envair-se, què converteix l'adreça 0x400000 d'ingestor i la 0x400000 d'agregador en dos llocs físics diferents, i què fa exactament el maquinari per impedir que un llegeixi les dades de l'altre. És el que veurem a Gestió de Memòria.
Fonaments de Sistemes Operatius
Mòdul 1: Introducció als Sistemes Operatius
- Conceptes Bàsics de Sistemes Operatius
- Història i Evolució dels Sistemes Operatius
- Tipus de Sistemes Operatius
- Funcions Principals d'un Sistema Operatiu
- Arquitectura del Nucli: Monolític, Microkernel i Híbrid
- Mode Usuari, Mode Nucli i Crides al Sistema
Mòdul 2: Gestió de Recursos
- Gestió de Processos
- Planificació de la CPU
- Gestió de Memòria
- Memòria Virtual i Paginació
- Gestió d'Emmagatzematge
- Gestió de Dispositius
- Controladors, Interrupcions i Operacions d'E/S
Mòdul 3: Concurrència
- Conceptes de Concurrència
- Fils i Processos
- Comunicació entre Processos (IPC)
- Sincronització i Exclusió Mútua
- Problemes Clàssics de Concurrència
- Interbloquejos: Prevenció, Detecció i Recuperació
Mòdul 4: Estructures de Fitxers
- Sistemes de Fitxers
- Estructures de Directoris
- Particions, Muntatge i Sistema de Fitxers Virtual
- Gestió de Fitxers
- Assignació d'Espai, Journaling i Integritat
- Seguretat i Permisos de Fitxers
Mòdul 5: Protecció i Seguretat del Sistema
- Principis de Protecció i Control d'Accés
- Usuaris, Autenticació i Escalada de Privilegis
- Amenaces Habituals i Enfortiment del Sistema
- Auditoria, Registres i Resposta a Incidents
Mòdul 6: Virtualització i Contenidors
- Virtualització: Hipervisors i Màquines Virtuals
- Contenidors: Namespaces i cgroups
- El Sistema Operatiu al Núvol
- Sistemes Operatius Mòbils i de Temps Real
