vibecode the entire rgz ig

This commit is contained in:
2026-05-18 16:59:56 +07:00
parent 0b31a50c20
commit ba6614d7a9
8 changed files with 2286 additions and 0 deletions
+204
View File
@@ -0,0 +1,204 @@
# Отчет по дисциплине «Операционные системы»
## РГР «Разработка простой файловой системы»
**Выполнил:** ____________________
**Группа:** ____________________
**Проверил:** ____________________
**Новосибирск, 2026**
## Оглавление
1. [Введение](#введение)
2. [Постановка задачи](#постановка-задачи)
3. [Выбранная архитектура файловой системы](#выбранная-архитектура-файловой-системы)
4. [Структура носителя и основные данные](#структура-носителя-и-основные-данные)
5. [Реализованные операции](#реализованные-операции)
6. [Алгоритмы работы](#алгоритмы-работы)
7. [Тестирование](#тестирование)
8. [Ограничения реализации](#ограничения-реализации)
9. [Вывод](#вывод)
## Введение
Цель работы — разработать учебную файловую систему на языке C, использующую обычный бинарный файл как виртуальный носитель произвольного доступа. Программа должна не только хранить файлы и каталоги, но и показывать основные принципы настоящих файловых систем: разметку носителя, учет свободного места, хранение метаданных, работу с путями и прикладные операции обслуживания.
В качестве ориентира использовался предоставленный пример реализации, однако приоритет был отдан требованиям задания. Поэтому итоговая программа сохраняет простую учебную архитектуру примера, но дополнительно реализует операции `open`, `close`, `seek`, `read`, `write`, `rename`, импорт и экспорт, дефрагментацию и сжатие.
## Постановка задачи
Согласно заданию необходимо разработать систему управления файлами, где разделом является бинарный файл произвольного доступа. Реализация должна включать:
- физический уровень хранения данных;
- структуру учета свободных блоков;
- базовый уровень с индексными метаданными;
- размещение содержимого файлов;
- систему каталогов и путей;
- символьные операции над файлами и каталогами;
- прикладную утилиту для форматирования, просмотра, импорта, экспорта, дефрагментации и сжатия.
## Выбранная архитектура файловой системы
| Уровень | Реализация |
| --- | --- |
| Физический уровень | Кластеры фиксированного размера по 1024 байта |
| Учет свободного места | Битовая карта |
| Базовый уровень | Индексный файл с дескрипторами объектов |
| Размещение файлов | Список номеров кластеров в дескрипторе |
| Каталоги | Неупорядоченный список имен с линейным поиском |
| Прикладной уровень | Интерактивная консольная утилита |
Выбранная схема хорошо подходит для учебной реализации: она достаточно близка к реальным файловым системам, но не требует сложных деревьев, журналирования и динамических таблиц.
```mermaid
flowchart LR
A[Файл-носитель] --> B[Суперблок]
A --> C[Битовая карта]
A --> D[Индексный файл]
A --> E[Область данных]
D --> F[Файлы]
D --> G[Каталоги]
F --> E
```
## Структура носителя и основные данные
В начале виртуального диска находится суперблок. Он хранит сигнатуру файловой системы, размер диска, размер кластера, смещения служебных областей и индекс корневого каталога.
```c
typedef struct {
uint32_t magic;
uint32_t disk_size;
uint32_t cluster_size;
uint32_t total_clusters;
uint32_t bitmap_offset;
uint32_t bitmap_size;
uint32_t index_offset;
uint32_t index_clusters;
uint32_t data_start_cluster;
uint32_t root_index;
} SuperBlock;
```
После суперблока располагается битовая карта. Каждый ее бит соответствует одному кластеру: `0` означает свободный кластер, `1` — занятый. Далее находится индексный файл, представленный массивом дескрипторов `Entry`.
```c
typedef struct {
char name[32];
uint8_t type;
uint8_t compressed;
uint32_t parent;
uint32_t size;
uint32_t stored_size;
uint32_t cluster_count;
uint32_t clusters[128];
} Entry;
```
Поле `size` хранит логический размер файла, видимый пользователю, а `stored_size` — фактическое количество байт на носителе. Это различие необходимо для поддержки сжатых файлов.
```mermaid
flowchart TB
S[Суперблок] --> B[Битовая карта]
B --> I[Индексный файл]
I --> D[Область данных]
I --> R[Корневой каталог /]
R --> F[Дескрипторы файлов и каталогов]
F --> D
```
## Реализованные операции
Программа собирается из файла `simplefs.c` и запускается с именем файла-носителя:
```bash
gcc -std=c11 -Wall -Wextra -pedantic simplefs.c -o simplefs
./simplefs disk.img
```
Поддерживаются следующие команды:
| Команда | Назначение |
| --- | --- |
| `format <KiB>` | создание новой файловой структуры |
| `info` | сведения о носителе и свободном месте |
| `ls [path]`, `pwd`, `cd <path>` | просмотр и навигация по каталогам |
| `mkdir`, `rmdir` | создание и удаление каталогов |
| `touch`, `rm`, `rename` | операции над файлами |
| `write`, `cat` | запись и чтение текстовых данных |
| `import`, `export` | импорт и экспорт отдельных файлов |
| `importdir`, `exportdir` | импорт и экспорт папок |
| `savecarrier`, `loadcarrier` | экспорт и импорт всего носителя |
| `compress` | сжатие файла методом RLE |
| `defrag` | упорядочивание занятых кластеров |
На уровне программного интерфейса реализованы функции `fs_open`, `fs_close`, `fs_seek`, `fs_read` и `fs_write`. Открытый файл использует буфер в памяти, поэтому чтение и запись записей произвольной длины выполняются без прямой работы пользователя с кластерами.
## Алгоритмы работы
### Форматирование
При выполнении `format` создается бинарный файл нужного размера, вычисляются размеры служебных областей, резервируются занятые кластеры и создается корневой каталог `/`.
### Выделение свободного кластера
Алгоритм линейно просматривает битовую карту, начиная с области данных. Первый свободный бит помечается как занятый, а номер соответствующего кластера возвращается вызывающей функции.
### Работа с каталогами
Каталог не хранит отдельный массив дочерних элементов. Вместо этого у каждого дескриптора есть поле `parent`, содержащее индекс родительского каталога. Для поиска элемента программа просматривает индексный файл и сравнивает имя и родителя.
### Сжатие
Команда `compress` использует простой алгоритм RLE: одинаковые подряд идущие байты заменяются парой «количество + значение». Если сжатый вариант не меньше исходного, файл не изменяется. При чтении сжатый файл автоматически восстанавливается в обычный вид.
### Дефрагментация
Команда `defrag` временно считывает содержимое файлов, очищает карту размещения области данных и записывает файлы заново подряд. После операции используемые кластеры становятся компактно расположенными.
## Тестирование
Пример базового сценария:
```text
format 512
mkdir /docs
touch /docs/a.txt
write /docs/a.txt aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
cat /docs/a.txt
compress /docs/a.txt
ls /docs
rename /docs/a.txt b.txt
export /docs/b.txt exported.txt
defrag
info
```
Ожидаемые результаты:
| Проверка | Результат |
| --- | --- |
| Форматирование носителя | создается корректный виртуальный диск |
| Создание каталога и файла | объекты появляются в `ls` |
| Запись и чтение | `cat` выводит ранее записанный текст |
| Сжатие повторяющихся данных | `stored_size` становится меньше `size` |
| Переименование | файл доступен под новым именем |
| Экспорт | создается внешний файл с тем же содержимым |
| Дефрагментация | содержимое файлов сохраняется, кластеры уплотняются |
## Ограничения реализации
| Ограничение | Причина |
| --- | --- |
| Не более 128 объектов | фиксированный размер индексного файла |
| Не более 128 кластеров на файл | фиксированный массив номеров кластеров |
| Длина имени до 31 символа | размер поля `name[32]` |
| Линейный поиск по каталогу | выбрана простая неупорядоченная структура |
| RLE эффективно не для всех данных | алгоритм выбран ради понятности реализации |
| Нет одновременного доступа нескольких процессов | учебная однопользовательская модель |
## Вывод
В ходе работы была реализована простая файловая система, работающая поверх бинарного файла как виртуального носителя. Реализация охватывает все основные уровни, указанные в задании: физическое размещение, учет свободных блоков, индексные метаданные, каталоги, операции над файлами и сервисные команды управления носителем.
Полученная программа остается достаточно простой для изучения начинающим разработчиком на C, но при этом показывает полный путь данных: от пользовательской команды до изменения битовой карты, индексного дескриптора и байтов в кластерах виртуального диска.