Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Буферный обмен информацией в языках программирования.
В любой операционной системе ориентированной на платформу IBM PC стандартный обмен информацией между периферийными устройствами и процессором осуществляется через использование файлов. При этом процесс обработки заключается в следующем: 1. супервизор обращается к необходимому устройству и опрашивает его готовность. 2. опрашивается состояние устройства и ищется на нем необходимый файл. 3. в куче выделяется буфер для обмена информацией (в MS-Dos и Windows величина буфера равна 512 байт). Если ОС многозадачная, то для процесса обмена выделяется поток обмена. Необходимо помнить, что потоки обмена различаются в зависимости от условий: типа процессора, типа операционной системы. Поток обмена информацией для MS-DOS всегда один или несколько непересекающихся. Для Win9x несколько пересекающихся, но не выполняющихся одновременно. Для Windows моложе Win9х несколько пересекающихся, в том числе и выполняющиеся одновременно. 4. Распределяется внутри программы файловая переменная. 5. Происходит процесс обмена информацией по алгоритму для чтения: Информация вводится в буфер. Происходит процесс чтения в соответствии с форматом определенным в программе в оперативной памяти. Если данная больше 512 байт, то происходит переход указателя в буфере на необходимую позицию. Если данные больше 512 байт или данные начинаются в одном буфере и заканчиваются в другом то чтение производится в два этапа: сначала из старого буфера, далее заполнение нового и чтение остатка из него. 6. После окончания процесса обмена информацией файл закрывается, и буфер в зависимости от языка программирования может быть освобожден (в Си автоматически, в Pascal’e не автоматически). В Config.sys пользователь должен определить количество одновременно открытых файлов: files = <n> , n=10 по умолчанию; количество буферов: buffers=<n>, n=10 по умолчанию; количество потоков, работающих одновременно: fbsd=<n>, n=1 по умолчанию (необходимо указывать только для MS-DOS или если используем приложения MS-DOS под Win9x). Для работы Turbo Pascal достаточно стандартных установок. Для транслятора Delphi рекомендуется >20 файлов и буферов, особенно если используем работу с базами данных. С точки зрения языков программирования существует 3 типа файлов:
В связи с выше изложенным алгоритмом наиболее долго в программе интерпретируются текстовые файлы, средняя скорость для типизированных и максимальная для нетипизированных. В последних двух случаях программист для увеличения скорости обмена должен указывать размер типа или буфера обмена кратный 512 байт. Таблица 1. Файловая обработка
1) Практически в любой программе обработка текстов и типизированных файлов всегда сводится к нетипизированному файлу и BlockRead, BlockWrite замещаются макрокомандами ассемблера. 2) При создании приложений в Delphi не рекомендуется работать с обычными файлами, лучше всего подключать объекты работы с БД по различным форматам. При этом необходимо помнить, что обработка текстовых файлов выполняется на порядок дольше.
3.1. Функции и команды по файловой обработке.
FileSize (f: file): longint – определить размер файла в байтах. Файл обязательно должен быть распределён. Действует на все типы файлов. FilePоs (f: file): longint – определить позицию внутри файла. Файл должен быть распределён и открыт. Функция действует на типизированные и не типизированные файлы. Rename (f: file; new. name: string); файловая строка, хранящая переменную, новое имя файла. Файл должен быть распределен, но не открыт. если на диске существует файл с новым именем, и управлением вводом выводом не передано ОС в процессе выполнения команды может произойти ошибка. Тип файла любой. Erase (f: file)-уничтожить файл. Файл должен быть распределён, но не открыт.(!) После выполнения функций файловая переменная принимает значение “неопределенно” (const “nil”) если файла нет на носителе или атрибуты его не соответственно уничтожены (т.е. файл только для чтения) в процессе выполнения может возникнуть ошибка.
3.2. Пример обработки не типизированного файла.
Пример: Написать утилиту, копирующую один файл в другой. При копировании проверяем следующие события: 1.Копируемого файла нет на диске; 2.На диске уже существует файл, в который мы копируем информацию. 3. Считаем: переписываем в файл до первого сбоя. Запуск программы будем осуществлять с параметрами.
PROGRAMM MY_COPY; Var kol, I, N, J : integer; ARR: array[1…512] of byte; F, F1: file; Begin If ParamCaunt<2 then begin Writeln(“В качестве параметров должны быть заданы 2 имени файла”); halt(1) end. {$I-} Assign(f ,ParamStr[1]); reset(f,1); {$I+} if IOResult <>0 then begin writeln(“Oшибка при открытии ”+Param Str[1]); halt(2); end; {$I-} Assign(f1 , ParamStr[2]); reset(f1,1); {$I+} if IOResult<>0 then Rewrite(f1,1) else begin writeln(“уже есть”+Param Str [2]); close (f); close(f1) halt(3); end; Repeat BlockRead(f, ARR, 512, I); Block rite(f1, ARR, I, N); Until (I <> N) OR (I<>512); Close(f); Close(f1); IF (I<> N) then Begin Writeln (“ Ошибка записи в” + Param Str[2]); Halt(4); end; end.
Комментарий к программе: Распределяем несколько целых переменных. Область ARR=512 байтам равна стандартному блоку ОС MSDOS, Windows 9x. Распределяем 2 файловые переменные как не типизированные файлы. Проверяем, чтобы в программу передавалось не менее 2-х параметров. Итак, переменная ParamCount содержит количество параметров передаваемых в программу. Пред определенный массива ParamStr хранит в себе параметры передаваемые в программу. При этом начальный индекс массива=0 и в нулевом элементе массива хранится имя, выполняемого загрузочного модуля. При работе в ОС MSDOS количество параметров может быть произвольно, но общая их длина, включая разделяющие их пробелы, не должна превышать 128 символов с именем выполняемого модуля. Выдаем сообщение об ошибке и выходим с кодом завершения 1. |
Последнее изменение этой страницы: 2019-04-19; Просмотров: 209; Нарушение авторского права страницы