Объект address_space
Физическая страница памяти может содержать данные из нескольких несмежных физических дисковых блоков[85].
Проверка наличия определенных данных в страничном кэше может быть затруднена, если смежные блоки принадлежат совершенно разным страницам памяти. Невозможно проиндексировать данные в страничном кэше, используя только имя устройства и номер блока, что было бы наиболее простым решением.
Более того, страничный кэш ядра Linux является хранилищем данных достаточно общего характера в отношении того, какие страницы памяти в нем могут кэшироваться. Первоначально страничный кэш был предложен в операционной системе System V (SVR 4) для кэширования только данных из файловых систем. Следовательно, для управления страничным кэшем операционной системы SVR 4 использовался эквивалент файлового объекта, который назывался struct vnode. Кэш операционной системы Linux разрабатывался с целью кэширования любых объектов, основанных на страницах памяти, что включает множество типов файлов и отображений в память.
Для получения необходимой общности в страничном кэше операционной системы Linux используется структура address_space (адресное пространство), которая позволяет идентифицировать страницы памяти, находящиеся в кэше. Эта структура определена в файле следующим образом.
struct inode *host; /* файловый индекс, которому
struct radix_tree_root page_tree; /* базисное дерево
spinlock_t tree_lock; /* блокировка для защиты
unsigned int i_mmap_wrltable; /* количество областей
памяти с флагом VM_SHARED */
struct prio_tree_root i_mmap; /* список всех отображений */
struct list_head i_mmap_nonlinear; /* список областей
памяти с флагом VM_NONLINEAR */
spinlock_t i_mmap_lock; /* блокировка поля i_mmap */
atomic_t truncate_count; /* счетчик запросов
unsigned long nrpages; /* общее количество страниц */
pgoff_t writeback_index; /* смещения начала
struct address_space_operations *a_ops; /* таблица операций */
unsigned long flags; /* маска gfp_mask
struct backing_dev_info *backing_dev_info; /* информация
spinlock_t private_lock; /* блокировка
struct list_head private_list; /* список
struct address_spacs *assoc_mapping; /* соответствующие
Поле i_mmap — это дерево поиска по приоритетам для всех совместно используемых и частных отображений. Дерево поиска по приоритетам— это хитрая смесь базисных и частично упорядоченных бинарных деревьев[86].
Всего в адресном пространстве nrpages страниц памяти.
Объект address_space связан с некоторым другим объектом ядра, обычно с файловым индексом. Если это так, то поле host указывает на соответствующий файловый индекс. Если значение поля host равно NULL, то соответствующий объект не является файловым индексом; например, объект address_space может быть связан с процессом подкачки страниц (swapper).
Поле a_ops указывает на таблицу операций с адресным пространством так же, как и в случае объектов подсистемы VFS. Таблица операций представлена с помощью структуры struct address_space_operations, которая определена в файле следующим образом.
int (*writepage)(struct page*, struct writeback_control*);
int (*readpage)(struct file*, struct page*);
int (*writepages)(struct address_space*,
int (*set_page_dirty)(struct page*);
int (*readpages)(struct file*, struct address_space*,
struct list_head*, unsigned);
int (*prepare_write)(struct file*, struct page*,
int (*commit_write)(struct file*, struct page*,
sector_t (*bmap)(struct address_space*, sector_t);
int (*invalidatepage)(struct page*, unsigned long);
int (*releasepage)(struct page*, int);
int (*direct_IO)(int, struct kiocb*, const struct iovec*,
Методы read_page и write_page являются наиболее важными. Рассмотрим шаги, которые выполняются при страничной операции чтения.
Методу чтения в качестве параметров передается пара значений: объект address_space и смещение. Эти значения используются следующим образом для поиска необходимых данных в страничном кэше.
page = find_get_page(mapping, index);
где параметр mapping — это заданное адресное пространство, a index — заданная позиция в файле.
Если в кэше нет необходимой страницы памяти, то новая страница памяти выделяется и добавляется в кэш следующим образом.
add_to_page_cache_lru(cached_page, mapping, index, GFP_KERNEL);
/* ошибка добавления страницы памяти в страничный кэш */
Наконец, необходимые данные могут быть считаны с диска, добавлены в страничный кэш и возвращены пользователю. Это делается следующим образом.
error = mapping->a_ops->readpage(file, page);
Операции записи несколько отличаются. Для отображаемых в память файлов при изменении страницы памяти система управления виртуальной памятью просто вызывает следующую функцию.
Ядро выполняет запись этой страницы памяти позже с помощью вызова метода writepage(). Операции записи для файлов, открытых обычным образом (без отображения в память), выполняются более сложным путем. В основном, общая операция записи, которая реализована в файле mm/filemap.с, включает следующие шаги.
a_ops->prepare_write(file, page, offset, offset+bytes);
filemap_copy_from_user(page, offset, buf, bytes);
a_ops->commit_write(file, page, offset, offset+bytes);
Выполняется поиск необходимой страницы памяти в кэше. Если такая страница в кэше не найдена, то создается соответствующий элемент кэша. Затем вызывается метод prepare_write(), чтобы подготовить запрос на запись. После этого данные копируются из пространства пользователя в буфер памяти в пространстве ядра. И наконец данные записываются на диск с помощью функции commit_write().
Поскольку все описанные шаги выполняются при всех операциях страничного ввода-вывода, то все операции страничного ввода-вывода выполняются только через страничный каш. Ядро пытается выполнить все запросы чтения из страничного кэша. Если этого сделать не удается, то страница считывается с диска и добавляется в страничный кэш. Для операций записи страничный кэш выполняет роль «стартовой площадки». Следовательно, все записанные страницы также добавляются в страничный кэш.
Читайте также
Объект Folder
Объект Folder Объект Folder обеспечивает доступ к свойствам каталога. Создать этот объект можно с помощью свойства RootFolder объекта Drive или методов GetFolder, GetParentFolder и GetSpecialFolder объекта FileSystemObject следующим образом:var FSO, Folder;FSO = WScript.CreateObject(«Scripting.FileSystemObject»);Folder = FSO.GetFolder(«С:Мои
Объект File
Объект File Объект File обеспечивает доступ ко всем свойствам файла. Создать этот объект можно с помощью метода GetFile объекта FileSystemObject следующим образом:var FSO, F;//Создаем объект FileSystemObjectFSO=WScript.CreateObject(«Scripting.FileSystemObject»);//Создаем объект FileF=FSO.GetFile(«С:Мои документахletter.txt»);Также
Объект TextStream
Объект TextStream Объект TextStream обеспечивает последовательный (строка за строкой) доступ к текстовому файлу. Методы этого объекта позволяют читать информацию из файла и записывать ее в него.Создать объект TextStream можно с помощью следующих методов:? CreateTextFile объектов FileSystemObject и
Объект Array
Объект Array Новый объект встроенного класса Array можно создать с помощью оператора new следующими способами:? new Array() — создание массива нулевой длины;? new Array(N) — создание массива длины N;? new Array(а0, a1, . aN) — создание массива длины N+1 c элементами а0, a1, . aN.Например:var A1, А2, A3;A1 = new
Объект Date
Объект Date Для создания нового объекта встроенного класса Date используется один из трех конструкторов.Конструктор первого вида позволяет создать объект, в котором хранится информация о текущих дате и времени:var d;d = new Date();Здесь время задается по Гринвичу, т.е. с
Объект Enumerator
Объект Enumerator С помощью объекта Enumerator можно получить доступ к любому элементу коллекции (в VBScript для этого служит цикл For…Each). Коллекцией в языке JScript называется множество элементов, которое отличается от массива тем, что к элементам коллекции нельзя получить прямой доступ
Объект Math
Объект Math Встроенный класс Math применяется для математических вычислений и содержит основные математические константы и функции. Замечание Объект Math создается сервером сценариев автоматически и не может быть создан при помощи оператора new, как другие встроенные
Объект String
Объект String Встроенный объект String предназначен для выполнения различных операций над текстовыми строками. Обычно объекты класса String создаются просто с помощью записи в переменную текстового литерала:var s1, s2;s1 = «Это строка»;s2 = «Это тоже строка»;Также можно создавать такие
Объект CompositeElementLite
Объект CompositeElementLite Вернемся в начало этой главы и вспомним, как мы получали доступ к нужному нам элементу Web-страницы.Мы можем получить доступ к одному элементу Web-страницы:var elCMain = Ext.get(«cmain»);Или сразу к нескольким:var clContainers = Ext.select(«DIV»);Мы помним, что метод select объекта Ext
Объект document
Объект document Прежде всего надо отметить, что объект document существует в единственном экземпляре для всего HTML-документа. Он присутствует всегда, если существует HTML-документ, поэтому специально создавать его не требуется.activeElementИспользуется в сценарии для получения ссылки
Объект location
Объект location Объект location содержит информацию о местонахождении текущего документа, т.е. его интернет-адрес. Его также можно использовать для перехода на другой документ и перезагрузки текущего документа.Свойства объекта locationМетоды объекта locationПользуясь объектом location,
Объект style
Объект style Как и все остальные объекты, style поддерживает ряд свойств и методов. Их можно разделить на две группы:иСвойства первой группы в целом аналогичны соответствующим атрибутам стиля и имеют почти такие же имена за тем исключением, что символы «-» убираются, т.к. не
Объект window
Объект window Объект window представляет текущее окно Web-обозревателя или отдельный фрейм, если окно разделено на фреймы.closedВозвращает true, если текущее окно закрыто. Может быть использовано при работе с несколькими окнами.defaultStatusСообщение по умолчанию, отображаемое в строке
Объект layer
Объект layer Все слои, определенные в документе, доступны как элементы коллекции layers.document.layers[2];document.layers[«somelayer»];NN поддерживает прямой доступ к слоям по имени. Имена слоям даются с помощью атрибута NAME тегов <LAYER> и <ILAYER>:document.somelayer;Для доступа к слою, находящемуся внутри
Объект
Объект Все, что находится в трехмерном виртуальном пространстве сцены — это объекты. Термин «объект» обозначает нечто, находящееся в трехмерном мире. Что бы мы ни создали в виртуальном пространстве, это будет объект.Существует множество видов объектов. Принадлежность