Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

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



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

Win32 может блокировать файлы полностью или частично, т.е. так, чтобы никакой другой процесс (выполняемая программа) не мог обращаться к блокированной облас­ти файла. Заблокированный файл может быть открыт только для чтения (совместный доступ) или для чтения и записи (монопольный доступ). Следует подчеркнуть, что блокировка связана с процессом. Любая попытка обратиться к части файла (с помо­щью ReadFile или WriteFile) в нарушение существующей блокировки потерпит неудачу, так как блокировка обязательна на уровне процесса. Любая попытка полу­чить конфликтную блокировку также будет неудачной, даже если процесс уже имеет блокировку. Блокировка файлов — это ограниченная форма синхронизации парал­лельных процессов и потоков.

Наиболее общая функция блокировки LockFileEx реализована только в Windows 2000/NT. Менее общая функция LockFile может применяться в Windows 9x.

LockFileEx принадлежит к классу функций расширенного ввода-вывода; для указания 64-разрядных позиций в файле и размера блокируемой области требуется структура перекрытия, которая уже применялась ранее для указания позиции в функциях ReadFile и WriteFile.

BOOLLockFileEx (HANDLE hFile, DWORD dwFlags,

DWORD dwReserved, DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh, LPOVERLAPPED lpOverlapped)

Функция LockFileEx блокирует область байтов в открытом файле для совмест­ного (несколько читающих процессов) или монопольного (один читающий и пишу­щий процесс) доступа.

Параметры

hFile — дескриптор открытого файла. Дескриптор должен иметь права доступа либо GENERIC_READ, либо GENERIC_READ и GENERIC_WRITE.

dwFlags определяет режим блокировки и устанавливает, следует ли ожидать, пока блокировка не станет возможна.

• LOCKFILE_EXCLUSIVE_LOCK обозначает требование на монопольную блокировку
с возможностью чтения/записи. Если этот флаг не установлен, запрашивается совместная блокировка (с возможностью чтения).

• LOCKFILE_FAIL_IMMEDIATELY указывает, что функция должна завершиться не­
медленно, возвратив значение FALSE, если блокировку нельзя установить. Если
этот флаг не установлен, вызов функции блокируется, пока блокировка файла
не станет возможна.

dwReserved должен быть равен нулю. Следующие два параметра задают длину об­ласти байтов и поэтому здесь не поясняются.

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

• DWORD offset (именно так, а не OffsetLow).

• DWORD OffsetHigh.

• HANDLE hEvent должен быть равен нулю.

Блокировка файла снимается с помощью функции UnlockFileEx; параметры для нее указываются те же самые, кроме dwFlags.

BOOL UnlockFileEx (HANDLE hFile, DWORD dwReserved,

DWORD nNumberOfBytesToLockLow,

DWORD nNumberOfBytesToLockHigh,

LPOVERLAPPED lpOverlapped)

При блокировке файлов следует учитывать несколько факторов.

• Снятие блокировки должно относиться точно к такой же области, что и предшествующая блокировка. Не допускается, например, разблокировать две заблокированных ранее области или часть заблокированной области. Попытка разблокировать область, которая не точно соответствует существующей блокировке,
потерпит неудачу; функция возвратит FALSE, и системное сообщение укажет,
что блокировки не существует.

• Блокировки не могут пересекаться с ранее блокированными областями файла,
если при этом возникает конфликт.

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

• Блокировки не наследуются вновь создаваемым процессом.

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

Таблица 11.1. Логика требования блокировки

  Требуемый тип блокировки
Существующая блокировка Совместная блокировка Монопольная блокировка
Нет Предоставляется Предоставляется
Совместная (одна или несколько) Предоставляется Предоставляется
Исключительная Не предоставляется Не предоставляется

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

Таблица 11.2.Блокировки и операции ввода-вывода

