Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






УТОЧНЕНИЕ ЗАДАНИЯ ПО ТП v2.0




Этот, с позволения сказать, документ является переработанной версией своего предшественника. Само задание и основные принципы работы программы остались без изменений, подвергся переработке способ реализации программы. Цель документа- дать более-менее целостное описание структуры и процесса функционирования модели ФС.

Внимание! Это неофициальный документ, использовать его как источник для копирования информации(Ctrl+C Ctrl-V) надо с осторожностью, возможны некоторые неточности; определенные элементы могут быть в дальнейшем изменены.

Текст задания:

МОДЕЛЬ ФАЙЛОВОЙ СИСТЕМЫ ОС РЕАЛЬНОГО ВРЕМЕНИ

Описываемая ниже структура размещения файлов и управляющей ин­формации на носителе (диске, гибком диске и т.д.) называется фай­ловой структурой.

Файлом является совокупность связанных между собой логических записей. Файлы на носителе располагаются в логических блоках, кото­рые имеют фиксированный размер 512 байт. Блоки файла получают пос­ледовательные номера, начиная с 0. Файл размещается в смежных логи­ческих блоках, т.е. является непрерывным.

Информация на носителе распределяется следующим образом:

№ блока Содержание
2-5 6+N+2 Программа первичный загрузчик Блок системной информации Вторичный загрузчик Начало каталога файлов Файлы и свободное место

Блоки 0,1,2,3,4,5 содержат загрузчик или не используются, если носитель не содержит ОС (отсутствуют файлы монитора и драйверов). Блок 1 содержит системную информацию, включающую идентификатор то­ма, имя владельца, таблицу замещения дефектных блоков на резервные и т.д.

Содержимое системного блока:

Байты

0 - 129 - таблица расположения дефектных блоков,

132 - 169 - область сохранения, содержит информацию

для восстановления каталога при ошибоч­ной инициализации,

468 - 469 - номер блока начала каталога,

470 - 471 - версия системы

472 - 483 - имя тома,

484 - 495 - имя владельца,

496 - 507 - название системы.

Остальные байты зарезервированы для использования системными программами.

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

слово 1 - число сегментов, отведенных под каталог,

слово 2 - номер следующего сегмента. Сегменты каталога образуют

список. В последнем используемом сегменте это слово со­держит 0,

слово 3 - счетчик занятых сегментов. При использовании нового сег­мента данное слово корректируется

слово 4 - число дополнительных байтов в каждой записи о файле в

сегменте (не используется),

слово 5 - номер блока на носителе, с которого размещаются файлы,

описанные в данном сегменте.

Запись о файле состоит из 8 слов и дополнительных байтов (если указано в четвертом слове заголовка сегмента):

слово 1 - тип записи,

слово 2-4 - имя файла

слово 5-6 - тип файла

слово 7 - число блоков, занимаемое файлом,

слово 8 - дата создания файла в формате:

разряды 11-15 - номер месяца (1-12),

разряды 06-010 - день (1-31),

разряды 00-05 - год минус 1980. Дополнительные слова не используются

//Примечание: изначально в задании для даты были указаны другие наборы разрядов, однако в них не помещался год, и поэтому пришлось их изменить

Тип записи может принимать следующие значения:

1- запись о временном файле,

2 - запись о свободной области на носителе. Размер свободной области в блоках содержится в 5-ом слове, остальные слова не используются,

3 - запись о постоянном файле,

4 - запись о постоянном файле, защищенном от операции удаления,

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

//Примечание: изначально для типов записей в задании были указаны специальные коды( 001000 и т.д. ), но они не все помещались в переменную типа «слово», поэтому их было решено заменить на простые номера 1,2…

 

ПОЯСНЕНИЕ ЗАДАНИЯ

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

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

Системная информация
Каталог
Сегмент 1
…………
Сегмент N
Запись 63
…………
Запись 1
Заголовок
Дата создания
Размер
Тип файла
Имя файла
Тип записи

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

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 запись-признак конца записей.

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

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

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

 

 

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

 

 

НЕКОТОРЫЕ МОМЕНТЫ

ü Подпрограммы нужно реализовать в виде методов данного класса FS.

ü Наш руководитель (да продлятся его годы) требует, чтобы в процессе работы подпрограмм перехватывались всевозможные ошибки. Ошибки, которые можно предвидеть- отсутствие файла с заданным именем в ФС, недостаток памяти и т.д. могут быть обработаны штатно- подпрограмма обнаруживает наличие такой исключительной ситуации и возвращает соответствующий код ошибки. Остальные ошибки, которые могут возникнуть в подпрограмме из-за невнимательности и кривых рук (деление на ноль, выход за пределы массива и т.д.) могут быть перехвачены с помощью блоков try{}, catch{}. Вот пример:

 

#include <iostream>

using namespace std;

void main()

{

try

{

int i = 10;

int j = 0;

int k = i/j; //Error on this line.

}

catch(...)

{

cout<<"aaaaaaa";

}

cin.get();

}

Т.е. весь текст подпрограммы можно заключить в блок try, а в блоке catch написать

return 1;(код ошибки).

ü В некоторых подпрограммах требуется выводить на экран сообщение(оглавление, информацию о свободном пространстве). Напрямую пользоваться cin нельзя. В подпрограмму в качестве параметра будет передаваться адрес переменной &screen типа stringstream, выводить информацию нужно будет в неё:

screen<<"xyz";

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных