2010-05-02 31 views
5

mi riferisco a the link sui concetti di inodeComprendere il concetto di inode

Sono confuso su parti:

  1. 12 puntatori di blocco diretti
  2. 1 singolo puntatore blocco indiretto
  3. 1 matrimoniale pointer di blocco indiretto
  4. 1 puntatore triplo blocco indiretto

Ora il diagramma dice che ogni puntatore è 32/64 bit.

  • [Domanda]: perché e come vengono dedotti questi valori? Intendo perché in particolare ho solo puntatori a 32 o 64 bit?

Il diagramma dice, un blocco di dati {} 8 KB per ogni puntatore {4 byte/8 byte}

  • [Richiesta]: Come funziona questo in realtà funziona? vale a dire 8 * 1024 byte/8 byte = 1024 byte? Qual è la logica dietro l'avere un puntatore da 8 byte per il blocco da 8 KB?

risposta

8

I puntatori di cui sono gli indirizzi dei blocchi disco - ogni puntatore contiene le informazioni necessarie per identificare un blocco su disco. Poiché ogni blocco del disco è di almeno 512 byte (a volte 4096 o 8192 byte), utilizzando indirizzi a 32 bit il disco può indirizzare fino a 512 * 4 * 1024 = 2 TiB (Tebibyte - più comunemente chiamato Terabyte) assumendo 1/2 blocchi KiB; dimensioni corrispondentemente maggiori man mano che la dimensione del blocco aumenta (quindi 32 TiB con 8 dimensioni blocco KiB). Per uno schema di indirizzamento per dischi di grandi dimensioni, è necessario passare a blocchi di dimensioni maggiori o indirizzi di dischi più grandi, pertanto gli indirizzi a 48 o 64 bit potrebbero essere plausibili.

Quindi, per rispondere a Q1, 32 bit è una dimensione comune per molte cose. Molto spesso, quando 32 bit non sono più abbastanza grandi, la successiva dimensione sensibile è 64 bit.

Q2 telefoniche:

  • Con 8 blocchi dati KiB, se il file è 96 KiB o più piccolo, allora utilizza 12 blocchi o meno sul disco, e tutti quegli indirizzi blocchi sono memorizzati direttamente nell'inode si.

  • Quando il file diventa più grande, il driver del disco alloca un singolo blocco indiretto e lo registra nell'inode. Quando il driver deve ottenere un blocco, legge il blocco indiretto in memoria, quindi trova l'indirizzo per il blocco di cui ha bisogno dal blocco indiretto. Pertanto, richiede (nominalmente) due letture per ottenere i dati, anche se ovviamente l'indiretto tende ad essere memorizzato nella cache.

  • Con una dimensione di blocco di 8 KiB e indirizzi di disco a 4 byte, è possibile inserire 2048 indirizzi di disco nel blocco singolo indiretto. Quindi, per i file da 96 KiB + 1 byte a 16 MiB o giù di lì, c'è solo un singolo blocco indiretto.

  • Se un file diventa ancora più grande, il driver assegna un doppio blocco indiretto. Ogni puntatore nel doppio blocco indiretto punta a un singolo blocco indiretto. Quindi, puoi avere 2048 blocchi in più indiretti, ognuno dei quali può effettivamente puntare a 16 MiB, portando a file fino a 32 GiB (circa) che possono essere archiviati.

  • Se un file diventa ancora più grande, il driver assegna un blocco triplo indiretto. Ciascuno dei 2048 puntatori in un blocco triplo indiretto punta a un doppio blocco. Pertanto, con lo schema di indirizzamento a 32 bit con indirizzi a 32 bit, è possibile indirizzare file fino a circa 64 TiB. Tranne che hai esaurito gli indirizzi del disco prima di questo (32 TiB massimo a causa degli indirizzi a 32 bit per 8 blocchi KiB).

Quindi, la struttura di inode può gestire file più grandi di quanto gli indirizzi di disco a 32 bit possano gestire.

Lascerò come esercizio per il lettore vedere come cambiano le cose con gli indirizzi dei dischi a 64 bit.

