ГлавнаяarrowСистемное программированиеarrow31. Использование системных вызовов DOS

31. Использование системных вызовов DOS

Нереентерабельность функций ДОС
В лабораторной работе № 2 изучался метод обмена информацией между двумя процессами (производитель и потребитель, или отправитель и получатель) через ОБЩЕЕ ПОЛЕ ПАМЯТИ. Этот метод удобен тем, что позволяет практически мгновенно доставить информацию процессу-получателю.
Однако указанный метод имеет следующие недостатки:
1) объем передаваемых данных ограничен;
2) процесс-получатель должен постоянно периодически проверять, не поступила ли очередная порция данных, в противном случае данные могут быть потеряны или искажены. Аналогичный эффект происходит при кратковременном прекращении работы процесса-получателя.
Метод передачи информации через ФАЙЛ ОБМЕНА свободен от указанных недостатков, так как позволяет БУФЕРИРОВАТЬ большой объем данных. При этом процесс-получатель может прерывать свою работу на длительное время, а затем обрабатывать ту информацию, которую успел за это время накопить в файле непрерывно работающий процесс-отправитель.Очевидный недостаток обмена через файл - более медленная скорость обмена. Очевидное достоинство - высокая надежность обмена.В многозадачных ОС (WINDOWS, UNIX) реализовать указанный метод обмена достаточно просто. В однозадачной операционной системе MS-DOS для этого необходимо предпринимать специальные меры, связанные с преодолением НЕРЕЕНТЕРАБЕЛЬНОСТИ (non re-enter) функций операционной системы ДОС. Эти функции должен использовать работающий по асинхронным аппаратным прерываниям процесс-отправитель - для записи информации в файл. Нереентерабельность функций ДОС связана тем, что при повторном вхождении в эти функции в качестве СТЕКА используется одна и та же области памяти, в результате чего происходит зависание системы из-за порчи стека.
Для преодоления этого недостатка необходимо перед каждой попыткой использования функций ДОС прерывающим процессом (работа с файловой системой, получение системных даты и времени, потоковый ввод/вывод, запуск процессов и др.) проверять, не используются ли эти функции в данный момент времени прерванным процессом. Об этом сигнализирует специальный критический флаг - внутренняя ячейка памяти ДОС с адресом char *dos_critical, адрес которой может быть получен при помощи функции char *get_critical(void), см файл include.c.
Если этот флаг установлен (не равен нулю), то ДОС уже находится в своем критическом участке, и повторный вызов функций ДОС запрещен. Если флаг сброшен (равен нулю), то функциями ДОС пользоваться можно.
Однако в том случае, если для ввода с клавиатуры в прерываемом процессе используется функция ДОС с ожиданием, то в период ожидания ввода установленный флаг блокирует прерывающий процесс, хотя пользоваться функциями ДОС в это время разрешено. Факт нахождения прерываемого процесса в состоянии ожидания может быть обнаружен, так как в цикле ожидания ДОС периодически вызывает программное прерывание с номером 28 hex, которое нами может быть перехвачено.
Таким образом, функции ДОС можно использовать, если:
1) сброшен критический флаг ДОС;
2) функция ДОС ожидания клавиатурного ввода вызвала программное прерывание int 28 hex.
По указанной выше причине немедленная запись информации в файл процессом-отправителем может быть невозможна. В этом случае указанная информация должна быть сохранена в буфере оперативной памяти с тем, чтобы повторить отложенную попытку записи позднее.
Для инициализации повторных попыток записи используются аппаратные прерывания от таймера (int 8) или программные прерывания от Операционной Системы (int 28 hex).
Для разрешения одновременного доступа к одному и тому же файлу двух разных процессов необходимо в обоих процессах при открытии файла указывать режим разделения доступа (SHARE), который запрещал бы блокирование совместного доступа к файлу (см. пример - открытие файла с параметром SH_DENYNO - запрет блокирования).
 

Hosted by uCoz