Address spaces in linux

Объект 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 страниц памяти.

Читайте также:  Socks server for linux

Объект 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().

Читайте также:  Linux on embedded devices

Поскольку все описанные шаги выполняются при всех операциях страничного ввода-вывода, то все операции страничного ввода-вывода выполняются только через страничный каш. Ядро пытается выполнить все запросы чтения из страничного кэша. Если этого сделать не удается, то страница считывается с диска и добавляется в страничный кэш. Для операций записи страничный кэш выполняет роль «стартовой площадки». Следовательно, все записанные страницы также добавляются в страничный кэш.

Читайте также

Объект 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, как другие встроенные

Читайте также:  Astra linux журнал печати

Объект 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;Для доступа к слою, находящемуся внутри

Объект

Объект Все, что находится в трехмерном виртуальном пространстве сцены — это объекты. Термин «объект» обозначает нечто, находящееся в трехмерном мире. Что бы мы ни создали в виртуальном пространстве, это будет объект.Существует множество видов объектов. Принадлежность

Источник

Оцените статью
Adblock
detector