Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
46
Добавлен:
10.05.2014
Размер:
919.55 Кб
Скачать

Файловая система

Управление файловой системой в ОС UNIX.

Файловая система - одна из важнейших частей ОС UNIX, во многом определяет ее архитектуру. Имеет многоуровневую иерархическую структуру и предназначена для разделения внешней памяти на файлы. С файловой системой связаны и вопросы ввода / вывода, и информационной связи между процессами и многое другое. Отличительно особенностью ОС UNIX является то, что понятие файла в ней максимально унифицировано. Под файлами понимаются любые источники и потребители информации. Вследствие этого UNIX содержит следующие виды файлов:

  • обычные;

  • каталоги;

  • FIFO файлы;

  • специальные файлы;

  • гнезда

Обычный файл содержит информацию, определяемую пользователем или формирующуюся в результате прикладных и системных программ. Никаких ограничений на информацию, хранящуюся в обычных файлах, не накладывается. Различают текстовые и двоичные (бинарные) файлы, file - определяет тип файла.

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

Обычные файлы могут создаваться, просматриваться, модифицироваться с помощью:

  • редактора;

  • компилятора;

  • отладчика;

  • транслятора.

И удаляться определенными командами файловой системы rm -i *.*

Каталог - содержит информацию о других файлах. Он предоставляет пользователям средства для организации их файлов в некоторую иерархическую систему, основанную на взаимосвязи файлов и направлении их использования. Каталог представляет собой несортированный набор 16ти байтных записей. Каждая запись состоит из 14-тибитного имени файла и номера индексного дескриптора файла. Общий вид файловой системы UNIX можно представить в виде:

Рисунок 12

Существует отличие файловой системы UNIX от MS-DOS\WINDOWS и т.п. заключается оно в возможностях монтирования другой файловой системы в топологию файловой системы UNIX. В файловой системе имеется выделенный корневой каталог. Каждый следующий уровень состоит из каталогов и других файлов, подчиненных корневому. Поэтому легко адресоваться к любому файлу, указав путь, начиная с корневого каталога.

/usr/bin/who - имя файла, указанное подобным образом называется полным.

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

Пример:

ln /usr/bin/who /tmp/ww если в данной команде указать -s , то ссылка будет символической, а не жесткой.

lns /usr/bin/who

Символическая ссылка на файл отличается от жесткой тем, что создается новый индексный дескриптор файла. Есть возможность ссылаться на каталоги, файлы и другие файловые системы, она не изменяет счетчик значений жестких ссылок соответствующего индексного дескриптора. Каталог ОС UNIX считается пустым если он не содержит никаких других файлов, кроме ссылок на текущий и родительский каталоги. Такой каталог можно удалить.

Специальные файлы предназначены для организации взаимодействия ввода/вывода (с периферийными устройствами). Бывают байт-ориентированными и блок-ориентированными. Обычно с каждым внешним устройством связан определенный специальный файл. Прикладная программа может выполнять операции чтения и записи ее специальным файлом также как и с обычным файлом. А ОС будет вызывать автоматически соответствующий драйвер устройства для выполнения фактической передачи данных между физическим устройством и данной программой.

Пример:

