Выделение выровненной памяти: и — КиберПедия 

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

Выделение выровненной памяти: и

2021-01-29 97
Выделение выровненной памяти: и 0.00 из 5.00 0 оценок
Заказать работу

 

Для большинства задач отлично подходят стандартные процедуры выделения памяти –, и т.д. Но иногда может понадобиться память, которая выровнена тем или иным способом. Другими словами, адрес первого выделенного байта является кратным какого‑нибудь числа. (Например, на некоторых системах копирование памяти осуществляется значительно быстрее, если используются буфера, выровненные по границе слова.) Такую службу предоставляют две функции:

 

 является более новой функцией; она является частью другого необязательного расширения, «Консультативной информации» («Advisory Information»). Работа функции отличается от других функций выделения памяти Linux. При наличии проблемы она не возвращает ‑1. Вместо этого возвращаемое значение равно 0 при успехе или значению errno в случае неудачи. Аргументы следующие:

 

Указатель на переменную. Указываемая переменная будет содержать адрес выделенного блока памяти. Выделенная память освобождается с помощью.

 

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

 

Число выделяемых байтов.

 является нестандартной, но широко доступной функцией, которая работает сходным образом. Возвращаемое значение равно в случае неудачи и запрошенному блоку памяти при успехе, причем (степень двойки) обозначает выравнивание, a – затребованный размер памяти.

Традиционно выделенная память не могла быть освобождена с помощью, поскольку использовала для выделения памяти и возвращала указатель на выровненный подходящим образом байт где‑то внутри блока. Версия GLIBC не имеет этой проблемы. Из этих двух функций следует использовать, если она у вас есть.

 

Блокировка файлов

 

Современные системы Unix, включая GNU/Linux, дают вам возможность заблокировать часть файла или весь файл для чтения или записи. Подобно многим частям Unix API, которые были разработаны после V7, имеется несколько несовместимых способов осуществить блокировку файлов. Данный раздел рассматривает эти возможности.

 

Концепции блокировки файлов

 

Также, как замок на вашей двери предотвращает нежелательные проникновения в ваш дом, блокировка файла предотвращает доступ к данным в файле. Блокировка файлов была добавлена в Unix после разработки V7 (от которой происходят все современные системы Unix), и соответственно в течение некоторого времени в различных системах Unix были доступны и использовались несколько несовместимых механизмов блокировки файлов. Как в BSD Unix, так и в System V были собственные несочетающиеся вызовы для блокировки. В конечном счете POSIX формализовал способ осуществления блокировки файлов System V. К счастью, названия функций в System V и BSD были различны, так что GNU/Linux, в попытке угодить всем, поддерживает обе разновидности блокировок.

Табл. 14.1 суммирует различные виды блокировок.

 

Таблица 14.1. Функции блокировки файлов

 

 Источник Функция Диапазон Весь файл Чтение/запись Вспомогательный Обязательный
BSD      
POSIX  
POSIX  

Имеются следующие аспекты блокировки файлов:

Блокировка записей

Блокировка записи является блокировкой части файла. Поскольку файлы Unix являются просто потоками байтов, было бы корректнее использовать термин блокировка диапазона (range lock), поскольку осуществляется блокировка диапазона байтов. Тем не менее, термин «блокировка записей» общеупотребительный.

Блокировка всего файла

Блокировка всего файла, как предполагает название, блокирует весь файл, даже если его размер меняется в блокированном состоянии. Интерфейс BSD предусматривает блокирование лишь всего файла. Для блокирования всего файла с использованием интерфейса POSIX указывают нулевую длину. Это интерпретируется особым образом как «весь файл».

Блокировка чтения

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

Блокировка записи

Блокировка записи предоставляет исключительный доступ к записываемой области. Если эта область заблокирована также и для чтения, попытка получения блокировки записи либо блокируется, либо завершается неудачей в зависимости от запрошенного типа блокировки. После получения блокировки записи попытка получить блокировку чтения завершается неудачей.

Вспомогательная блокировка

Вспомогательная блокировка (advisory lock) тесно соответствует замку на двери. Говорят, «замки существуют для честных людей», что означает, что если кто‑нибудь на самом деле захочет вломиться в ваш дом, он, возможно, найдет способ это сделать, несмотря на наличие замка в двери. То же и со вспомогательной блокировкой; она работает лишь тогда, когда тот, кто пытается получить доступ к заблокированному файлу, сначала пытается получить блокировку. Однако, программа может совершенно игнорировать вспомогательные блокировки и делать с файлом, что захочет (конечно, пока это разрешается правами допуска файла).

Обязательная блокировка

Обязательная блокировка является более строгой: когда установлена обязательная блокировка, ни один другой процесс не может получить доступ к заблокированному файлу. Любой процесс, который пытается игнорировать это, либо сам блокируется до снятия блокировки файла, либо его попытка завершится неудачей. (Под GNU/Linux по крайней мере это включает!)

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

POSIX стандартизует лишь вспомогательную блокировку. Обязательная блокировка доступна на GNU/Linux, а также в ряде коммерческих систем Unix, но детали варьируют. Далее в данном разделе мы рассмотрим детали для GNU/Linux.

 

Блокировка POSIX: и

 

Системный вызов (file control – управление файлом) используется для блокировки файла. (Другое использование было описано в разделе 9.4.3 «Управление атрибутами файла:».) Он объявлен следующим образом:

 

 

Аргументы следующие:

 Дескриптор файла для открытого файла.

 Одна или более именованных констант, определенных в. Ниже они описаны более подробно.

 Указатель на, описывающую нужный блок.

 

Описание блокировки

 

Прежде чем рассмотреть осуществление блокировки, давайте исследуем описание блокировки в операционной системе. Это делается при помощи структуры, которая описывает диапазон блокируемых байтов и вид нужной блокировки. Стандарт POSIX утверждает, что содержит «по крайней мере» определенные члены. Это позволяет разработчикам предоставлять при желании дополнительные члены структуры. Из слегка отредактированной справочной страницы fcntl (3):

 

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

 

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

 

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

 

Справочная страница fnctl (3) имеет примечание:

 

POSIX 1003.1‑2001 допускает отрицательные значения. (И если это так, описываемый блоком интервал охватывает байты с вплоть до включительно.) Однако, в этой ситуации системный вызов Linux для современных ядер возвращает.

 

(Мы заметили, что справочная страница относится к версиям ядер 2.4.x; стоит проверить текущую справочную страницу, если ваша система новее.)

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

Блокировка чтения. Для применения блокировки чтения файл должен быть открыт для чтения.

Блокировка записи. Для применения блокировки записи файл должен быть открыт для записи.

Освобождение предыдущей блокировки.

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

Значение для снимает блокировку. В общем, это простейший способ снять те самые блоки, которые были установлены ранее, но можно «расщепить» блок, освободив диапазон байтов в середине ранее установленного более крупного блока. Например:

 

 


Поделиться с друзьями:

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.026 с.