Существующая блокировка Операция ввода-вывода
Чтение Запись
Нет Проходит успешно Проходит успешно
Совместная (одна или несколько) Проходит успешно. Вызываю­щий процесс не обязательно должен владеть блокировкой Неудача
Исключительная Проходит успешно, если бло­кировкой владеет вызывающий процесс. В противном случае — неудача Проходит успешно, если бло­кировкой владеет вызывающий процесс. В противном случае — неудача

Операции чтения и записи обычно имеют форму функций ReadFile и WriteFile или их расширенных версий ReadFileEx и WriteFileEx. Для диагностики неудачи чтения или записи вызывается GetLastError.

Еще одна форма ввода-вывода — обращение к па­мяти, в которую отображается файл. Конфликты блокировки не обнаруживаются при обращении к памяти; они проявляются, когда вызывается функция MapViewOfFile. Эта функция делает часть файла доступной для процесса, а потому в этот момент сле­дует проверить блокировку.

LockFile — это ограниченная специальная версия функции блокировки. Она обеспечивает рекомендательную блокировку (advisory locking). В этом случае предоставляется только монопольный доступ и функция возвращает управление немедленно. Иначе говоря, LockFile не блокируется. Установлена ли блокировка, можно прове­рить по возвращаемому значению.

B) Снятие блокировки файла

За каждым успешным вызовом LockFileEx должно следовать одно соответствую­щее ему обращение к UnlockFileEx (это правило распространяется также на LockFile и UnlockFile). Если программа не может снять блокировку или задержи­вает ее дольше, чем необходимо, другие программы не смогут продолжать работу или же это негативно повлияет на их быстродействие. Следовательно, программы должны быть аккуратно спроектированы и реализованы так, чтобы блокировки снимались как можно скорее; логики, которая заставляла бы программу обходить операцию разбло­кировки, следует избегать.

Удобный способ убедиться, что блокировка снята, предоставляют обработчики завершения.

Реестр

Реестр — это централизованная иерархическая база данных конфигурации приложений и системы. Доступ к реестру осуществляется через разделы реестра, которые аналогичны каталогам файловой системы. Раздел может содержать другие разделы или пары "параметр-значение", которые можно уподобить именам файлов и их со­держимому.

Пользователь или администратор могут просматривать и редактировать содержи­мое реестра с помощью редактора реестра, который вызывается командой REGEDIT32. Кроме того, программы могут управлять реестром через функции API, описанные в этом разделе.

Пары "параметр-значение" в реестре содержат, в частности, следующую информацию:

• номер версии и номер выпуска операционной системы, а также имя зарегистрирован-ного пользователя;

• информацию подобного рода обо всех правильно установленных приложениях;

• информацию о типе процессора компьютера, количестве процессоров, систем­
ной памяти и т.д.;

• пользовательскую информацию, такую как основной каталог и настройки при­ложений;

• данные безопасности, например имена учетных записей пользователей;

• установленные службы;

• соответствия между расширениями файлов и выполняемыми программами, которые применяются оболочкой интерфейса пользователя, когда он щелкает на значке файла; например, расширение.doc может соответствовать Microsoft Word;

• соответствия между сетевыми адресами и именами компьютеров.

Разделы реестра

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

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

SOFTWARE\ Название_компании\Название_продукта\Версия.

2. HKEY_USERS содержит данные конфигурации пользователей.

3. HKEY_CURRENT_CONFIG содержит текущие параметры настройки, такие как раз­
решающая способность монитора и шрифты.

4. HKEY_CLASSES_ROOT содержит подразделы, определяющие соответствие между
расширениями файлов и классами и приложениями, используемыми оболочкой
для доступа к объектам с этими расширениями. В этом разделе также записаны
все данные, необходимые для объектной модели компонентов Microsoft (COM).

5. HKEY_CURRENT_USER. Сюда относится информация данного пользователя,
включая переменные окружения, принтеры и пользовательские настройки приложений.





Дата публикования: 2015-11-01; Прочитано: 892 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...