Fd=open('7dev/lpO ", 1);

Write(Fd, ..,..); Специальные файлы создаются с помощью команды mknod.

mknod /dev/crk с 115 5 - байт-ориентированное устройство

mknod /dev/brk b 121 15 - блок-ориентированное устройство

Ориентацию определяет с(байт) и b(блок)

115 и 121 - тип устройства индекс в таблице ядра (старший номер), который содержит список всех драйвера известных системе. Младший номер (номер устройства) - 5 и 15 - целое значение, которое передается как аргумент i драйвер устройства при вызове драйвера. Этот номер сообщает драйверу с каким конкретно физическим устройством т взаимодействует.

FIFO файл предназначен для организации канала и создания временного буфера, обеспечивающего взаимодействие двух или более процессов посредством записи в этот буфер и чтения данных из буфера. Буфер, связанный с FIFO файлом создается когда из процессов открывает этот файл для чтения или записи. Буфер удаляется когда все процессы, связанные с FIFO файлом, закрывают все свои ссылки на него. FIFO файл может быть создан в UNIX с помощью mkfifo.

Пример:

mkfifo fifo.file

mlnodfifo.file p

Хотя FIFO файл является рабочим файлом, он может быть удален подобно обычному файлу командой rm.

Индексный дескриптор файлов (блок управления файлом в ОС UNIX)

С каждым файлом в ОС UNIX связан индексный дескриптор. Это структура данных, которая имеет следующие атрибуты:

  • права доступа к файлу для владельца, группы и прочих;

  • количество (счетчик) жестких ссылок (2 байта);

  • идентификатор владельца и группы;

  • размер файла в байтах;

  • время последнего доступа к файлу;

  • время последней модификации файла;

  • время последнего изменения прав доступа;

  • системный номер индексного дескриптора файла;

  • идентификатор файловой системы, в которой находится файл;

  • вид файла;

  • тип организации файла;

  • физический адрес на диске (обычно указатель на начало);

  • диспозиция файла.

Для каждой файловой системы формируются идентификаторы и создается таблица индексных дескрипторов, в которой хранится информация обо всех файлах. Каждая запись в таблице индексных дескрипторов содержит все перечисленные атрибуты файла и определяется по идентификатору файловой системы и номеру индексного дескриптора Идентификатор присваивается файловой системе при выполнении команды mount. Всякий раз, когда создаются новые файлы, ядро ОС UNIX создает новую запись в таблице индексных дескрипторов для сохранения информации о них. Кроме того ядро ОС добавляет его имя и номер дескриптора в соответствующий каталог. Таблицы индексных дескрипторов содержатся в соответствующих файловых системах на диске, но ядро ОС UNIX ведет их копии и в ОП.

Поддержка файлов ядром ОС UNIX.

Ядро ОС UNIX ведет также таблицы файлов, в которых отслеживаются все открытые в системе файлы. И каждый вновь создаваемый процесс содержит таблицу пользовательских дескрипторов файлов, где регистрируются все файлы, открытые процессом (таблица содержится в контексте процесса). Когда процесс совершает системный вызов open / create чтобы открыть или создать файл, ядро преобразует имя файла в индексный дескриптор файла. Если индексный дескриптор файла доступен процессу (есть право доступа), ядро ищет в таблице пользовательских дескрипторов файлов первую незадействованную позицию. Номер этой позиции будет возвращен процессу как пользовательский дескриптор открытого файла. Далее ядро просматривает таблицу файлов и ищет незадействованную позицию. В записи таблицы пользовательских дескрипторов файлов процесса делается ссылка на найденную позицию в таблице файлов. В записи таблицы файлов производится ссылка на ту запись в таблице индексных дескрипторов файловой системы, в которой хранится индексный дескриптор этого файла. В записи таблицы файлов формируется указатель текущей позиции (чтения / записи) в файле. И в запись таблицы файлов - заносится информация, о том, в каком режиме открыт файл и значение счетчика ссылок в записи таблицы файлов устанавливается в соответствии с тем, сколько дескрипторов файлов из процесса обращается к данной записи. Значение счетчика ссылок индексного дескриптора файла увеличивается на единицу. Ядро будет использовать пользовательский дескриптор открытого файла, как индекс в таблице пользовательских дескрипторов файла процесса для поиска элемента или строки в таблице файлов, соответствующих открытому файлу. Затем ядро проверяет данные записи в таблице файлов, чтобы убедиться в том, что файл открыт в соответствии с режимом доступа. Ядро использует указатель из записи в таблице файлов для доступа к записи индексного дескриптора файлов. Оно использует указатель чтения/записи файла из таблицы файлов, чтобы определить с какого элемента должны происходить чтение или запись. Ядро проверяет вид файла в записи индексного дескриптора и вызывает соответствующие драйверы для того, чтобы фактически начать обмен данными с физическим устройством.

Физическая и логическая организация файловой системы

С каждым файлом в файловой системе связан индексный дескриптор. Это некоторая управляющая структура данных, в которой определены характеристики файла и его положение на диске.

Индексные дескрипторы делают файловую систему независимой от реального состояния файлов на диске. С их помощью один и тот же файл может быть включен в разные каталоги.

С точки зрения физической организации файловая система представляет собой совокупность блоков, расположенных на магнитном диске. Первый блок файловой системы (0-ой индекс) - блок начальной загрузки. Следующий блок (блок - (1024-2048) - набор байтов, страница - блок постоянного размера) – супер - блок, содержит заголовок файловой системы. В заголовке находится информация о размере файловой системы, числе и количестве индексных дескрипторов (I size) и о состоянии стека свободных блоков, начиная со второго, несколько блоков, содержащих индексные дескрипторы. Количество таких блоков определяется количеством индексных дескрипторов. В ОС UNIX имя файла хранится в каталоге и отсутствует в индексных дескрипторах. Индексный дескриптор корневого каталога имеет номер 2. Все оставшиеся блоки используются под данные или образуют список свободных блоков. В последние годы в файловую систему ОС UNIX были внесены следующие изменения: 1. Поиск файлов в каталогах производится линейно. Для увеличения производительности системы было добавлено кэширование имен. Прежде чем искать имя в каталоге система проверяет его наличие в КЭШе, если есть в КЭШе — в каталоге можно не искать.

Рисунок 13

Разбиение диска на группы цилиндров (на группы блоков). У каждой группы создается супер - блок, индексные дескрипторы и блоки данных. Суть: хранить индексные дескрипторы и данные ближе друг к другу, чтобы снизить время, затрачиваемое жестким диском на перемещение головок.

Использование не одного, а двух размеров. Для файлов большого размера - блоки 1024 байт; для файлов маленького размера - 512 байт. Наличие блоков двух размеров позволяет обеспечивать эффективность операций чтения / записи для больших файлов и эффективное использование дискового пространства для небольших файлов. В ОС UNIX физическая и логическая структуры файлов не совпадают. Если логически файл представляет собой непрерывную цепочку блоков, то физически файл представляет собой список блоков, которые могут быть разбросаны по всему дисковому пространству. Недостатки такой организации проявляются в дополнительных системных расходах на ведение списка блоков и поиск информации. Но такие положительные моменты как возможность неограниченного расширения файлов, унификация вопросов связанных с вводом / выводом оказались более весомыми для определения способа организации файловой системы. Для обеспечения быстрого доступа к файлам и эффективной работы файловой системы некоторые ее части во время функционирования в ОС UNIX должны располагаться в основной памяти. Прежде всего - это супер - блок и список индексных дескрипторов. В первом супер - блоке - состояние файловой системы, в том числе и информация о свободном месте, а каждая запись в таблице индексных дескрипторов определяет информацию, необходимую для доступа к файлу. Дополнительно в основной памяти находится таблица файлов, каждый элемент которой содержит ссылку на некоторый адрес в таблице индексных дескрипторов и указатель на очередной подлежащий обработке байт файла.

.

Рисунок 14

Команды файловой системы

Pwd - печатает полное имя текущего каталога.

ls - [флаги] [имя] - выводит содержимое каталога по имени

Флаги:

l - вывод полной информации о файле

а - вывод всех файлов каталога

s - вывод размера файла в блоках (Без этого флага будет выводится размер файла в байтах)

d - вывод информации только о подкаталогах

u - сортирует список файлов по времени последнего доступа

t - сортирует список файлов по времени последней модификации

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

f- вывод для каждого подкаталога его содержимого

Пример:

$ ls - alst - из текущего каталога

ls -1 /bin - из каталога bin

cat [-u]_[fl_f2_f3_...] - команда выполняет конкатенацию (сцепление) файлов и отправляет на стандартный вывод

u - флаг для изменения размера выходного блока

Пример:

cat а. с - выводит содержимое а.с

cat а.с b.с> с.с — объединяет содержимое файлов а.с и b записывает в с.с

cp_fl_f2 копирует один файл & другой или несколько файлов в файл или в каталог, если £f существует, то его содержимое будет потеряно.

Пример:

ср a.c.b.c /home - файлы копируются в каталог home, но раздельно.

ср а.с.b- файл а.с запишется в b

ср а.с.b.с с.с - файлы а.с и bзапишутся в с.с

mv_fl_f2 - перемещение (переименование) файлов и каталогов

Пример:

mv /home/us /home/as - имени /home/us не будет

рr [флаги]JflJ2_...] - команда распечатки на экран одного или нескольких файлов.

