Thursday, Feb 23rd

Last update12:13:00 PM GMT

Вы находитесь на: FreeBSD Обзор системы ввода/вывода Содержимое vnode

Содержимое vnode

Vnode является расширяемым объектно-ориентированным интерфейсом. Он содержит информацию, которая обычно полезна вне зависимости от нижележащего объекта файловой системы, который он представляет. Информация, хранящаяся в vnode, включает следующее.

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

· Различные счетчики ссылок включают число элементов файлов, открытых для чтения и/или записи, которые ссылаются на vnode; число элементов файлов открытых для записи, которые ссылаются на vnode, и число страниц и буферов, связанных с vnode.

· Указатель на структуру монтирования описывает файловую систему, содержащую объект, представленный vnode.

· Различные сведения для упреждающего чтения файла.

· Ссылка на связанный с vnode vm_object.

· Ссылка на состояние специальных устройств, сокетов и fifo.

· Мьютекс для защиты флагов и счетчиков внутри vnode.

· Блокировка, управляемая менеджером блокировок, для защиты частей vnode, которые могут измениться, когда выполняется операция ввода/вывода.

· Поля, используемые кешем имен для отслеживания имен, связанных с vnode.

· Указатель на набор операций vnode, определенных для объекта.

· Указатель на индивидуальные данные, необходимые для нижележащего объекта. Для локальной файловой системы этот указатель будет ссылаться на inode; для NFS он будет ссылаться на nfsnode.

· Тип нижележащего объекта (например, обычный файл, каталог, символьное устройство и т. д.). Информация о типе не является строго обязательной, поскольку клиент vnode всегда мог бы вызвать операцию vnode для получения типа нижележащего объекта. Однако поскольку тип нужен часто, он не изменяется, а для вызова через интерфейс vnode требуется время, тип объекта кешируется в vnode.

· Есть чистые и грязные буферы, связанные с vnode. Каждый действительный буфер в системе идентифицируется связанным с ним vnode и начальным смещением его данных внутри объекта, который представляет vnode. Все буферы, которые были модифицированы, но еще не были записаны обратно, хранятся в списке грязных буферов своего vnode. Все буферы, которые не были модифицированы или были записаны обратно после последней модификации, хранятся в чистом списке своего vnode. Группировка всех грязных буферов для vnode в один список делает стоимость системного вызова fsync для очистки всех грязных блоков, связанных с файлом, пропорциональной количеству грязных данных. На некоторых UNIX-системах эта стоимость пропорциональна меньшему значению между размером файла и размером буферного пула. Список чистых буферов используется для освобождения буферов, когда файл удаляется. Поскольку файл никогда не будет прочитан снова, ядро может немедленно отменить все ожидающие операции ввода/вывода в его грязных буферах и вернуть все его чистые и грязные буферы, поместив в начало списка свободных буферов для немедленного повторного использования.

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

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

Сейчас 28 гостей онлайн