Sei sulla pagina 1di 8

1

L'unità a disco

Introduzione. In un sistema a microprocessore, la memoria centrale è usata per l'esecuzione dei programmi e, la parte RAM è volatile. All'avvio del sistema, il µP è in grado di eseguire solo il programma residente nella ROM. La memoria di massa è usata per conservare le informazioni in assenza di alimentazione, ma è da sottolineare che questa consente esclusivamente le operazioni di trasferimento delle registrazioni tra memoria centrale e supporto magnetico:

tutte le altre operazioni che la CPU intende svolgere, su programmi o su dati, sono possibili solo nella memoria centrale. Struttura fisica di un'unità a disco. Un disco è formato da un insieme di piatti sovrapposti e concentrici, la cui superficie è ricoperta con uno strato di biossido di ferro, e tenuto in rotazione, tramite una cinghia e una puleggia, da un motore eletrico.

Sui piatti si possono posizionare, muovendosi in direzione radiale, le testine di lettura/scrittura, che sono azionate da un braccio portatestine, al quale sono solidali. Cioè le testine si spostano, tutte insieme, dall'esterno verso l'interno (o viceversa) del disco, fino a giungere in una posizione ove si fermano mentre il disco continua a ruotare. Nelle unità a floppy disk, il piatto ruota solo quando è richiesto un accesso al disco, e le testine sono a diretto contatto con la superficie del dischetto. Nelle

unità ad hard disk invece, i piatti sono sempre in rotazione e, data l'elevata velocità di rotazione, le testine non possono essere tenute a contatto con la superficie del disco per evitare l'attrito. Il sistema di posizionamento delle testine usa un motore passo passo nelle unità a floppy disk, e un servomotore nelle unita con hard disk. In entrambi i casi il posizionamento non è continuo, ma è predisposto per un numero finito di posizioni delle testine. Ad esempio nei floppy disk, il motore passo passo può portare le testine in 80 posizioni. Un numero maggiore di posizioni produrrebbe registrazioni talmente vicine che si pertuberebbero a vicenda.

Quando le testine stazionano in una certa posizione, vedono passare 2n circonferenze, una su ciascuna delle facce degli n dischi. Ad esempio su un hard disk con 6 piatti, vi sono 12 superfici registrabili, sulle quali si affacciano 12 testine. L'insieme delle circonferenze accessibili senza movimento delle testine è detto cilindro, mentre ciascuna circonferenza è detta traccia. Una traccia è una linea chiusa e, quindi, per essa è necessario scegliere un riferimento che permetta di fissare un punto dal quale si deve considerare che abbia inizio una traccia.

Nei floppy disk da 3"+½ questo riferimento è realizzato tramite una tacca sull'anello di aggancio. Un sensore, fisso nel drive, posto in prossimità dell'anello di aggancio, rileva la riflessione della parte piena dell'anello di aggancio e origina un segnale Low; quando poi passa la parte vuota, il sensore non riceve la riflessione e commuta il segnale a livello High. Questo segnale è denominato "index pulse", cioè segnalazione di inizio traccia. L'accesso alle informazioni è diretto sia per quanto riguarda il posizionamento del braccio portatestine sul cilindro desiderato che la selezione della testina corrispondente al piatto indirizzato, ma è sequenziale durante la lettura o scrittura sul disco in rotazione. L'elevata lunghezza della traccia degraderebbe le prestazioni del disco se venisse trasferita completamente. Per consentire il trasferimento parziale della traccia è necessario marcare dei punti intermedi.

La formattazione. Il segnale index pulse indica l'inizio di una traccia, e occorrerebbero altri segnali per indicare l'inizio dei settori interni alla traccia. In alternativa a questa tecnica, si affida alla controller del disco il compito di marcare l'inizio dei settori. Il procedimento di formattazione è il seguente:

a) alla ricezione dell'index pulse la controller registra un record contenente i dati identificativi del settore, cioè

Superfici braccio magnetizzabili portatestine testine
Superfici
braccio
magnetizzabili
portatestine
testine
cilindro
cilindro
ottu ratore automatico Finestra accesso dischetto foro index Anello di p ulse aggancio foro per
ottu ratore automatico
Finestra
accesso
dischetto
foro index
Anello di
p ulse
aggancio
foro per dischetti ad alta
densità
foro protezione da
scrittura