-n - вывод в колонок

+n - печать n-ой страницы файла

-h - следующий за h текст, трактуется как заголовок, который будет печататься вместо стандартного заголовка

-wn- задает ширину в n символов (вместо 72 по умолчанию) в случае многоколоночной печати

-ln - устанавливает длину страницы в n строк (вместо 66 по умолчанию)

-t- не печатать принятые по умолчанию 5 строк заголовка и 5 последних строк

-s! - колонки разделяются символом ! вместо пробелов

-m- печатать все файлы одновременно, каждый в своей колонке

Примеры:

рr — m а.с b// вывод двух файлов одновременно, каждый в своей колонке

pr -m —t —Sc a.c.b.c

Is | pr -5 -120 –t

lpr [флаги] [fl f2 ...] - позволяет печатать файлы одновременно с выполнением некоторых других. Файлы помещаются в спулинг и печатаются по мере освобождения печатающего устройства. -r - удалить файл после печати

- скопировать файл для печати

-m - заказать почтовое сообщение об окончании печати файла

wc [флаги]_[fl_f2_ ...] - [word character] выдает количество строк и символов в одном или нескольких файлах

- l - подсчет числа строк в файле [line]

-w - подсчет числа слов [word]

-с- подсчет числа символов [character]

* - все файлы

