Файловая система и ее функции. Буферизация ввода-вывода. Потоки ввода-вывода (stream). Стандартный ввод-вывод. Представление устройств в виде файлов.


Файловые системы. Файловая система – это часть общей системы управления памятью, ответственная преимущественно за управление файлами, которые хранятся во внешней памяти. Она отвечает также за обеспечение возможности хранить частную или личную информацию, контролируя разделение информации между многими пользователями. Функции ФС: 1)  ФС должна предоставлять пользователям возможность создавать, модифицировать и уничтожать файлы; 2)  ФС должна разделять файлы друга от друга под тщательным контролем с тем, чтобы они могли эффективно взаимодействовать при выполнении общей работы; 3)  механизм для разделения файлов должен предусматривать различные варианты контролируемого доступа, н-р, доступ для чтения, для записи, для выполнения или различные сочетания этих видов доступа; 4)  задавать удобные для пользователей структуры файлов; 5)  управлять передачей информации между файлами, распределение памяти между файлами; 6)  в ФС должны быть предусмотрены средства сохранности и восстановления; 7)  файлы должны быть независимы от устройств (должны обращаться к своим файлам с помощью символических имён, а не через имена физических устройств); 8)  шифрование и дешифрование данных; 9)   ФС должна иметь дружественный интерфейс с пользователем; 10) Обеспечение прав доступа к файлу (авторизация). Буферизация позволяет производить вычисления одновременно с операциями ввода/вывода. В основной памяти выделяются определённые участки, где можно расположить несколько физических блоков файла сразу. Каждый из этих участков называется буфером. Наиболее распространённая система буферизации носит название двойной буферизации и работает так: существует 2 буфера. Сначала записи, формируемые работающим процессом, помещаются в 1-ый буфер, пока он не будет заполнен. После этого инициализируется передача блока данных из первого буфера во внешнюю память. Во время выполнения этой передачи процесс продолжает формировать записи, которые теперь помещаются во второй буфер. Когда второй буфер заполнится и завершится передача данных из первого буфера, инициализируется передача данных из второго буфера. Снова формируемые процессом записи помещаются в первый буфер. Такое переключение с буфера на буфер позволят выполнять операции ввода/вывода параллельно с вычислениями.

Потоки ввода/вывода:

Потоком называется абстрактное понятие, относящееся к любому переносу данных от источника к приёмнику данных. Файлы – это последовательный поток байтов. Для открытых файлов используются классы потоков ввода/вывода. При открытии файла создаётся соответствующий объект, с которым связан поток. Поток является каналом связи между объектом и устройством или файлом на диске, которые в программе выступают под именем объекта.

Функции нижнего уровня, функции файлового ввода/вывода.

Эти функции выполняют небуферизированный ввод/вывод. При открытии файла с ним связывается дескриптор файла. Он принимает целые значения и используется в последующих операциях с файлом: 1)  функция открытия файла open(); 2)  чтение read(); 3)  запись write().

Представление устройств в идее файлов.

Стандартный ввод-вывод

Файл с именем stdin – устройство стандартного ввода (файловый дескриптор всегда 0), stdout – стд. вывода (дескриптор 1). Драйвер устройства общается с физическим устройством, а программа работает как бы с файлами вместо реальных устройств. Непосредственным общением с устройством заведует драйвер и BIOS.

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

Стандартные потоки (файлы) при запуске программы можно направлять на конкретные физические устройства (символьный дисплей, файл, принтер, модем, пустое устройство (NUL), и др.)

Например, вывод в программе при помощи функции printf – это вывод на устройство (файл)  stdout. По умолчанию вывод направляется на дисплей.

При запуске программы следующей командной строкой:

Program > filename

вывод будет перенаправлен в файл filename.

> - оператор перенаправления стандартного вывода.

Program < filename

Программа будет получать данные не с клавиатуры, а из файла.

< - оператор перенаправления стандартного ввода.

Program1 | Program2

вывод первой программы будет перенаправлен на стандартный ввод второй.

| - оператор перенаправления.

Таким образом, не изменяя код программы, изменили ее поведение.

Гибкость.