Локальные сети персональных компьютеров. Работа с сервером Novell NetWare

ремонт холодильников балашиха Декоративные гвозди купить минск смотрите на http://www.timhome.ru. | Смотри здесь номер такси. |

5. СИНХРОНИЗАЦИЯ ПРОЦЕССОВ


5.1. Блокирование файлов

5.2. Блокирование физических записей

5.3. Блокирование логических записей

5.4. Семафоры

Локальная сеть - разновидность многопользовательской системы, в которой реализован множественный доступ к файлам, хранящимся на файл-сервере. В однопользовательской однозадачной среде, такой, как MS-DOS, в каждый данный момент времени к любому файлу может обращаться только одна программа. Если пользователь работает в среде Microsoft Windows, являющейся однопользовательской многозадачной средой, существует возможность одновременного обращения к одому и тому же файлу из нескольких работающих одновременно приложений.

В сети Novell NetWare также существует возможность одновременного доступа к файлам, хранящимся в сетевых каталогах, со стороны различных рабочих станций. Причем на этих станциях может работать многозадачная операционная система, например OS/2 или Windows, что еще больше усложняет ситуацию.

К чему может привести неправильная обработка множественного доступа к файлам?

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

Второй торговый агент тоже не терял времени даром и нашел свой товар почти одновременно с первым. Он приступил к переводу денег почти сразу после первого агента. Получилось так, что первый агент успел только считать старое значение соответствующего поля, но не успел записать новое (0,5 млн. долларов). Поэтому программа, запущенная вторым агентом, считала из поля базы данных значение 2 млн. долларов, несмотря на то, что первый агент уже сделал свою покупку и денег осталось меньше.

Теперь первый агент записывает в поле новое значение, и через некоторое время то же самое делает второй агент. Итак, на сумму в 2 млн. долларов успешно сделаны две покупки по 1,5 млн. долларов и еще на счету фирмы осталось 0,5 млн. долларов! Кто же будет покрывать убытки размером 1,5 млн. долларов? Очевидно, программист, который составил такую программу!

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

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

5.1. Блокирование файлов
В этом разделе мы рассмотрим методы синхронизации работы программ, основанные на блокировании файлов. Принцип блокирования файлов достаточно прост. Например, в MS-DOS, если запущена программа SHAR...
1. Программа FLOCK
5.1.1. Программа FLOCKПриведем пример программы FLOCK (листинг 21), выполняющей блокирование файлов средствами сетевой оболочки. Вначале программа в цикле запрашивает пути к блокируемым файлам до...
Листинг 21
Листинг 21 Блокирование файлов // Файл flock\flock.cpp // // (C) A. Frolov, 1993 // =================================================== #include <stdlib.h> #include <stdio.h> #include...
5.2. Блокирование физических записей
Если вы разрабатываете СУБД с коллективным доступом к файлам базы данных, расположенным на сервере, метод блокирования файлов может оказаться не слишком удобным. Так как разные пользователи в разн...
1. Программа PHYSLOCK
5.2.1. Программа PHYSLOCKДля иллюстрации блокирования физических записей файла мы составили две программы - PHYSLOCK (листинг 22) и RECACC (листинг 23). Первая программа вводит с консоли имена фай...
Листинг 22
Листинг 22 Блокирование физических записей файлов // Файл physlock\physlock.cpp // // (C) A. Frolov, 1993 // =================================================== #include <stdlib.h> #include...
2. Программа RECACC
5.2.2. Программа RECACCПрограмма RECACC (листинг 23) предназначена для работы вместе с программой PHYSLOCK. Она запрашивает с консоли путь к файлу, а также смещение области памяти, в которую затем...
Листинг 23
Листинг 23 Проверка возможности получения // доступа к физическим записям файла // Файл recacc\recacc.cpp // // (C) A. Frolov, 1993 // =================================================== #include...
5.3. Блокирование логических записей
Для синхронизации процессов можно использовать не только физическое блокирование записей файлов, когда программа не сможет изменить их содержимое, как бы она ни старалась, но и так называемое блок...
1. Программа LOGLOCK
5.3.1. Программа LOGLOCKПрограмма LOGLOCK (листинг 24) демонстрирует использование логических записей для синхронизации процессов. Вначале программа запрашивает в цикле у оператора имена логически...
Листинг 24
Листинг 24 Блокирование логических записей // Файл loglock\loglock.cpp // // (C) A. Frolov, 1993 // =================================================== #include <stdlib.h> #include <stdio...
5.4. Семафоры
Последнее средство синхронизации процессов, которое мы рассмотрим в этой главе, - семафоры. О семафорах мы уже говорили в томе "Библиотеки системного программиста", посвященном защищенно...
1. Программа SEMSIGN
5.4.1. Программа SEMSIGNПрограмма SEMSIGN (листинг 25) демонстрирует использование семафоров. Эта программа открывает семафор с именем SEMLOCK, определяет его состояние. Вся информация, касающаяся...
Листинг 25
Листинг 25 Работа с семафорами // Файл semsign\semsign.cpp // // (C) A. Frolov, 1993 // =================================================== #include <stdlib.h> #include <stdio.h> #incl...








Начало