who [am i] - выдает список всех пользователей, работающих в данный момент в системе и имена связанных с ним терминалов

tty - выдает имя терминала, за которым вы работаете

ps [флаги] - выдает информацию о текущих активных процессах в системе

а - выдает информацию о всех процессах, управляемых терминалом

х - выдает информацию о всех процессах, неуправляемых терминалом

/ - выдает полную информацию с указанием состояния каждого процесса

Пример:

ps axl

F

S

UID

PID

PPID

CPU

PRI

NICE

ADDR

WCHAN

TTY

TIME

CMD

SZ

3

S

0

0

0

147

0

20

57

7670

?

18:00

4

1

S

0

1

0

0

30

20

377

10574

?

0:02

12

.

.

.

1

S

4

1494

1

0

30

20

323

10630

tty0

0:01

sh

16

1

R

0

27

1

0

28

20

365

01

0:00

x

12

Рисунок 15

F - внутренний флаг, связанный с процессом. 1 - процесс находится в памяти, 2 - системный процесс, 3 - монитор, 4 - процесс зафиксирован в памяти, 10 - процесс выгружен из памяти, 20 - процесс трассируется (проверяется) другим процессом.

S - состояние процесса: 0 - процесса не существует, S - процесс неактивен (задержан), W - процесс находится в состоянии ожидания (блокировки), R - процесс находится в состоянии выполнения (т.е. работает), 1 – промежуточное состояние, Z - процесс завершен, Т - процесс остановлен.

UID - идентификатор владельца процесса

PID - идентификатор процесса

PPID - идентификатор родительского процесса

CPU - системная составляющая приоритета процесса

PRI - приоритет процесса (больше число - меньше приоритет), системная составляющая

NICE - пользовательская составляющая процесса

ADDR -для резидентного процесса адрес в памяти, в противном случае адрес на диске

WCHAN - событие, которого ожидает процесс в состоянии S или W. Пустое поле - процесс работает

TTY - терминал, который управляет данным процессом (с - консоль - процесс не управляется терминалом)

TIME - суммарное время выполнения процесса

CMD - команда, выполняемая процессом

SZ - размер, загружаемого образа процесса в блоках.

du_[флаги]_[имя] - команда сообщает о количестве блоков занимаемых каждым файлом и общем количестве блоков занимаемых всеми файлами в текущем каталоге.

-а - вывод информации о каждом файле;

-s - вывод общего количества блоков для всех файлов.

Пример:

du/bin - вывод информации о каждом файле и в конце 683 total саl [месяц] [год] - вывод календаря сё [имя] - команда перемещения по файловой системе

Пример:

cd...- перемещение на один каталог выше cd/ - перемещение в корневую директорию

mkdir [имя_uмя ...] - создание одного или нескольких каталогов с одновременным созданием ссылок на текущий и родительский каталоги

