Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lections_v2.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
10.99 Mб
Скачать

Лекция 3. 17.02.2014

Структура dentry. Используется для представления файлов в системе.

Разделение различных действий в системе в зависимости от удаленности от аппаратуры.

Большая часть ПО не взаимодействует с аппаратной частью.

Основное назначение системы — управление процессами и выделение процессам ресурсов. Ресурсы включают в себя программные и аппаратные компоненты. Аппаратными компонентами в том числе являются устройства ввода-вывода. Функции системы должны рассматриваться в зависимости от уровня.

Файл — любая поименованная совокупность данных, хранящихся на диске.

Идентификатор процесса — номер в таблице процессов. Идентификатор файла сложнее. Файл описывается структурами. Система работает с открытыми файлами (например, команда fopen). Открытый файл — файл, с которым процесс работает в данный момент времени. Как программа отличается от процесса, так файл отличается от открытого файла. Открытие файла — установка связи (assign в Паскале).

Наиболее важным ресурсом, который управляется ядром системы, является файловая система. Любая интерпретация содержимого файла выполняется программами. Три стандартных потока: stdin (id 0), stdout (id 1), stdr (id 2).

Пример. Вызов assign в Паскале устанавливает логическую связь с файлом.

Открытые файлы.

Прежде, чем что-то делать с файлом, файл необходимо открыть. Функция open (си).

open()

//open()

#include <fcntl.h>

int open(const char *pathname, int oflag, .../*mode_t mode */);

//... - стандарт ISO Си 98 года. Количество остальных аргументов и их типы могут варьироваться

// open возвращает значение типа инт. Это и есть файловый дескриптор, которым оперирует процесс. 0, 1, 2 - дескрипторы

// stdin, stdout, stdr

fd = open("myfile", O_RDWR|O_CREAT|O_EXCL, 0644);

/*флаги:

O_RDWR - открывает файл для чтения и записи

O_CREAT - файл создается

O_EXCL - ошибка, если файл существует

комбинация флагов 2 и 3 выполняет создание файла и проверку его существования атомарно (неделимо) (см. Стивен)

Системный вызов open возвращает целое число - файловый дескриптор. применяется, как ид-тор файла и затем передается вызовом

read или write. Получить файловый дескриптор открытого файла можно с помощью библиотечной функции fileno() */

int fileno(FILE *f); //stdin lib

/* если в функции open указан флаг create, то должно быть заполнено третье поле (в примере 0644). В нем указываются права доступа для пользователя, группы и остальных. Единообразный подход UNIX.*/

У любого процесса есть дескрипторы stdin, stdout, stdr.

Работа системы с открытыми файлами (рис1). Файловый ввод-вывод.

FileDescr table на соответствующий дескриптор получает указатель, который указывает на структуру в таблице открытых файлов.

Status — read, write

Offset — текущее смещение. Все файлы имеют непрерывное логическое адресное пространство.

Vnode — указатель на виртуальный узел

ref count (reference count) — количество ссылок

Для процесса 1421 существует два открытых файла: стандартный поток ввода (клавиатура) и открытый для записи файл 4. В таблице открытых файлов на все файлы уставлено количество ссылок = 1.

Virtual node table. В этой таблице есть поле тип (обычный/специальный файл(устройство))

fun ptr - указатель на список операций, которые можно выполнять с файлом

inode - структура. Связана с физическим файлом и определяет физическое место хранения файла (позволяет осуществить доступ к физическому файлу).

Ref count — количество ссылок.

Все эти таблицы находятся на разных уровнях.

Опасности при работе с файлами.

Гонки (race condition). Критические секции, критические операции.

Два параллельно выполняющихся процесса открывают один и тот же файл. Процессы идентифицированы в системе, для них созданы соответствующие дескрипторы.

Рассмотрим следующую ситуацию: процесс 1421 решает добавить запиь в конец файла. Для этого он сначала вызывает lseek, затем write.

Процесс 1215 хочет сделать то же самое.

Пусть 1421 успел выполнить операции до завершения своего кванта. 1215 вызвал lseek, получил конец файла, записал свои данные, размер файла изменился. 1421 получил квант. У него уже есть адрес конца файла. Он по этому адресу написал информацию и тем самым затер данные, которые записал 1215.

Решение (экз):

Необходимо иметь некоторую атомарную операцию — неделимое действие, которое позволит без потери данных изменять файл. Таким действием является append. Если файл открыт с флагом O_APPEND (предполагает запись в конец файла), соответствующий статус будет прописан в таблице открытых файлов. Каждый раз, когда будет выполняться системный вызов write, смещение будет указывать на конец файла с его текущим размером. Системный вызов open с флагом APPEND является неделимым (атомарным), т. е. каждой операции append гарантируется неделимость.

Важными с точки зрения работы с файлами являются функции dup и dup2. Создают дубликат дескриптора существующего файла. Обе функции возвращают новый дескриптор или -1.

// функции dup и dup2

int dup(int fd);

int dup2(int fd, int fd2);

Функция dup гарантирует, что возвращаемый файловый дескриптор будет иметь наименьшее возможное значение. Замечание: поэтому функция dup используется для того, чтобы получить указатель на stdin. Dup2 содержит второй параметр fd2, который указывает, куда скопировать fd.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]