- il numero del cilindro (C),

- il numero della testina (H),

- il numero stesso del settore (S),

- e la quantità di byte contenuti nell'area dati del settore;

la registrazione del numero del cilindro e del numero della testina sono registrati per un riscontro di affidabilità dell'operazione di accesso; il numero del settore invece è usato per l'effettiva ricerca del settore indirizzato. b) Nel normale uso del disco la ricerca di un settore consiste nella lettura del record di identificazione e nel suo confronto con quello cercato; durante il tempo in cui la controller esegue questo confronto sotto la testina è passato

2 - L’unità a disco

un arco di settore che non potrà più venire recuperato, pertanto dopo questo record di identificazione esiste un'area inutilizzabile denominata GAP.

c) Passato questo spazio, la controller è pronta per eseguire l'operazione, di lettura o di scrittura, e quindi in fase di formattazione lascia spazio per memorizzare 512 byte di dati (=1 settore).

d) La controller lascia ancora un GAP perchè dopo aver registrato i dati, calcola un codice, detto CRC (controllo ciclico di ridondanza), che registra immediatamente dopo i dati, e che utilizza poi in fase di lettura: lo ricalcola e lo confronta con quello registrato, per verificare la correttezza dei dati letti.

e) Per questa operazione di confronto è richiesto ancora un certo tempo e, quindi esisterà ancora un GAP.

Nella stessa sequenza si continua a registrare ancora altri settori sulla traccia, cioè il record di identificazione, un GAP, lo spazio per i dati, un altro GAP, il CRC, e un altro GAP, fino a completare la traccia. La formattazione prepara una traccia formando i campi illustrati nella figura seguente:

GAP

record identificazione settore N° 1

         

record identificazione settore N° 2

dopo

GAP

area

GAP

CRC

GAP

l'index

dati

pulse

       

L'ampiezza dei GAP è variabile e dipende dal tempo necessario a compiere l'operazione richiesta dal campo precedente.

Operazioni di accesso al disco. Per trattare le informazioni sul disco occorre riservare nella memoria centrale lo spazio sufficiente a contenere i dati relativi al numero di settori che si intende trasferire. Il settore è la minima quantità di byte che la controller può gestire, infatti con la formattazione non sono state marcate frazioni di settori. La controller non riesce a indirizzare dinamicamente la zona della memoria centrale coinvolta nel trasferimento, ma il sistema operativo le indica una zona fissa, un buffer lungo esattamente un settore e in quest'area simula la lettura o la scrittura sul disco, che avverranno poi realmente quando il buffer è stato completamente esaurito in lettura o in scrittura. Il programma che intende accedere a uno specifico settore, dopo aver preparato lo spazio destinato a contenere i settori da trasferire, deve comunicare alla controller, tramite il sistema operativo, le seguenti informazioni:

- l'identificativo del drive,

- il numero del cilindro su cui posizionarsi,

- la testina da selezionare nell'ambito di tutte le tracce del cilindro,

- il numero del settore all'interno della traccia,

Questo procedimento, estremamente dettagliato, può essere semplificato introducendo una numerazione logica dei settori e delegando al sistema operativo il compito di calcolare l'indirizzo fisico del settore. Al primo settore del primo cilindro del lato superiore si assegna l'indirizzo logico 0, al settore successivo si assegna l'indirizzo logico 1, e così via. Dopo l'ultimo settore di questo lato si prosegue la numerazione logica con il primo settore del lato sottostante e così di seguito fino a completare tutti i settori di uno stesso cilindro. Si prosegue poi, per tutti i cilindri, con il primo settore del cilindro successivo.

Per effettuare l'associazione tra l'indirizzo logico e quello fisico il sistema di archiviazione deve conoscere:

- il numero di tracce per cilindro, - il numero di settori per traccia. Queste e altre informazioni dipendono dalla formattazione, e il sistema operativo le registra nel settore di BOOT. Questa numerazione permette di immaginare che il disco sia un array di settori, e per un dischetto da 720KB, formato da 2 lati, 40 cilindri, e 18 settori per traccia, apparirebbe la seguente corrispondenza tra il numero logico del settore e la sua posizione fisica sul disco:

Nel cilindro 0 la testina 0 vede i settori da 1 a 18, mentre la testina 1 vede i cilindri da 19 a 36. Nel cilindro 1 la testina 0 vede i settori numerati da 37 a 54 ecc. Esempio: per calcolare le coordinate CHS (Cilindro, Testina e

Settore) del settore logico numero 128, si divide 128 per 36 (il

Cilindro 0 Cilindro 1 6 4 5 7 3 8 2 9 1 10 18
Cilindro 0
Cilindro 1
6
4
5
7
3
8
2
9
1
10
18
11
12
17 16 15
14
13

numero di settori in un cilindro):

128 : 36 = 3 con resto 20. Il quoziente 3 indica il numero del cilindro in cui è contenuto il settore logico indirizzato, mentre il resto 20 viene diviso per 18 (il numero di settori in una traccia):

20 : 18 = 1 con resto 2 Il quoziente rappresenta il numero della testina, mentre il resto è il numero fisico del settore all'interno della traccia. Le coordinate del settore logico 128 quindi sono C=3, H=1 e S=2.

Organizzazione logica del disco. Alla fine della formattazione il sistema operativo organizza il disco in quattro zone, tutte, tranne la prima, hanno una dimensione, in settori, che dipende dalla capacità del disco:

- Nel settore 1 del cilindro 0 sulla superficie vista dalla testina 0 viene registrato il settore di boot,

L'unità a disco - 3

- subito dopo il settore di boot vengono riservati alcuni settori per contenere due FAT (File Allocation Table),

- dopo le due FAT si lascia lo spazio per la directory radice,

- tutta la parte restante serve per contenere i dati.

Il settore di BOOT. Nei floppy disk il sistema operativo riserva il primo settore per contenere le seguenti informazioni di servizio:

offset

tipo campo

Significato del valore contenuto

1

1

byte +

istruzione di salto all'indirizzo specificato nella word. Da tale indirizzo inizia il programma di avviamento del sistema,

semprechè il dischetto contiene la parte residente (COMMAND.COM) del sistema operativo.

1

word

4

8

caratteri

nome del programma che ha inizializzato il dischetto.

12

1

word

numero di byte componenti un settore.

14

1

byte

numero di settori che il sistema operativo usa per ogni operazione di trasferimento (blocco o cluster).

15

1

byte

numero di FAT.

16

1

word

numero massimo di elementi che si possono inserire nella directory.

18

1

word

numero totale di settori presenti sul disco.

20

1

byte

codice identificativo del tipo di disco (360KB, 720

).

21

1

word

numero di settori riservati a ciascuna FAT.

23

1

word

numero di settori in ciascuna traccia.

25

1

word

numero di testine per cilindro.

(2,3)

 

programma di avviamento.

Per quanto riguarda l'hard disk, il settore di BOOT è più articolato, in previsione della possibilità di operare con più di un sistema operativo. La FAT (la Tabella di Allocazione dei File). L'area del disco che segue il settore di BOOT, è trattata come una tabella di puntatori a blocchi di settori e, per meglio comprenderne il significato conviene introdurre un esempio. Un dischetto da 1.44KB contiene circa 2880 settori. Il sistema operativo, nelle sue operazioni sui file, non accede a un singolo settore ma a blocchi di settori denominati blocchi (o cluster). Nella discussione seguente si fa l'ipotesi che 1 blocco contenga 2 settori.

I blocchi dell'area dati sono numerati progressivamente. La FAT può essere considerata un array di word (FAT a 16 bit),

parallelo all'array dei blocchi di dati, ciò vuol dire che l'elemento numero 1 della FAT è associato al blocco dati numero 1 e così via. Se la FAT fosse grande 4 settori allora potrebbe contenere 4x512 byte cioè 1024 word. Si supponga che, dopo aver inizializzato un dischetto, si registri un archivio 'A' lungo 800 byte. Per questo file è necessario 1 blocco, quindi 1024-800=224 byte del blocco non saranno utilizzabili. Sul dischetto nuovo tutti gli elementi della FAT contengono il valore 0, per indicare che tutti i blocchi sono disponibili, quindi il sistema operativo deciderà di registrare il file nel blocco numero 1 (il primo che trova libero).