rmdir_uмя_[имя] - удаляет 1 или более каталогов; удаляемые каталоги должны быть пусты; не содержать файлов, кроме ссылок на текущий и родительский каталоги. rmdir_[флаги]_[Ф1 _Ф2_...] - удаляет файлы из текущего каталога

-f- используется тогда, когда удаляемый файл не допускает операции чтения.

-z- удаление файлов в интерактивном режиме, -r - удаление всех файлов и подкаталогов из данного каталога. chmod_ код защиты_файл - установка прав доступа на чтение, запись, выполнение для 1 и более файлов

Рисунок 16

1. 1/0 - разрешить (1) смену идентификатора пользователя или запретить (0).

2. 1/0 - разрешить (1) смену идентификатора группы или запретить (0).

3. 1/0 - сохранить (1) образ файла в области выгрузки после отсоединения всех процессов или не сохранить (0).

Код защиты может быть задан в цифирном или символьном виде. Цифирный код принимается если есть необходимые установки полного кода защиты файлов. В этом случае нельзя установить одни права без изменения остальных. Восьмеричный код защиты - это число из четырех восьмеричных цифр, каждое из которых содержит 3 бита.

Символьная форма позволяет установить выборочные биты, коды защиты

Рисунок 17

прочие пользователи; а - все категории пользователей

Пример:

chmod 0644 а.с

ls -l а.с

rw г - г - - 1 userl 83 Apr 27 17:03 а.с

размер в байтах

chown_имя файла - позволяет заменить владельца файла на пользователя с заданным именем .

chgrp_группа_ф1 [ф2..] - позволяет устанавливать группу на 1 или более файлов

cmp [флаги] ф1 ф2 - сравнивает два файла и выдает отчет по их различиям (номер байта и строки, где есть различия)

-l полный список различий

-s в зависимости от результата сравнения устанавливается соответственный код возврата: 0 - файл идентичный, 1 - файлы различные, 2 - файлы недоступны

find каталог ... аргументы - рекурсивно просматривает все подкаталоги для каждого указанного каталога и отыскивает файлы, удовлетворяющие условиям, заданным в аргументах. Для аргументов используется в числовых выражениях знак «+» означает «больше чем», «-» означает «меньше чем». В одной команде find может быть задано неограниченное число каталогов.

  • name_ф1 - найти в каталоге файл с именем ф1;

  • type_c - найти в каталоге файлы, написанные на языке С;

  • links_n - найти в каталоге файлы с n связями (жесткими ссылками);

  • user_имя - найти файлы пользователя с заданным именем;

  • group_имя - найти файлы группы с заданным именем;

  • size_n - найти файлы длинной n блок;

  • inum_n - файлы с идентификатором n;

  • atime_n - файлы, последнее обращение к которым было n дней назад;

  • mtime_n - найти файлы, модифицированные n дней назад;

  • print - выводится имена найденных файлов;

  • newer_ф1 - файлы, модифицированные позже заданного файла ф1;

  • exec_команда - найти и выполнить команду ОС UNIX.

Пример:

Find_/usr/home_-name_open.c_- print

Ответ: /usr/bin/open.c

find_/_-size_+50_mtime_-l_-print

ar_[флаги]_[библиотека]_[ф1]_[ф2_....] - команда создания библиотеки

  • d - удалить файлы из библиотеки;

  • r - заменить файлы библиотеки на новые;

  • f- добавить файлы в конец библиотеки;

  • t - перечислить файлы, входящие в библиотеку;

  • р - напечатать содержимое указанных файлов;

  • х - скопировать файлы в текущий каталог;

  • х(с) - скопировать файлы в текущий каталог как временные;

  • v - печать дополнительной информации (d, r, q, х);

  • a - указывает, что файлы надо помещать после заданного файла (r);

  • с - разместить временные файлы библиотеки в текущем каталоге (х);

  • u- указывает ,что заменяются только те файлы, которые были модифицированные раньше заданных файлов (r).

Пример:

ar a libr а. с Ь.с libr creating

add: а. с

add: b.c

ranlib_библиотека - используется для обработки библиотеки, содержащей обычные модули программы, которые затем будут объединяться редактором связи. Помещает в начало библиотеки таблицу с оглавлением, позволяющим редактору связи (связному загрузчику) за 1 проход по библиотеке искать все модули, требуемые для компилируемой программы.

