sofs - manipulação das listas de nós-i e de clusters livres

26
DETI Sistemas de Operação Manipulação das listas de nós-i e de clusters livres António Rui Borges

Upload: miguel-azevedo

Post on 24-Oct-2015

17 views

Category:

Documents


3 download

DESCRIPTION

SOFS - manipulação das listas de nós-i e de clusters livres

TRANSCRIPT

DETISistemas de Operação

Manipulação das listas de nós-i e de clusters livres

António Rui Borges

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