Per accedere al file il sistema operativo registra nella directory il nome del file e, accanto a questo, il puntatore 1 al blocco dati.

Nella posizione numero 1 della FAT viene scritto il puntatore Null () (codice FFFF). Un secondo file 'B' lungo 1600 byte, per il quale sono quindi richiesti due blocchi (quindi con uno spreco di 448 byte), sarà registrato nei blocchi 2 e 3 dell'area dati

File A 1 Dati ∧ directory Blocco 1 FAT[1]
File A
1 Dati
directory
Blocco 1
FAT[1]
File B 2 Dati Directory Blocco 2
File B
2 Dati
Directory
Blocco 2

3

3 Dati

Dati

FAT[2]

Blocco 3

∧

FAT[3]

Nella directory sarà scritto il nome del file e il puntatore 2 al blocco iniziale del file. Nell'elemento numero 2 della FAT viene invece scritto il puntatore al blocco successivo (3). Nell'elemento numero 3 della FAT viene infine scritto il codice Null, per indicare che il blocco 3 è l'ultimo della lista. Il numero del primo blocco dal quale inizia il file è scritto in un campo del record all'interno della directory riservato a contenere una descrizione del file (nome, estensione, data e ora di registrazione, lunghezza, attributi). Poiché un file può variare in dimensione, la sua registrazione su disco è organizzata in una lista di blocchi, in cui i puntatori ai blocchi sono contenuti nella FAT:

directory Area dati File A 1 Blocco 1 File B 2 Blocco 2 Blocco 3
directory
Area dati
File A
1 Blocco 1
File B
2 Blocco 2
Blocco 3

FAT

FFFF 3 FFFF
FFFF
3
FFFF

Fine file A

Prossimo blocco di B Fine file B

Se il file A è cancellato definitivamente il sistema operativo non si preoccupa di cancellare realmente i dati, ma si limita

a sostituire al nome del file nella directory una marca di file cancellato e a mettere a zero tutte le posizioni della FAT in cui erano contenuti i puntatori ai blocchi componenti il file. Adesso sul disco sono presenti solo i blocchi del file B.

Directory Area dati File cancellato 1 Blocco 1 File B 2 Blocco 2 Blocco 3
Directory
Area dati
File cancellato
1 Blocco 1
File B
2 Blocco 2
Blocco 3

FAT

0 3 FFFF
0
3
FFFF

Blocco libero

Prossimo blocco di B Fine file B

4 - L’unità a disco

Se, in questa situazione, si registra un nuovo file C, lungo 3 blocchi, il sistema operativo, dopo aver verificato che nella directory non esista un file con lo stesso nome, usa lo spazio occupato dal file cancellato per registrare il primo dei 3 blocchi, e usa i blocchi 4 e 5 per registrare gli altri due. La situazione finale è rappresentata in figura:

Directory Area dati File C 1 Blocco 1 File B 2 Blocco 2 Blocco 3
Directory
Area dati
File C
1 Blocco 1
File B
2 Blocco 2
Blocco 3
Blocco 4
Blocco 5
FAT 4 3 FFFF 5 FFFF
FAT
4
3
FFFF
5
FFFF

Prossimo blocco di C

Prossimo blocco di B Fine file B

Prossimo blocco di C Fine file C

Cioè in seguito a operazioni di cancellazione, creazione o aggiunta di dati ai file, le informazioni di uno stesso file sono registrate in settori sparsi per il disco e sono tenute collegate dai puntatori raccolti nella FAT. Il comando defrag (defragmentation) ridispone i vari blocchi dei file in modo da collocarli sullo stesso cilindro o su cilindri contigui. Gestione software del disco. La meccanica di accesso al disco è governata dalla circuiteria della scheda controller. Il sistema operativo si colloca tra le richieste di operazioni sul disco avanzate dal programma applicativo e il controller. L'elaborazione delle informazioni avviene tramite funzioni e operatori che prescindono dalla meccanica dell'unità a disco.

leggi il Lettura da: Programma Unità S. O. Controller a Applicativo record N - cilindro,
leggi il
Lettura da:
Programma
Unità
S. O.
Controller
a
Applicativo
record N
-
cilindro,
disco
dall'archivio A
- settore,

- testina.