+0

La ringrazio molto per la risposta dettagliata. Puoi spiegarmi il calcolo: indirizzi a 32 bit il disco può indirizzare fino a 512 * 4 * 10243 = 2 TiB fatto sopra ?? –

+0

@ darkie15: si supponga che ogni indirizzo del disco sia un numero di blocco. Con i numeri a 32 bit, è possibile indirizzare circa 4 miliardi di blocchi diversi; ognuno di questi blocchi è un KiB 1/2, quindi è possibile indirizzare circa 2 trilioni di byte - ovvero 2 TiB. –

3

Prima di dare le risposte, è necessario comprendere come funziona il sistema di file:

Ogni volta che un utente o un programma fa riferimento a un file in base al nome, il sistema operativo utilizza tale nome per cercare l'inode corrispondente, che quindi consente al sistema di ottenere le informazioni necessarie sul file per eseguire ulteriori operazioni. Cioè, un nome di file in un sistema operativo simile a Unix è semplicemente una voce in una tabella con numeri di inode, piuttosto che essere associato direttamente a un file (al contrario di altri sistemi operativi come i sistemi Microsoft Windows). I numeri di inode e i loro inode corrispondenti sono contenuti nelle tabelle degli inode, che sono memorizzati in posizioni strategiche in un filesystem, incluso vicino al suo inizio.

La risposta per la prima domanda è che lo spazio in bit copre il totale 32 o 64 bit. semplicemente rende 2^32 ed è abbastanza grande definire tutte queste variabili. Inoltre, per ulteriori usi deve conoscere la dimensione dei bit per le operazioni. Nel tuo esempio hanno appena definito in questo modo.

Secondo ogni puntatore (la dimensione dipende dalla capacità del disco) fa riferimento a un blocco di dati (8 KB su disco, il disco contiene blocchi) ma tenere presente che il file system unix ha una struttura gerarchica. Una tabella che punta su molte altre tabelle e infine l'ultima tabella punta al blocco dati.

ti offro di leggere questo libro, molto utile per capire lo Unix file system.

alt text http://ecx.images-amazon.com/images/I/511L2NK6ZNL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg

8

Esempio di calcolo della dimensione massima del file

* Assume that there are 10 direct pointers to data blocks, 1 indirect pointer, 1 double indirect pointer, and 1 triple indirect pointer 
* Assume that the size of the data blocks is 1024 bytes = 1Kb, i.e., BlockSize = 1Kb 
* Assume that the block numbers are represented as 4 byte unsigned integers, i.e., BlockNumberSize = 4b 
* Some data blocks are used as index blocks. They store 1024 bytes/4 bytes/entry = 256 entries 
* Maximum number of bytes addressed by 10 direct pointers is 

    = Number of direct pointers * Blocksize 
    = 10 * 1Kb 
    = 10Kb 


* Maximum number of bytes addressed by single indirect pointer is 

    = NumberOfEntries * BlockSize 
    = (Blocksize/BlockNumberSize) * BlockSize 
    = (1Kb/4b) * 1Kb 
    = 256 * 1Kb 
    = 256Kb 


* Maximum number of bytes addressed by double indirect pointer is 

    = NumberOfEntries^2 * BlockSize 
    = (Blocksize/BlockNumberSize)^2 * BlockSize 
    = (1Kb/4b)^2 * 1Kb 
    = (2^10/2^2)^2 * (2^10b) 
    = (2^8)^2 * (2^10)b 
    = (2^16) * (2^10)b 
    = 2^6 * 2^20 b 
    = 64 Mb 


* Maximum number of bytes addressed by triple indirect pointer is 

    = NumberOfEntries^3 * BlockSize 
    = (Blocksize/BlockNumberSize)^3 * BlockSize 
    = (1Kb/4b)^3 * 1Kb 
    = (2^10/2^2)^3 * (2^10b) 
    = (2^8)^3 * (2^10)b 
    = (2^24) * (2^10)b 
    = 2^4 * 2^30 b 
    = 16 Gb 


* Maximum file size is 16Gb + 64Mb + 266Kb