Casi di studio

Linux

Possiede un kernel monolitico con componenti modulari che rispecchiano quelli a livelli, che ne permette il facile porting su nuove piattaforme e integrazioni con nuovi moduli caricati a richiesta.

Processi e thread

Lo scheduler ha code round robin per ognuna delle 140 priorità su due run queue che sono invertite dopo averle svuotate, evitando l'attesa infinita con una deadline prima di cui dev'essere eseguito ogni processo.

Lo scheduler si occupa anche dell'invio dei segnali e la ricezione degli interrupt, ed è al più soft real-time.

Memoria

La memoria sfrutta la memoria virtuale con paginazione, implementata con una page table da tre livelli.

Principalmente la memoria fisica è suddivisa dal kernel in tre zone:

  • ZONE_DMA: per i dati trasferiti da vecchio hardware con il DMA
  • ZONE_NORMAL: per la maggior parte dei dati direttamente indirizzabili dal kernel
  • ZONE_HIGHNORMAL: per il resto dei dati non indirizzabili direttamente da processori a 32 bit

L'allocazione dei page frame avviene con l'algoritmo buddy che, se non trova un blocco libero abbastanza grande ne dimezza uno, unendo le metà avanzate, finché non combacia con la dimensione richiesta.

Inoltre ogni page frame è suddiviso in slab, cioè piccole strutture dati che sono singolarmente allocabili.

Le pagine sono sostituite, e salvate su un'unità o inode di swap, a orologio dalla coda di pagine inattive che vengono spostate in quella delle attive, contenenti il working set, se sono state riferite per la seconda volta.

Lo swapping è gestito dal demone kswapd, che fa write back sulle pagine modificate nella cache di swap.

Filesystem

Le operazioni sui file sono astratte dai vari filesystem attraverso il virtual filesystem.

Un filesystem che lo implementa è ext2, che suddivide l'unità in gruppi di blocchi e ne salva la dimensione e il numero sul super blocco, tracciandone gli inode con una bitmap.

Altri esempi sono il procfs sulla memoria principale, che contiene informazioni dettagliate sul sistema e sull'hardware, e network file system che sfrutta l'architettura client/server.

Windows

Sviluppato sul kernel NT, che fornisce l'interfaccia alle chiamate di sistema, è suddiviso in due sottolivelli:

  • Executive: contiene la maggior parte dei servizi, come la gestione dei processi e dell'I/O
  • Kernel: estende l'executive ed effettua lo scheduling e gestisce gli interrupt

Gli interrupt sono gestiti dall'Interrupt Service Routine che li maschera in base ad un livello di priorità.

Un servizio particolare dell'executive è il gestore degli oggetti che si occupa di gestire risorse come processi, file e dispositivi, rappresentati come oggetti logici a cui è assegnato un identificatore chiamato handle.

Un altro componente è l'Hardware Abstraction Layer, che si occupa di astrarre l'hardware dal software.

Processi e thread

Un processo è descritto dai blocchi, come il PCB:

  • EPROCESS nell'executive: descrive il processo e all'utente fornisce il Process Environment Block
  • KPROCESS nel kernel: dedicato alle informazioni di scheduling

Anche i thread hanno il blocco ETHREAD, ma il Thread Environment Block è contenuto nel KTHREAD. Inoltre hanno un loro Thread Local Storage isolato dagli altri thread che può essere indicizzato e modificato.

Utilizza un modello di threading ibrido assegnando ad ogni processo una sua thread pool, schedulandoli a round robin con diverse code per ognuna delle 32 priorità assegnabili.

Nei thread dinamici con priorità 0-15 la priorità aumenta in base agli eventi e diminuisce alla fine del quanto, mentre nei thread in tempo reale con priorità 16-31 la priorità non cambia.

Sia i thread che i processi possiedono una priorità base oltre cui la priorità non può scendere.

Memoria

La memoria è gestita dal Virtual Memory Manager (VMM) contenuto nell'executive, che usa ottimizzazioni come il prefetching, il copy on write e la lazy allocation per allocarle solo quando vengono usate.

Le pagine hanno dimensione fissa e sono salvate su due livelli, il primo dei quali contiene molteplici Page Directory Entry (PDE) che puntano ad una page table differente con le rispettive Page Table Entry (PTE).

L'allocazione delle pagine avviene effettuando:

  1. Reserve: la VMM riserva lo spazio di memoria richiesto del processo
  2. Commit: viene creata una PTE dello spazio riservato
  3. Access: il processo accede alla memoria

che se contigue potranno essere raggruppate dal VMM per gestirle come singola, riducendo l'uso della TLB.

La sostituzione avviene con l'algoritmo LRU su un working set scelto dal VMM, con swapping sulle pagine nella zona paged pool di memoria e senza per quelle nella zona nonpaged pool dedicata al kernel.

Filesystem

L'hardware delle unità esterne sono gestite dai volume driver, su cui sono poi implementati i filesystem driver a cui possono essere applicati i filesystem filter driver per operazioni come la compressione.

Un esempio è il filesystem NTFS, in cui ogni file ha una Master File Table, composta da attributi che sono non residenti se sono altrove sul disco, ed è formato da più gruppi di pagine chiamati cluster contenenti:

  • Virtual Cluster Number: posizione relativa all'inizio del file a cui appartiene
  • Logical Cluster Number: posizione assoluta sul volume

Il contenuto dei file è salvato sulla loro default data stream principale, ma possono avere anche altri alternate data stream associati ad un nome per memorizzare dati secondari come i metadati.