Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Уточнение задания v2.1.docx
Скачиваний:
1
Добавлен:
22.11.2019
Размер:
36.2 Кб
Скачать

Пояснение задания

В результате некоторого обсуждения программы было решено отойти от представления модели в виде файла с блоками по 512 байт и перейти к представлению в виде класса. В результате такого перехода работа над программой упрощается до безобразия. Класс содержит только поля, к которым действительно необходимо обращаться в процессе работы и процесс обращения к данным на порядок проще, чем в случае с файлом. Кроме того, было решено отказаться от представления самой информации, содержащейся в системе, то есть работать предполагается только с таблицей размещения(каталогом) файлов.

Структура полей класса файловой системы:

Вот описание полей класса, а заодно и конструктора с деструктором:

struct SB{ //системный блок

unsigned short vers; //версия системы

char tomename[12];//метка тома

char ownername[12];//имя владельца

char sysname[12];//имя системы

};

struct FRec{ //запись о файле

unsigned short rectype; //тип записи

char name[6];//имя файла

char type[4]; //тип файла

unsigned short len; //число блоков, занимаемых файлом

unsigned short date;//дата создания файла

};

struct segment{//сегмент

unsigned short catsize;//размер каталога

unsigned short nextseg;//номер следующего сегмента

unsigned short seginuse;//счетчик используемых сегментов

unsigned short startblock;//номер блока на носителе, с которого размещаются файлы, описанные в сегменте

FRec files[63];//таблица записей о файлах

};

class FS{//файловая система

SB sb;//системный блок

segment *catalog;//каталог-массив сегментов

public:

FS(unsigned long size, unsigned short V, char* NT, char* NO, char *NS);//конструктор класса, будет форматировать систему

~FS();

};

FS::FS(unsigned long size, unsigned short V, char* NT, char* NO, char *NS) {

sb.vers=V;

int i=0;

for (i=0; NT[i]; i++)//записывается информация в системный блок

sb.tomename[i]=NT[i];

for (; i<12; i++)

sb.tomename[i]=0;

for (i=0; NO[i]; i++)

if (NO[i]!='\0') sb.ownername[i]=NO[i];

for (; i<12; i++)

sb.ownername[i]=0;

for (i=0; NS[i]; i++)

if (NS[i]!='\0') sb.sysname[i]=NS[i];

for (; i<12; i++)

sb.sysname[i]=0;

unsigned long CS=size/62+1;//расчитывается...

unsigned char cs=CS;

if (cs>31) cs=31;

if (cs==0) cs=1;

catalog= new segment[cs];//...и выделяется память под каталог

for (unsigned char i=0; i<cs; i++){

catalog[i].catsize=cs;//заполняются заголовки сегментов

catalog[i].nextseg=i+1;

catalog[i].seginuse=1;

catalog[i].startblock=0;

catalog[i].files[0].rectype=5;//в сегментах создаются записи-признаки конца записей(аналог символа '0', указывает, что нужно прекратить чтение из сегмента)

}

catalog[0].startblock=6+2*cs;// в первом сегменте редактируется заголовок,...

catalog[0].files[1]=catalog[0].files[0];//...запись-признак конца записей сдвигается вниз,...

catalog[0].files[0].rectype=2;//...на первое место добавляется запись о нераспределенной памяти...

catalog[0].files[0].len=size-(6+2*cs);// ...размером, соответствующим размеру оставшейся памяти

catalog[cs-1].nextseg=0;//в последнем сегменте каталога указывается, что после него нет сегметов

}

FS::~FS(){

delete catalog;

};

В блоке системной информации указывается версия системы, её имя, владелец и метка тома. Каталог состоит из сегментов, сегменты состоят из заголовка и 63-х записей о файлах. Заголовок сегмента содержит количество сегментов в каталоге, номер следующего сегмента, счетчик используемых сегментов и номер блока (адрес), с которого начинается размещение файлов, указанных в сегменте. Записи о файлах содержат тип записи, имя файла, тип файла, его размер и дату создания.

В работе используются 3 типа записи о файлах:

  • 2-запись о свободной области

  • 3-запись о файле

  • 5-признак конца записей в сегменте

Работа с каталогом:

  • Первоначально, после того как файловая система отформатирована , в 1-м сегменте содержатся 2 записи- запись о всем свободном пространстве на диске(о нераспределенной памяти) и запись-признак конца записей в сегменте. В остальных сегментах содержится 1 запись-признак конца записей.

  • При добавлении файла в систему в таблице определяется запись о свободной области подходящего размера, на её место добавляется запись о созданном файле, все последующие записи сдвигаются на одну позицию вниз и на освободившееся место (после созданной записи о файле) добавляется запись о свободной области с размером, равным разнице размеров записанного файла и исходной свободной области.

  • При удалении файла тип записи о нем в таблице изменяется на «запись о свободной области». Позднее на это место в таблице может быть записан другой файл, размер которого меньше либо равен размеру этой области.

  • Постепенно, по мере удаления файлов из системы, в таблице образуется много небольших свободных мест, которые затрудняют рациональное использование памяти. Чтобы прекратить это безобразие проводится дефрагментация- все свободные области сдвигаются в старшие адреса памяти, т.е. в конец таблицы, где образуется одна запись о нераспределенной памяти.

Как уже было сказано, от моделирования работы с самими файлами на диске решено отказаться, т.е. работа происходит только с таблицей.