Il programma applicativo chiede al sistema operativo un accesso al disco, fornendo un identificatore di archivio e un codice per la selezione di un record, il sistema operativo, poi, s’incarica di calcolare e comunicare alla controller, il cilindro, la testina e il settore su cui posizionarsi. Moduli del sistema operativo. CREAZIONE ARCHIVIO: il comando per la creazione di un archivio comunica al sistema operativo, il nome con cui si intende identificare l'archivio e gli attributi per il suo impiego.

Creat(nome archivio, attributi) Cerca nella directory un record avente il campo nome uguale a quello
Creat(nome archivio, attributi)
Cerca nella directory un record avente il
campo nome uguale a quello fornito e una
posizione di archivio cancellato
NO
SI
l'archivio
esiste?
NO
Trovato
record libero
Ritorna errore:
SI
Directory piena
Annota nella directory:
Nome, Estensione,
data, ora e attributi
dell'archivio.
Ritorna errore:
Archivio esistente
Ritorna:
Operazione riuscita

Il compilatore traduce questo comando nelle seguenti richieste al S.O.:

1 - accesso all'unità a disco specificata,

2 - avanzamento nelle directory, fino a raggiungere quella cercata, e

3 - ricerca del nome di archivio corrispondente, per accertarsi che non esista.

Prima di ciascuna operazione, la procedura di creazione esegue il relativo controllo di verifica, in seguito al quale potrebbe ritornare con il corrispondente messaggio di errore:

1 - unità non pronta,

2 - percorso non trovato, oppure

3 - file già esistente.

L'unità a disco - 5

Se non si verifica nessuna condizione di errore, il nome dell'archivio viene registrato nella directory in una posizione disponibile, occupata da un file cancellato, oppure in coda all'elenco dei file, con l'aggiunta del campo degli attributi, della data, dell'ora di creazione e della lunghezza, inizializzato a 0. Anche in questo caso si può verificare un eventuale errore per mancanza di spazio nella directory. Si ritiene necessario chiarire che il sistema operativo comunica le sue segnalazioni di errore al programma applicativo, depositandone il codice in una variabile. Se il programma applicativo non interroga la variabile, per assicurarsi che l'operazione sia riuscita, procederà ritenendo erroneamente di operare come previsto, ma in realtà tutte le successive operazioni sull'archivio vengono respinte all'insaputa dell'utilizzatore del programma. Questa precisazione sarà valida per tutti i casi di errore che si verificano dopo una richiesta al sistema operativo. L'eccezione a questa regola è data dagli errori denunciati dai dispositivi periferici, ad esempio manca il dischetto nel drive, la stampante è spenta ecc APERTURA ARCHIVIO. Dopo che un archivio è stato creato, si presume che si voglia anche inizializzarlo, pertanto la procedura di creazione provvede automaticamente anche all'apertura del file stesso. L'operazione di apertura di un file ha lo scopo di stabilire un collegamento tra il programma applicativo, che usa il file, e il sistema operativo, che deve gestire le risorse hardware e software dell'elaboratore. Nei sistemi operativi che gestiscono l'esecuzione di più applicazioni, un programma apre un archivio per ottenere l'uso esclusivo del file, cioè per impedire ad altri programmi di aggiornare l'archivio mentre esso è usato. Quando un programma apre un archivio, deve comunicare al sistema operativo il nome e il modo in cui intende utilizzarlo, con un comando della forma:

OPEN ( nome archivio, tipo accesso ).

Open(nome archivio, modo accesso)

archivio, tipo accesso ). Open(nome archivio, modo accesso) Cerca il nome nella directory SI NO Trovato?

Cerca il nome nella directory

SI NO Trovato?
SI
NO
Trovato?

Cerca nella tabella dei

descrittori una posizione libera

Ritorna errore:

Archivio non trovato

NO Trovata? SI
NO
Trovata?
SI

Componi il descrittore con le informazioni prese dalla directory e con l'accesso chiesto

prese dalla directory e con l'accesso chiesto Ritorna errore: Superato il massimo numero di archivi

Ritorna errore:

Superato il massimo numero di archivi aperti

Ritorna il file handle

