View
18
Download
3
Category
Preview:
DESCRIPTION
SOFS - manipulação das listas de nós-i e de clusters livres
Citation preview
Departamento de Electrónica, Telecomunicações e Informática
DETI
2
Organização da lista de nós-i livres
A lista de nós-i livres constitui uma lista biligada de todos os nós-i da tabela de nós-i que estão presentemente livres. Está organizada como um FIFO linear.
ponto de retirada
ihead itail
ponto de inserção
nó-i nó-i nó-i
Departamento de Electrónica, Telecomunicações e Informática
DETI
3
Reserva de um nó-i - 1
Algoritmo (situação em que a lista tem um ou mais elementos)
ponto de retirada
ihead itail
ponto de inserção
nó-i nó-i nó-i
nInode
(1)
(2)
(3)
Departamento de Electrónica, Telecomunicações e Informática
DETI
4
Reserva de um nó-i - 2
Algoritmo geral (pseudo-código)
nInode = ihead; if (ifree == 1) /* the list has one element */ ihead = itail = NULL_INODE; else { /* the list has two or more elements */ ihead = ihead->next; ihead->prev = NULL_INODE; } ifree -= 1;
(1)
(2)(3)
(2)+(4)
Departamento de Electrónica, Telecomunicações e Informática
DETI
5
Reserva de um nó-i - 3
Validação de conformidade
•o tipo do nó-i a reservar tem que representar um tipo válido (ficheiro regular, directório ou atalho)
•o ponteiro para a região de armazenamento do número do nó-i reservado não pode ser nulo
• tem que haver pelo menos um nó-i livre na lista de nós-i livres.
Validação de consistência
•a informação contida no superbloco sobre a tabela de nós-i e na lista de nós-i livres tem que estar correcta.
Departamento de Electrónica, Telecomunicações e Informática
DETI
6
Libertação de um nó-i - 1
Algoritmo (situação em que a lista tem pelo menos um elemento)
ponto de retirada
ihead itail
ponto de inserção
nó-i nó-i nó-i
nInode
(1)
(2)
(3)
(4)
Departamento de Electrónica, Telecomunicações e Informática
DETI
7
Libertação de um nó-i - 2
Algoritmo geral (pseudo-código)
if (ifree == 0) { /* the list is empty */ inode->prev = inode->next = NULL_INODE; ihead = itail = nInode; } else { /* the list has at least one element */ nInode->prev = itail; nInode->next = NULL_INODE; itail->next= nInode; itail = nInode; } ifree += 1;
(3)
(4)
(1)
(1)+(2)
(5)+(4)
(2)
Departamento de Electrónica, Telecomunicações e Informática
DETI
8
Libertação de um nó-i - 3
Validação de conformidade
•o número do nó-i a libertar tem que estar na gama adequada (não pode ser 0 e tem que ser um valor válido)
•o nó-i a libertar tem que ser um nó-i em uso, com informação interna correcta e com o seu campo refcount a 0.
Validação de consistência
•a informação contida no superbloco sobre a tabela de nós-i e na lista de nós-i livres tem que estar correcta.
Departamento de Electrónica, Telecomunicações e Informática
DETI
9
Organização das caches de referências a clusters livres
elemento comreferência válida
elemento semreferência válida
cache_idx
cache
cache de retirada
cache_idx
cache
cache de inserção
Departamento de Electrónica, Telecomunicações e Informática
DETI
10
Organização da tabela (bitmap) de clusters livres - 1
A tabela (bitmap) de clusters livres constitui um array de bits indicativo de parte dos clusters da zona de dados que presentemente não estão associados a qualquer ficheiro; cada bit do array referencia um cluster específico, aquele cujo número lógico corresponde ao respectivo índice.
fctable_pos
O incremento de fctable_pos é feito sempre módulo dzone_total.
Departamento de Electrónica, Telecomunicações e Informática
DETI
11
Organização da tabela (bitmap) de clusters livres - 2
O principal problema associado com a manipulação da tabela (bitmap) de clusters livres em linguagem C é o facto da linguagem não providenciar um tipo de dados que represente directamente bits, muito embora forneça um grupo alargado de operadores para manipulação de bits sobre operandos de vírgula fixa.
#define NP (dzone_total / 8)#define N (((dzone_total % 8) == 0) ? NP : (NP + 1))unsigned char fcBMapT[N];
0 0 1 0 1 1 1 0 1 0 0 0 1 1 0 1 1 1 1 0 0 1 0 0 0 1 1 0 0 0 1 1
fcBMapT[0] fcBMapT[1] fcBMapT[2] fcBMapT[3]
Departamento de Electrónica, Telecomunicações e Informática
DETI
12
Organização da tabela (bitmap) de clusters livres - 3
nClustnByte
nBit
mask = 0x80 >> nBit;if ((fcBMapT[nByte] & mask) == mask) /* elemento igual a 1 */ else /* elemento igual a 0 */
Teste do elemento da tabela de bitmap de índice nClust
mask = 0x80 >> nBit;fcBMapT[nByte] &= ~mask;
Reset do elemento da tabela de bitmap de índice nClust
mask = 0x80 >> nBit;fcBMapT[nByte] |= mask;
Set do elemento da tabela de bitmap de índice nClust
Departamento de Electrónica, Telecomunicações e Informática
DETI
13
Reserva de um cluster de dados - 1
if (dzone_retriev.cache_idx == DZONE_CACHE_SIZE) { /* the retrival cache is empty, replenish it */ replenish (); }nClust = dzone_retriev.cache[dzone_retriev.cache_idx];dzone_retriev.cache[dzone_retriev.cache_idx] = NULL_CLUSTER;dzone_retriev.cache_idx += 1;dzone_free -= 1;
Algoritmo geral sobre a cache de retirada (pseudo-código)
Departamento de Electrónica, Telecomunicações e Informática
DETI
14
Reserva de um cluster de dados - 2
nclustt = (dzone_free < DZONE_CACHE_SIZE) ? dzone_free : DZONE_CACHE_SIZE;pos = fctable_pos;n = DZONE_CACHE_SIZE - nclustt;do{ convertRefToBitMap (pos, &nByte, &nBit); mask = 0x80 >> nBit; if (fcBMapT[nByte] & mask) == mask) { dzone_retriev.cache[n] = pos; fcBMapT[nByte] &= ~mask; n += 1; } pos = (pos + 1) % dzone_total;} while ((n < DZONE_CACHE_SIZE) && (pos != fctable_pos));
Algoritmo geral sobre o repovoamento da cache de retirada (pseudo-código)
Departamento de Electrónica, Telecomunicações e Informática
DETI
15
Reserva de um cluster de dados - 3
if (n != DZONE_CACHE_SIZE) { /* deplete the insertion cache to get the remaining references */ deplete (); do { convertRefToBitMap (pos, &nByte, &nBit); mask = 0x80 >> bitOff; if (fcBMapT[nByte] & mask) == mask) { dzone_retriev.cache[n] = pos; fcBMapT[nByte] &= ~mask; n += 1; } pos = (pos + 1) % dzone_total; } while (n < DZONE_CACHE_SIZE); }dzone_retriev.cache_idx = DZONE_CACHE_SIZE - nclustt;fctable_pos = pos;
Algoritmo geral sobre sobre o repovoamento da cache de retirada (pseudo-código) – continuação
Departamento de Electrónica, Telecomunicações e Informática
DETI
16
Reserva de um cluster de dados - 4
Validação de conformidade
•o ponteiro para a região de armazenamento da referência do cluster de dados reservado não pode ser nulo
• tem que haver pelo menos um cluster de dados livre.
Validação de consistência
•a informação contida no superbloco sobre a zona de dados (caches de retirada e de inserção incluídas) e na lista (bitmap) de clusters livres tem que estar correcta.
Departamento de Electrónica, Telecomunicações e Informática
DETI
17
Libertação de um cluster de dados - 1
if (dzone_insert.cache_idx == DZONE_CACHE_SIZE) { /* the insertion cache is full, deplete it */ deplete (); }dzone_insert.cache[dzone_insert.cache_idx] = nClust;dzone_insert.cache_idx += 1;dzone_free += 1;
Algoritmo geral sobre a cache de inserção (pseudo-código)
Departamento de Electrónica, Telecomunicações e Informática
DETI
18
Libertação de um cluster de dados - 2
for (n = 0; n < dzone_insert.cache_idx; n++){ convertRefToBitMap (dzone_insert.cache[n], &nByte, &nBit); fcBMapT[nByte] |= (0x80 >> nBit); dzone_insert.cache[n] = NULL_CLUSTER;}dzone_insert.cache_idx = 0;
Algoritmo geral sobre o esvaziamento da cache de inserção (pseudo-código)
Departamento de Electrónica, Telecomunicações e Informática
DETI
19
Libertação de um cluster de dados - 3
Validação de conformidade
•a referência do cluster de dados a libertar tem que estar na gama adequada (não pode ser 0 e tem que ser um valor válido)
•a referência do cluster de dados a libertar tem que corresponder a um cluster de dados que foi previamente reservado.
Validação de consistência
•a informação contida no superbloco sobre a zona de dados (caches de retirada e de inserção incluídas) e na lista (bitmap) de clusters livres tem que estar correcta.
Departamento de Electrónica, Telecomunicações e Informática
DETI
20
Cenários de teste - 1
#!/bin/bash
# This test vector deals with the operations alloc / free inodes.# It defines a storage device with 16 blocks and formats it with an inode table# of 8 inodes.# It starts by allocating all the inodes and testing several error conditions.# Then, it frees all the allocated inodes in the reverse order of allocation# while still testing different error conditions.# The showblock_sofs13 application should be used in the end to check metadata.
./createEmptyFile myDisk 16
./mkfs_sofs13 -n SOFS13 -i 8 -z myDisk
./testifuncs13 -b -l 600,700 -L testVector1.rst myDisk <testVector1.cmd
Departamento de Electrónica, Telecomunicações e Informática
DETI
21
Cenários de teste - 2
#!/bin/bash
# This test vector deals with the operations alloc / free inodes.# It defines a storage device with 18 blocks and formats it with an inode table# of 24 inodes.# It starts by allocating successive inodes until there are no more inodes.# Then, it frees all the allocated inodes in a sequence where an inode stored in# a different block of the table is taken in succession. Finally, it procedes to# allocate two inodes.# The showblock_sofs13 application should be used in the end to check metadata.
./createEmptyFile myDisk 18
./mkfs_sofs13 -n SOFS13 -i 24 -z myDisk
./testifuncs13 -b -l 600,700 -L testVector2.rst myDisk <testVector2.cmd
Departamento de Electrónica, Telecomunicações e Informática
DETI
22
Cenários de teste - 3
#!/bin/bash
# This test vector deals with the operations alloc / free data clusters.# It defines a storage device with 20 blocks and formats it with an inode table# of 8 inodes.# It starts by allocating all the data clusters and testing the error condition.# Then, it frees all the allocated data clusters in the reverse order of# allocation while still testing different error conditions.# The showblock_sofs13 application should be used in the end to check metadata.
./createEmptyFile myDisk 20
./mkfs_sofs13 -n SOFS13 -i 8 -z myDisk
./testifuncs13 -b -l 600,700 -L testVector3.rst myDisk <testVector3.cmd
Departamento de Electrónica, Telecomunicações e Informática
DETI
23
Cenários de teste - 4
!/bin/bash
# This test vector deals with the operations alloc / free data clusters.# It defines a storage device with 20 blocks and formats it with an inode table# of 8 inodes.# It starts by allocating all the data clusters and testing the error condition.# Then, it frees all the allocated data clusters in the reverse order of# allocation while still testing different error conditions. Finally, it# allocates a data cluster.# The showblock_sofs13 application should be used in the end to check metadata.
./createEmptyFile myDisk 20
./mkfs_sofs13 -n SOFS13 -i 8 -z myDisk
./testifuncs13 -b -l 600,700 -L testVector4.rst myDisk <testVector4.cmd
Departamento de Electrónica, Telecomunicações e Informática
DETI
24
Cenários de teste - 5
#!/bin/bash
# This test vector deals with the operations alloc / free data clusters.# It defines a storage device with 524 blocks and formats it with an inode table# of 32 inodes.# It starts by allocating all the data clusters. Then, it frees all the# allocated data clusters in the reverse order of allocation. Finally, it# allocates a data cluster.# The showblock_sofs13 application should be used in the end to check metadata.
./createEmptyFile myDisk 524
./mkfs_sofs13 -n SOFS13 -i 8 -z myDisk
./testifuncs13 -b -l 600,700 -L testVector5.rst myDisk <testVector5.cmd
Departamento de Electrónica, Telecomunicações e Informática
DETI
25
Possibilidade de teste isolado de funções
CC = gccCFLAGS = -Wall -I "../debugging" -I "../rawIO13"#IFUNCS1 = sofs_ifuncs_1/soAllocInode.o sofs_ifuncs_1/soFreeInode.o \# sofs_ifuncs_1/soAllocDataCluster.o sofs_ifuncs_1/soFreeDataCluster.oIFUNCS1 = sofs_ifuncs_1/soFreeInode.o
all: ifuncs1 libsofs13
ifuncs1:make -C sofs_ifuncs_1 all
libsofs13: sofs_blockviews.o sofs_basicoper.o $(IFUNCS1)ar -r libsofs13.a $^ sofs_basicconsist.ocp libsofs13.a ../../librm -f $^ libsofs13.a
clean:rm -f ../../lib/libsofs13.a
make -C sofs_ifuncs_1 clean
escrever aqui o caminho das funçõesque pretende testar(neste caso, só é testada a funçãosofs_ifuncs_1/soFreeInode.o)Note que no fim todas as funções têmque estar incluídas!
Ficheiro Makefile do directório sofs13
Departamento de Electrónica, Telecomunicações e Informática
DETI
26
Descarregamento do pacote
[ruib@ruib-laptop2 teste]$ lltotal 1276drwxr-xr-x 6 ruib ruib 4096 Sep 23 00:08 SOFS13_alunos-rw-r--r-- 1 ruib ruib 329188 Sep 29 01:53 SOFS13_alunos2.zip[ruib@ruib-laptop2 teste]$
ruib@ruib-laptop2 teste]$ unzip SOFS13_alunos2.zipArchive: SOFS13_alunos2.zip inflating: SOFS13_alunos/lib/libsofs13bin.a replace SOFS13_alunos/run/mkfs_sofs13_bin? [y]es, [n]o, [A]ll, [N]one, [r]ename: A
Recommended