Дата публикации: Feb 04, 2013 9:13:50 PM
Асинхронное выполнение действия означает, что действия выполняются параллельно и степень завершения одного никак не связана с выполнением другого. Операции ввода/вывода (далее ВВ) существенно замедляют программу, поэтому асинхронное выполнение их весьма желательно (если это допускает аппаратное обеспечение). Технически асинхронный ВВ возможен, если есть возможность управлять запоминающими устройствами на низком уровне, не загружая центральный процессор. В современных высокопрозводительных системах это обычно имеет место. С точки зрения компилятора асинхронный ВВ означает, что программа производит действия с объектами данных в то же время, когда какие-то другие объекты данных выводятся (и не должны меняться в процессе) либо вводятся (и не должны ни меняться, ни использоваться).
В Фортране, начиная с версии стандарта 2003, есть средства асинхронного ВВ, однако Стандарт допускает синхронное выполнение операций ВВ. Это и понятно, так как отсутствие аппаратной поддержки асинхронного ВВ делает бессмысленной или почти бессмысленной программную поддержку.
Операция асинхронного ВВ называется отложенной - в том смысле, что она не обязана закончиться (и скорее всего не закончится) к тому моменту, как соответствующий оператор ВВ будет завершен. Программа может выполняться далее. И имеются средства синхронизации, позволяющие создать ситуацию ожидания - ожидания окончания отложенной операции ВВ. Эти средства могут быть явными и неявными - первые инициируют ожидание отдельным оператором, вторые - компилятором, при необходимости (обычно при выове оператора ВВ для того же устройства).
Данные, подлежащие асинхронному ВВ, снабжены атрибутом ASYNCHRONOUS - он назначается автоматически, но может быть указан и явно. При этом запрещаются некоторые оптимизации. Открываемый оператором OPEN файл должен иметь спецификатор ASYNCHRONOUS со значением 'YES'. Такой же спецификатор указывается в операторах READ и WRITE, которые и инициируют отложенную операцию ВВ. Спецификатор ID, если указан, задает целочисленную переменную, в которую заносится положительный код операции (ноль означает завершение операции).
Оператор запросов INQUIRE, помимо прочего, способен давать информацию об отложенной операции ВВ, которая определяется по коду (спецификатор ID и, разумеется, UNIT), либо обо всех операциях для данного устройства. Спецификатор PENDING задает переменную логического типа, определяющую, завершилась ли отложенная операция DD на момент начала выполнения запроса. Ложное значение означает, что операция завершилась. Если указан спецификатор ID, то возвращается ложное значение и инициируется ситуация ожидания окончания соответствующей операции. Если спецификатор ID опущен и все асинхронные операции чтения и записи для данного устройства завершились, возвращается ложное значение и инициируется ситуация ожидания для всех этих операций: они более не считаются отложенными и соответствующие данные реально записаны или прочитаны -- реального ожидания нет. В остальных случаях (спецификатор ID опущен, есть незавершенные операции ВВ) значение истинно, ситуация ожидания не инициируется, все отложенные операции остаются таковыми. Стандарт оставляет системе значительную свободу в определении статуса завершенности операций чтения и записи. Возможны варианты: операция не считается завершенной вплоть до соответствующей ситуации ожидания ее завершения (в этом случае значение всегда истинно, если есть хоть одна отложенная операция на устройстве); оператор запроса инициирует ситуации ожидания завершения всех операций и возвращает ложное значение; оператор запроса реально выясняет статус операций. Спецификатор PENDING обязан присутствовать, если присутствует спецификатор ID
Явно инициировать ожидание можно с помощью операторов FLUSH и WAIT. Первый гарантирует доступость записанных данных -- то есть после выполнения оператора данные на указанном устройстве окажутся реально записаны. Оператор инициирует ожидание всех отложенных операций записи, а также форсирует реальную запись в случае, если, например, данные кэшируются с целью ускорения. Второй оператор просто инициирует ожидание отдельной операции (спецификатор ID) на данном устройстве (UNIT) или всех операций на данном устройстве (ID опущен). Операторы чтения и записи, перемотки, запросов -- также инциируют ожидание.