- •Архитектура ОС UNIX
- •Контрольные вопросы
- •Функции для работы с файловой системой (системные функции)
- •Open
- •Open. Процесс 1
- •Open. Процесс 2
- •read
- •Алгоритм работы read
- •Алгоритм работы read
- •Read. Пример
- •Конкурирующие процессы
- •write
- •write
- •Указание позиции в файле, где будет выполняться ввод-вывод
- •close(fd)
- •Close
- •creat
- •mknod – создание спецфайлов
- •Процесс запоминает индекс нового каталога
- •stat(pathname,statbuffer);
- •Каналы
- •Каналы
- •Каналы
- •Пример использования каналов
- •Монтирование
- •Монтирование
- •Таблица монтирования:
- •Монтирование
- •Ссылки
- •Целостность файловой системы
- •АБСТРАКТНЫЕ ОБРАЩЕНИЯ К ФАЙЛОВЫМ СИСТЕМАМ
- •СОПРОВОЖДЕНИЕ ФАЙЛОВОЙ СИСТЕМЫ
Конкурирующие процессы
Со стороны системы было бы несправедливо держать индекс заблокированным все время от момента, когда процесс открыл файл, и до того момента, когда файл будет закрыт этим процессом, поскольку тогда один процесс будет держать все время файл открытым, тем самым не давая другим процессам возможности обратиться к файлу.
Ядро снимает с индекса блокировку по окончании выполнения каждого вызова системной функции, использующей индекс.
write
number = write(fd,buffer,count)
fd – файловый дескриптор, полученный из open
buffer – адрес структуры данных
count – количество байт, которые нужно записать
number – реально записанные байты
write
Алгоритм записи в обычный файл похож на алгоритм чтения из обычного файла.
Если в файле отсутствует блок, соответствующий смещению
вбайтах до места, куда должна производиться запись, ядро выделяет блок, используя алгоритм alloc, и присваивает ему номер в соответствии с точным указанием места в таблице содержимого индекса.
Индекс блокируется на все время выполнения функции write, так как ядро может изменить индекс, выделяя новые блоки; разрешение другим процессам обращаться к файлу может разрушить индекс, если несколько процессов выделяют блоки одновременно, используя одни и те же значения смещений.
Когда запись завершается, ядро корректирует размер файла
виндексе, если файл увеличился
Указание позиции в файле, где будет выполняться ввод-вывод
position = lseek(fd,offset,reference);
fd – файловый дескриптор, полученный из open offset – смещение в байтах
reference – указывает, является ли смещение от начала файла, от текущей позиции или от конца файла
Значение смещения указывается в таблице файлов.
close(fd)
Close
Ядро выполняет операцию закрытия, используя дескриптор файла и информацию из соответствующих записей в таблице файлов и таблице индексов.
Если счетчик ссылок в записи таблицы файлов имеет значение, большее, чем 1, то это означает, что на запись в таблице файлов делают ссылку другие пользовательские дескрипторы
Ядро уменьшает значение счетчика и операция закрытия завершается. Если счетчик ссылок в таблице файлов имеет значение, равное 1, ядро освобождает запись в таблице и индекс в памяти, ранее выделенный системной функцией open.
Когда процесс завершается, ядро проверяет наличие активных пользовательских дескрипторов файла, принадлежавших процессу, и закрывает каждый из них.
creat
fd = creat(pathname,modes)
Ядро ищет в каталоге файл с заданным именем
Ядро отмечает смещение в байтах до первой пустой позиции в каталоге и запоминает это смещение в пространстве процесса
Ядро также запоминает в пространстве процесса индекс
просматриваемого каталога и держит индекс заблокированным
Ядро проверяет наличие у процесса разрешения на запись в каталог
Ядро назначает новому файлу индекс
Записывает имя нового файла и номер вновь выделенного индекса в родительский каталог, освобождает родительский каталог
Ядро записывает вновь выделенный индекс на диск, прежде чем записать на диск каталог с новым именем
mknod – создание спецфайлов
mknod(pathname,type and permissions,dev)
pathname – имя
type and permissions – тип вершины (каталог, канал, файл устройств) и права доступа к файлу
dev – старший и младший номера устройств
Процесс запоминает индекс нового каталога
chdir(pathname); смена каталога chroot(pathname); смена корневого каталога
Смена владельца или прав доступа является операцией, производимой над
индексом
chown(pathname,owner,group)
chmod(pathname,mode)
stat(pathname,statbuffer);
fstat(fd,statbuffer);
Системные функции stat и fstat позволяют процессам запрашивать информацию о статусе файла: типе файла, владельце файла, правах доступа, размере файла, числе связей, номере индекса и времени доступа к файлу