Per gestire gli accessi agli archivi usati da un programma, il sistema operativo aggiorna una "tabella dei descrittori di archivi aperti", nella quale, per ogni archivio aperto registra un descrittore, e comunica al programma che ha richiesto l'apertura, un valore. Questo è detto puntatore al file, se l'archivio è usato in modo testo, altrimenti è un numero intero, detto file handle (gestore del file). Il programmatore deve usare il puntatore al file, o il file handle, immaginando che esso indichi, in ogni momento, la posizione sul file dalla quale inizierà la prossima operazione di lettura o di scrittura. Il puntatore al file, o il file handle, è l'unica informazione sull'archivio che il programma possiede. Questo potrà richiedere le operazioni di lettura o di scrittura di record nel file, specificando questo valore, il sistema operativo lo userà per identificare il descrittore dell'archivio e verificare la legittimità delle operazioni richieste su di esso. Un descrittore di archivio aperto è un record e tra i principali campi che deve contenere vi sono:

- identificatore del drive, percorso, nome ed estensione dell'archivio,

- numero del blocco contenente il settore,

- indirizzo del byte da cui inizierà la prossima operazione di lettura o di scrittura,

- lunghezza, in byte, dell'archivio,

- marca di raggiungimento della fine del file,

- diritti di accesso.

Il campo <nome del file> contiene tutte le informazioni necessarie a trovare il file sul disco, in tal modo si stabilisce una separazione tra il programma e i suoi dati, infatti lo stesso programma potrà operare le stesse elaborazioni su archivi

6 - L’unità a disco

diversi, in quanto comunicherà al sistema operativo il <file handle>, e questo ne tradurrà il riferimento al file effettivo a cui si vuole accedere.

I campi <numero del blocco> e <indirizzo del byte (all'interno del blocco)> su cui avverrà la successiva operazione di lettura o di scrittura, tengono conto di due possibili casi:

I - si accede all’archivio con la tecnica random, II - si avvicendano accessi ad archivi diversi.

In entrambi i casi, il sistema operativo, prima di accedere a un archivio sul disco, deve poter risalire alla posizione in cui

disporre le testine, se il blocco non è già disponibile nella DTA.

Il campo <marca di fine file> è posto a un valore logico vero, quando dopo un'operazione di lettura o dopo un

posizionamento random, si è superata l'ultima registrazione del file.

il campo <lunghezza> contiene il numero di byte effettivamente registrati nel file.

Il campo <diritti di accesso> contiene le modalità d'uso dell'archivio, specificate al momento dell'apertura, e sono gestite dal sistema operativo come un controllo di sicurezza contro errori involontari del programmatore. Il compilatore offre opportune funzioni per entrare a conoscenza, o in taluni casi anche per modificare, i valori contenuti nei campi del descrittore, queste comprendono:

- <filelength> per conoscere la lunghezza del file,

- <eof> per verificare lo stato della marca di fine file,

- <lseek> per impostare un nuovo indirizzo logico di record su cui operare la prossima lettura o scrittura.

- <chmod> per cambiare il modo di accesso in lettura, in scrittura, ecc

Così come è compito del programma acquisire il codice di errore prima di continuare a usare il file, è anche compito del programma recuperare in una variabile intera il <file handle> restituito dalla funzione di apertura archivio. Infatti, questo dovrà essere specificato per ogni riferimento all'archivio. LETTURA (O SCRITTURA) DI RECORD. Il programma applicativo richiede al sistema operativo di leggere un record dall'archivio tramite una funzione della forma:

LEGGI RECORD( file handle, indirizzo di variabile, numero di byte),

dove <file handle> è la variabile in cui si è memorizzato il numero intero restituito dalla funzione di apertura, <indirizzo

di variabile> è l'indirizzo della memoria centrale dove si vuole trasferire il record da leggere dal disco, e <numero di

byte> è la lunghezza del record da leggere.

Per soddisfare la richiesta di lettura, il

sistema operativo controlla il valore

del file handle, per assicurarsi che

l'archivio è aperto, poi verifica, nel descrittore dell'archivio, se è ammesso

l'accesso in lettura; se lo è controlla se

si è raggiunta la fine del file. A questo

punto, il sistema operativo, assicuratosi di poter accedere al file, traduce i campi <numero del blocco> e <indirizzo logico del record>, contenuti nel descrittore, in un indirizzo fisico per accedere al file.

Si possono verificare due casi:

I - il record richiesto è contenuto nella DTA, e allora è trasferito direttamente

da questa all'indirizzo di memoria

specificato, oppure

II - bisogna aggiornare la DTA con il

blocco di settori contenente il record cercato.

Come ultima operazione, la funzione

di lettura, prima di tornare al

programma, incrementa il campo <indirizzo logico del record>,

presumendo che il prossimo accesso al file avvenga, in modo sequenziale, sul record successivo, che molto probabilmente è già disponibile nella DTA (il programmatore deve immaginare, invece, che il puntatore al file si fermi all'inizio del record successivo a quello letto).

Per derogare all’assunzione implicita di accesso sequenziale, e impiegare la tecnica di accesso random, bisogna far uso della funzione <lseek>.

Read(file handle, indirizzo di variabile, numero di byte) SI NO file handle>0? Accesso al descrittore
Read(file handle, indirizzo di variabile, numero di byte)
SI
NO
file handle>0?
Accesso al descrittore
Ritorna errore:
Archivio non aperto
NO
consentito
leggere?
Ritorna errore:
SI
Lettura negata
SI
La marca di
EOF è set?
Ritorna errore:
NO
Superata lunghezza
il record è
nel buffer?
NO
SI
Accedi al disco e trasferisci
il settore nel buffer.
Trasferisci dal buffer alla
variabile, incrementa il
numero logico di record e ritorna

L'unità a disco - 7

L'operazione di scrittura record nel file è del tutto complementare a quella di lettura, pertanto la sua funzionalità non è descritta, perché facilmente deducibile.

POSIZIONAMENTO. Il programma che accede ai record dell'archivio con la tecnica random, deve sempre premettere, all'istruzione di lettura o di scrittura del record, la funzione di posizionamento all'inizio del record da trasferire, tramite una richiesta al sistema operativo della forma:

Lseek( file handle, numero relativo di byte, riferimento)

Lseek( file handle, numero relativo di byte, riferimento)

Lseek( file handle, numero relativo di byte, riferimento)
Lseek( file handle, numero relativo di byte, riferimento)
NO SI file handle > 0? Calcola il riferimento tramite il descrittore Ritorna errore Archivio
NO
SI
file handle > 0?
Calcola il riferimento
tramite il descrittore
Ritorna errore
Archivio non aperto
Aggiorna i campi del descrittore
calcolando il settore (o il blocco)
e la posizione del byte entro il
settore in cui avverrà la prossima
operazione di I/O.
NO posizione < Lungh. file? SI Poni SET la flag di EOF Ritorna
NO
posizione <
Lungh. file?
SI
Poni SET
la flag di EOF
Ritorna

dove <file handle> è il numero intero di identificazione del descrittore di archivio, mentre il parametro <numero relativo

di

byte> indica di quanti byte si intende spostarsi rispetto al punto indicato con il parametro <riferimento>.

Il

riferimento può assumere i tre valori:

- inizio del file (SEEK_SET).

- posizione attuale (SEEK_CUR),

- fine del file (SEEK_END).

L'esecuzione del comando, come al solito, comporta la verifica del file handle; se questo esiste allora avviene l'accesso

al descrittore per determinare il valore del riferimento specificato, cioè il blocco di inizio dell'archivio, il blocco

corrente o il blocco di settori dove finisce l'archivio.

A questo riferimento si deve sommare algebricamente il numero di blocchi che corrispondono alla distanza in byte

specificata nel comando. Il risultato verrà inserito nel descrittore dell'archivio, nel campo <numero del blocco> e la parte residua nel campo <indirizzo del record> dove si eseguirà la prossima operazione di lettura o di scrittura.

Esempio: si consideri il comando lseek(handle, -10L, SEEK_END), con il quale si chiede di posizionarsi a 10 byte (la L dopo il 10 sta per rappresentazione long int) dalla fine dell'archivio. Supponendo che l'archivio sia lungo 2060 byte, e che un blocco comprenda 1024 byte, per individuare la fine del file, basta osservare che l'archivio occupa 3 blocchi (1024 byte sul primo blocco + 1024 byte sul secondo blocco + 12 byte sul terzo blocco). La posizione cercata si trova quindi nel terzo blocco di allocazione del file, a partire dal secondo byte. La procedura SEEK aggiornerà il descrittore dell'archivio scrivendo 3 nel campo <numero del blocco> e 2 nel campo <indirizzo del record>.

CHIUSURA ARCHIVIO. Per soddisfare questa richiesta il sistema operativo accede al descrittore per controllare se su quell'archivio si stava operando in aggiornamento, nel qual caso il contenuto della DTA viene trasferito sul disco, nel blocco la cui posizione relativa è contenuta nel descrittore. Lo spazio occupato dal descrittore, nella tabella dei descrittori di archivi aperti, viene reso disponibile per eventuali descrittori successivi e si marca il file handle a un valore convenzionale per riconoscere che l'archivio non è aperto.

CANCELLAZIONE ARCHIVIO. Le azioni corrispondenti alla richiesta di cancellazione di un archivio dal disco, sono già state anticipate nell'esempio dell'organizzazione della FAT, resta da precisare che anche in questo caso, il sistema operativo svolge dei controlli di sicurezza. In particolare, si accerta che l'archivio non abbia l'attributo di sola lettura. Questo attributo ha infatti lo scopo di prevenire la cancellazione involontaria di un archivio.

8 - L’unità a disco

La directory radice. Subito dopo i settori riservati alle FAT il programma di inizializzazione lascia alcuni settori destinati alla directory. Quest'area è suddivisa in record, nei quali sono contenute informazioni controllate dal sistema operativo durante le operazioni di ricerca degli archivi.

La directory è paragonabile al sommario di un libro, dove un lettore consulta i nomi dei capitoli e, in corrispondenza, trova la pagina dalla quale inizia il capitolo cercato. Per ogni archivio che si registra sul disco, il sistema operativo cerca nella directory un record disponibile dove annotare le seguenti informazioni.

Lunghezza

Contenuto

Campo

in byte

   

Nome dell'archivio (in codice ASCII)

1

8

Il sistema operativo considera il carattere spazio come fine nome, per cui lo spazio non è utilizzabile come parte del nome di un archivio.

2

3

Estensione dell'archivio (in codice ASCII)

3

1

Attributi dell'archivio.

4

10

Campo riservato

5

2

Ora di creazione dell'archivio

6

2

Data di creazione dell'archivio

7

2

Numero del primo blocco da cui inizia la registrazione dell'archivio.

8

4

Dimensione in byte dell'archivio.

Per cercare una posizione libera, il S. O. legge il primo byte del campo nome di ciascun record della directory; vi sono 4 casi possibili:

Valore 00 esadecimale: il record è libero, ed è l'ultimo della directory.

Valore E5 esadecimale: record occupato da un archivio cancellato.

Valore 2E esadecimale (carattere punto): indica che il record contiene informazioni relative alla sottodirectory corrente; ma se anche il carattere adiacente è il codice ASCII del punto, allora indica le informazioni per reperire la sottodirectory precedente a quella corrente.

Ogni altro valore è considerato come il nome di un archivio.

Il campo attributi dell'archivio specifica per ognuno dei suoi otto bit posti a livello uno le seguenti caratteristiche dell'archivio:

bit

 

Significato.

numero

 

0

L'archivio è di sola lettura.

1

L'archivio è nascosto.

2

L'archivio è del sistema operativo

3

I campi nome ed estensione (11 caratteri) specificano la LABEL o etichetta del disco

 

Sottodirectory. Su un disco possono essere contenute più sottodirectory, nello spazio destinato ai dati, e non nella directory radice, e la loro dimensione non è limitata come la directory radice. Il campo nome è l’identificatore della sottodirectory, e il campo

4

indirizzo contiene il numero del primo blocco da cui inizia l'elenco degli archivi registrati nella sottodirectory. Il primo record di questo elenco è il carattere "." che serve per indirizzare la sottodirectory "

serve per indirizzare la sottodirectory

stessa, mentre il nome " precedente.

5

Archivio.

6 e 7

non usati.

Il campo lunghezza dell'archivio denota il numero di byte contenuti nell'archivio, è chiaro che la differenza tra la capacità del disco e la somma delle lunghezze di tutti gli archivi non corrisponde allo spazio libero. Infatti un archivio occupa un blocco intero anche se contiene solo pochi byte.