|
Операции ввода-вывода расходуют много времени и должны быть сокращены до минимума. Другими словами, можно сказать так: не вводите данные, которые можно вычислить внутри программы. Кроме того, удостоверьтесь, что каждый оператор ввода-вывода передает минимальное количество физических записей. Две последовательные команды ввода-вывода для одного и того же устройства часто можно объединить в одну команду. Это сокращает количество обращений к системным подпрограммам ввода-вывода и к супервизору. Не забывайте также после отладки программы изъять все лишние операторы ввода-вывода.
Для каждого языка имеется наиболее эффективный способ записи или считывания информации. Если программа предусматривает выполнение большого числа операций ввода-вывода, можно сэкономить значительное время, используя наиболее эффективный способ. Например, неформатный ввод-вывод обычно быстрее форматного; его можно использовать при работе с лентами, дисками и перфокартами, если данные выводятся во внешнюю память, а затем считываются опять той же или другой программой. Неформатный ввод-вывод выполняется быстрее, поскольку для этого не требуется преобразования данных из внутренней формы представления во внешнюю или обратного преобразования. Этот способ ввода-вывода более точен, так как во время преобразования данных из внутренней — машинной — формы во внешнюю — форматную— могут быть утеряны значащие цифры.
3.18.1. ВЫВОД НА ПЕЧАТЬ
Вывод данных на печать следует сокращать до необходимого минимума. Это нужно делать не только из-за расхода времени на печать, но и потому, что редко кто-либо читает большие сообщения, состоящие из нескольких страниц чисел. Печатайте только ту информацию, которую пользователь хочет прочитать. Не говоря уже об экономии машинного времени, бумаги и денег, на игнорирование всех ненужных результатов (которые следует соответствующим образом определить) машина тратит гораздо меньше времени, чем вы его расходуете на то, чтобы разорвать и выбросить в мусорную корзину ненужные распечатки. С точки зрения эффективности всегда дешевле написать лишние операторы, исключающие ненужный вывод, чем печатать ненужную информацию.
Бумага для машины стоит дорого, поэтому не размещайте одно число в строке, если вы печатаете много строк. Программируйте экономно — печатайте в каждой строке столько информации, сколько можно прочитать. Старые распечатки можно использовать для черновиков. Кроме того, перфокарты и бумага — высококачественный материал, который можно выгодно использовать повторно.
3.18.2. ПЕРФОКАРТЫ
При использовании перфокарт минимизируйте их число. Этого можно достичь; упаковывая информацию на карте с максимальной плотностью. Десятичные дроби обычно можно сократить, что позволяет разместить на перфокарте больше цифр.
Однако формат информации на перфокарте ограничен устройством ввода и требованиями к перфокартам. Если применение перфокарт не обязательно и объем информации велик, перфокарты следует заменять файлами на ленте или на диске.
Иногда информацию, подлежащую вводу, можно значительно сократить. Предположим, нам нужно ввести следующий столбец цифр:
10.0 10.1 10.2
24.9 25.0
Эта операция займет много машинного времени. Будет лучше, если мы считаем начальное и конечное значения (10.0, 25.0) и величину приращения (0.1), а промежуточные значения машина вычислит сама.
3.18.3. МАГНИТНЫЕ ЛЕНТЫ
Если необходимо запомнить промежуточные машинные данные, не требующие физического носителя типа перфокарт, то дешевле всего использовать магнитную ленту. Ленту можно применять только для последовательных файлов. Сравнение магнитных лент и перфокарт показывает, что использование магнитной ленты вместо перфорации более 4000^карт обходится дешевле. Кроме того, магнитную ленту можно использовать многократно, а перфокарты — только один раз. Перфокарты занимают много места, в то время как магнитная лента компактна. Перфокарты следует. использовать для вывода информации только в том случае, если выходная колода мала, например менее 1000 карт, или если карты нужны для каких-то других целей.
Лента более эффективна для хранения или обработки данных. Самые медленные лентопротяжные устройства имеют скорость записи ~4000 символ/с, в то время как самый быстрый выходной перфоратор пробивает только 400 символ/с. Магнитная лента обычно может хранить информацию, эквивалентную 200 000 картам.
Ленту можно использовать с разной степенью эффективности в зависимости от того, как расположены на ней данные. Ленты организованы в записи, блоки и файлы. Файл — полный набор записей, обрабатываемых при выполнении некоторого задания. Блок — это группа записей, а запись — данные, обрабатываемые одной командой чтения или записи, появляющейся в программе. Если записи не объединены в блок, то при каждом обращении с ленты считывается одна запись. Чтение информации непосредственно с ленты выполняется медленно и неэффективно по сравнению с чтением из буферной области. Если записи сгруппированы в блоки, то весь блок считывается из буфера или записывается в него за одно обращение. Тогда каждая команда записи, встретившаяся в программе, помещает запись в буферную область. Как только буфер заполнен, происходит физическая запись (выполняемая управляющей программой) блока на ленту^ Ввод выполняется аналогично, т. е. блоки записей автоматически считываются с ленты, и каждый оператор ввода, встретившийся в программе, считывает одну запись из буфера. Машина может передавать записи из буфера гораздо быстрее, чем с ленты. Здесь показано, как выглядит на ленте блок записей.
 Этот блок состоит из п записей. Если весь блок считан, супервизор автоматически читает новый блок. Обычно ввод-вывод выполняется с двойной буферизацией, что означает возможность доступа к двум блокам. Таким образом, блок записей может пересылаться в один буфер (или считываться из него), в то время как записи другого буфера обрабатываются. Накапливание записей в буферной области и запись блока на магнитную ленту (или чтение его с ленты) выполняются автоматически. Все, что должен при этом сделать программист,— определить тип и размер записи, а также размер буфера. Если блоки достаточно велики, то не должно тратиться время на ожидание ввода-вывода, так как один буфер всегда должен быть готов для использования1*.
Каждый блок на ленте отделяется от другого межблочным промежутком (МБП) длиной 15,2 мм2>. Этот промежуток необходим для правильного считывания данных. Если несблокированные данные, являющиеся содержимым перфокарт, расположены на ленте
 Рис. 3.2.
с плотностью записи 32 бит/мм, это означает, что для размещения 80 символов потребовалось бы 2,5 мм. Так как МБП занимает 15,2 мм (рис. 3.2), то отношение МБП к данным составляет 6:1, что означает, что большая часть времени тратится на чтение МБП. Если блоки имеют длину 1600 символов (содержимое 20 перфокарт), то для каждых 51 мм данных используется только один МБП длиной 15,2 мм.
Эффективность возрастает, если применять большие блоки в последовательных файлах. Если в каждом блоке находится только одна запись, то каждый оператор ввода-вывода обрабатывает блок. Так как расходы на ввод-вывод достаточно велики, этот процесс может быть довольно дорогим. Кроме того, теряется много времени на ожидание новых записей, которые должны быть обработаны. Если каждый блок состоит из 10 записей, то на каждую запись тратится только одна десятая времени ввода-вывода. Если же в каждый блок включить 100 записей, то на одну запись расходуется одна сотая времени ввода-вывода. Эта ситуация может привести к предположению, что всегда лучше иметь большие блоки, что верно только отчасти.
Группируйте записи в эффективные блоки для ввода-вывода.
]) В большинстве случаев двойная буферизация не обеспечивает полной загрузки процессора. — Прим. ред.
2> Величина межблочного промежутка зависит от типа ленты и лентопротяжного механизма. —Прим. ред.
Два обстоятельства препятствуют использованию блоков неограниченной длины: ошибки и объем памяти. Если при вводе-выводе данных с ленты допущены ошибки, вы будете часто терять всю информацию, находящуюся на блоке. Если же блок содержит одну запись, то потери не так значительны, как в случае блока из 1000 записей. Поэтому, если ошибки при вводе-выводе с ленты являются обычным явлением, используйте небольшие блоки. Существенная часть ошибок при вводе-выводе вызвана плохим состоянием лентопротяжного устройства. Так что, прежде чем начать операции ввода-вывода, приведите в порядок лентопротяжное устройство.
3.18.4. БУФЕШ
Вторым ограничением, налагаемым на размер блока, является объем памяти. Чем больше размер буфера, тем меньше нужно времени для ввода-вывода и тем больший объем памяти требуется. В этом случае эффективность выполнения ввода-вывода достигается за счет увеличения используемой памяти. Для каждого буфера требуется некоторый объем памяти. Обычно имеется ограничение сверху на размер блока, который может быть считан. В некоторых машинах блок содержит 32 760 символов. Если вы располагаете двумя буферами, а блок имеет максимальный размер, то буферы занимают 65 520 символов в памяти. Если ваша программа велика или мала емкость памяти используемой вами машины, то такой размер блока недопустим. J
Каков же простой ответ? Если предположить, что ошибки ввода-вывода отсутствуют (их не должно быть, если лентопротяжный механизм исправлен и хорошо обслуживается), то размер блока в 4000 символов обычно является минимальным. Это соответствует информации, помещающейся на 50 перфокартах (50X80 = 4000). Максимальный размер блока определяемся имеющейся памятью.
Если нужно оптимизировать управление лентой таким образом, чтобы избежать слишком больших и слишком малых блоков, идеальной была бы следующая ситуация. Каждый раз во время обработки блока данных выполняются некоторые вычисления. Лучше всего было бы всегда иметь блок данных, готовый к вычислениям. Машина может выполнять ввод-вывод, используя буфер, пока выполняются другие вычисления. Поэтому, если время, требуемое для обработки каждого блока, ненамного больше времени, необходимого для ввода-вывода предыдущего блока, то в машине с двойным буфером блок данных был бы всегда доступен для обработки. При этом размеры блоков не должны быть чрезмерно ■большими.
Таким образом, в файле, где каждая запись требует большого количества вычислений, лучше использовать блоки небольшого размера. А если для файла выполняется мало вычислений, увеличение размера блоков повысило бы эффективность.
Некоторые машины допускают увеличение числа буферов. Для больших задач с частыми обменами можно определить наиболее эффективные сочетания числа буферов и размера блоков с помощью нескольких тестовых прогонов.
Для каждой программы можно установить количество буферов, отведенных каждому файлу. Но, поскольку буферы требуют определенного объема памяти, существует предел для числа используемых буферов. Основной способ экономного расходования памяти состоит в том, чтобы использовать одну и ту же область памяти более чем для одного буфера. Это возможно только в случае, если два или более файла никогда не будут открыты в одно и то же время. Тогда вначале один файл использует область буфера, а затем, после того как первый файл будет закрыт, эта область предоставляется для использования второму файлу.
Обычно так и поступают, когда с одним и тем же файлом работает несколько программ. Мы можем регулировать количество, буферов, используемых в каждой программе, но не можем изменить числа записей в блоке для большинства типов файлов (т. е. для последовательных файлов на ленте), так как размер записи и их число в блоке уже установлены. Поэтому на этапе проектирования системы следует тщательно рассматривать вопрос о размере блока, исходя из требований, предъявляемых к объему памяти и к скорости обработки для каждого задания в системе. В противном случае либо будет чрезмерно расходоваться память, либо обработка будет выполняться очень медленно.
Большинство систем имеет двойную буферизацию, т. е. каждому файлу назначаются два буфера. Но если возникает необходимость в памяти, то под нее занимают второй буфер. Исключение второго буфера обычно приводит к экономии памяти, но к увеличению времени выполнения, так как не будет выполняться совмещение операций обработки с операциями ввода-вывода.
3.18.5. ФАЙЛЫ НА ДИСКАХ
Эффективная организация файлов на дисках труднее, чем на лентах, потому что для этого имеется много возможностей. Укажем несколько важных рекомендаций.
Для файлов на дисках следует использовать неформатный ввод-вывод. Эффективность в этом случае повышается за счет двух факторов: экономии памяти на дисках и отсутствия необходимости преобразовывать данные из внутреннего (машинного) представления во внешнее (для дисков). Кроме того, неформатный ввод-вывод обеспечивает лучшую точность передаваемых данных.
Если в одном задании используется более одного файла на Дисках, не располагайте все файлы на одном диске. Используйте различные диски, что позволит осуществить совмещение процесса ввода-вывода с обработкой файла. Если на одном диске располо-
11—899
жены два файла, теряется слишком много времени на ожидание установки держателя читающей головки диска. Если возможно, сделайте так, чтобы файлы при работе с дисками использовали разные каналы.
Последовательные файлы. Для последовательных файлов на дисках размеры блоков данных должны быть примерно равны емкости дорожки на диске, но не превышать ее. Если программа так велика, что блоки такого размера невозможно расположить в машине, то на дорожке следует размещать целое число блоков. Память на дисках тратится на промежутки между блоками, поэтому чем меньше размер блока, тем больше памяти на дисках используется для МБП. Таблица возможных размеров блоков дается изготовителем устройств.
Таким образом, последовательные файлы на дисках подобны последовательным файлам на ленте, в которых большие блоки (но не больше, чем емкость дорожки) дают самые эффективные операции. Пересылка многочисленных, очень коротких логических блоков нежелательна.
Если подпрограмма выполняет в основном ввод-вывод, возможно, более эффективно было бы уменьшить размер блока и увеличить количество используемых буферов. При выполнении больших заданий можно позволить себе немного поэкспериментировать и, используя различные комбинации размера блоков и числа буферов, определить наиболее эффективные сочетания.
⇐3.17. Индексация || Оглавление || 3.19. Изучение новых операторов⇒
|