grep_шаблон_[ф1 _ф2_....] - поиск в указанных файлах строк по заданному шаблону. Ме_[флаги]'_[ф1 _ф2_....] - позволяет определить внутреннее содержание файла. tee_[ф 1 _ф2_....] -позволяет копировать информацию и в стандартный вывод и в указанный файл

Пример:

tee_«Саша пошел погулять» _а.с;

head - вывод в стандартный файл вывода первых нескольких строк;

taib - вывод в стандартный файл вывода последних нескольких строк;

spell - позволяет проверить написание слов во входных данных и выводить слово с ошибкой;

cut - позволяет выводить только нужные данные;

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

Свободное место в памяти и на диске учитывается с помощью связного списка. Когда требуется свободное место, из списка выбирается первое подходящее. После этого в список возвращается остаток свободного пространства.

Управление памяти со страничной подкачкой

Для предоставления возможности работы с приложениями больших размеров к системе управления памятью была добавлена страничная подкачка. Суть метода: чтобы работать, процессу не нужно постоянно целиком находиться в памяти. Все что требуется - контекст процесса и таблица страниц. Если они загружены, то процесс считается загруженным.

Страничная подкачка реализуется частично ядром и частично системным процессом, называемым страничным демоном. Это процесс носит идентификатор «2» ( «0» - своппер [swapper], «1» - инит [init] ). Страничный демон периодически запускается и смотрит есть ли для него работа. Если демон обнаруживает, что количество страниц в списке свободных мало, он инициирует действие по освобождению дополнительных страниц.

Память в ОС UNIX делится на 3 части. Первые две: ядро и карта памяти - фиксированы. Остальная память делится на страницы, каждая из которых может содержать страницы с процессным сегментом, сегментом данных (динамическим) того или иного процесса, страницы с контекстами или находится в списке свободных страниц.

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

Рисунок 18

Следующие три поля используются, когда страницы содержат информацию. У каждой страницы в памяти есть фиксированное место хранения на диске, в который она помещается, когда выгружается из памяти. Еще три поля содержат ссылку на записи в таблицу процесса, тип хранящегося в процессе сегмента, смещение в сегменте. Последнее поле содержит флаги, необходимые для алгоритма страничной подкачки, При запуске процесс может вызвать страничные прерывания, если одной или нескольких страниц не окажется в памяти. При страничном прерывании ОС берет первую страницу в списке свободных страниц, удаляет ее из списка свободных и считывает с нее требуемую информацию. Если список свободных страниц пуст, выполнение процесса приостанавливается до тех пор, пока страничный демон не освободит страницу.

Алгоритм замещения страниц

Алгоритм замещения страниц выполняется страничным демоном. Раз в 250 мс он просыпается, чтобы сравнить количество свободных страниц с системным параметром lostfree ~ 1/4 — (объема памяти) Используются два значения: min и max. Если число свободных страниц меньше lostfree или min, страничный демон переносит страницы из памяти на диск, пока количество страниц не выровняется с min и lostfree. Страничный демон использует модифицированный алгоритм часов.

Основной алгоритм часов работает, сканируя страницы, как если бы они лежали на окружности циферблата. На первом проходе, когда стрелка часов указывает на страницу, сбрасывается бит использования этой страницы. На втором проходе у каждой страницы, к которой не было доступа с момента первого прохода бит использования остается сброшенным. Эта страница будет помещена в список свободных страниц, где она сохраняет свое содержание, что позволяет восстановить, ее, если она потребуется прежде, чем будет перезаписана.

Используются биты обращения (R-Referenced) и изменения (M-Modified) в таблице страниц. Чтобы избежать перемещения страниц по списку, можно использовать указатель, который перемещается по списку.

Рисунок 19

В системах BSD используется алгоритм с 2 стрелками. В алгоритме страничный демон поддерживает два указателя на карту памяти. В процессе работы сначала сбрасывается бит использования первой стрелкой, а затем этот бит проверяется второй стрелкой. При каждом запуске страничного демона стрелки проходят не полный оборот, а столько, сколько необходимо, чтобы количество страниц не было меньше lostfree или min.

Если операционная система обнаруживает, что частота подкачки страниц слишком высока, а количество свободных страниц ниже lostfree свопер удаляет из памяти один или несколько процессов. Сначала свопер проверяет есть ли процесс, бездействовавший более 20 секунд, если есть из них выбирается процесс, бездействовавший в течении максимального срока и выгружает его на диск, если нет свопер изучает 4 самых больших процесса, из которых выбирает тот который находится в памяти дольше всего и выгружает его на диск и так до тех пор, пока не освободится достаточное количество памяти.

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

Система управления вводом/выводом. Логическая и физическая организация

В ОС UNIX логическая организация ввода/вывода упрощена за счет наличия одинакового интерфейса ввода/вывода на уровне ядра системы. Все файлы рассматриваются как последовательности байтов, к которым возможно как последовательное, так и прямое обращение. Для того, чтобы с файлом можно было работать, он должен быть либо открыт с помощью open, либо создан (creat). При завершении процесса открытые файлы автоматически закрываются.

Физическая организация ввода/вывода базируется на наличии специальных программных средств, работающих на уровне ядра системы и называемых драйверами ввода/вывода. Ядро системы устанавливает однозначную связь между специальными файлами и соответствующими им драйверами. Драйверы ввода/вывода и системы буферизации ядра поддерживают 2 вида интерфейсов:

1) блок-ориентированные

2) байт-ориентированные

Обмен блоков происходит для устройств, к которым можно адресоваться как к последовательности блоков по 512 или 1024.

Блок-ориентированные дают возможность значительно повысить эффективность системы управления вводом/выводом за счет организации КЭШ-памяти. КЭШ-память - это системные буфера ввода/вывода, размером с блок, где оседают те блоки данных, обращение к которым происходит наиболее часто. Таким образом, если возникает запрос на передачу данных, то сначала просматриваются внутренние буфера, т.е. КЭШ-память, и только в том случае, если необходимый блок отсутствует в КЭШ-памяти происходит обращение через драйвер к внешнему устройству.

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

Система ввода/вывода ОС UNIX - это часть ядра, выполняющая функции диспетчера устройств ввода/вывода. Программная часть диспетчера включает управляющую компоненту, систему буферизации и набор драйверов. В качестве структурных компонент используются дескрипторы специальных файлов, таблица связи между драйверами байт-ориентированных устройств и ядром системы, таблица связи между драйверами блок-ориентированных устройств и ядром системы, таблица буферов блоков и таблиц прерываний. Взаимодействие этих структур можно отобразить в виде следующей схемы.

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

Рисунок 20

Каждый элемент таблиц связи адресуется к определенному драйверу, обеспечивающему обмен информацией между основной памятью и внешним устройством данного типа. Таблица связи блок-ориентированных устройств кроме того связана с таблицей буферов блоков, указывающей буфера ввода/вывода, образующие КЭШ-память. Программы драйверов предназначены для открытия и закрытия файлов, чтения и записи данных, а также для управления режимами работы устройств. Таблица прерываний обычно располагается в начальной области памяти по фиксированным адресам. При возникновении прерываний от ввода/вывода управление передается подпрограмме обработки прерываний драйвера, адрес которой выбирается из таблицы прерываний.

Реализация операций ввода/вывода в ОС UNIX.

Пример реализации операции чтения информации с блок-ориентированного устройства (hd0)(жесткий диск). Fd=open(“dev/hd0”,0); read(Fd,buf,n);

При чтении инициируется обращение к специальному файлу через дескриптор Fd, определяется тип и номер устройства, с которого необходимо прочитать информацию. По адресу из таблицы связи управление передается необходимому драйверу, программа управления драйвера прежде всего проверяет не располагается ли требуемый блок файла в КЭШ-памяти. Если это так, то моделируется сигнал прерывания об окончании обмена. В противном случае драйвер освобождает, когда это требуется, участок КЭШ-памяти и запускает операцию обмена. По окончании обмена аппаратура интерфейса генерирует прерывания и запускается подпрограмма обработки прерываний драйвера, адрес которой извлекается из определенной ячейки таблицы прерываний. Далее программа драйвера переписывает информацию из КЭШ-памяти в область основной памяти, указанную программистом для ввода (buf). После окончания операции ввода управление передается диспетчеру процессов ядра ОС UNIX.