Архитектура операционной системы UNIX


         

READ


Синтаксис вызова системной функции read (читать): number = read(fd,buffer,count)

где fd - дескриптор файла, возвращаемый функцией open, buffer - адрес структуры данных в пользовательском процессе, где будут размещаться считанные данные в случае успешного завершения выполнения функции read, count - количество байт, которые пользователю нужно прочитать, number - количество фактически прочитанных байт. На приведен алгоритм read, выполняющий чтение обычного файла. Ядро обращается в таблице файлов к записи, которая соответствует значению пользовательского дескриптора файла, следуя за указателем (см. ). Затем оно устанавливает значения нескольких параметров ввода-вывода в адресном пространстве процесса (), тем самым устраняя необходимость в их передаче в качестве параметров функции. В частности, ядро указывает в качестве режима ввода-вывода "чтение", устанавливает флаг, свидетельствующий о том, что ввод-вывод направляется в адресное пространство пользователя, значение поля счетчика байтов приравнивает количеству байт, которые будут прочитаны, устанавливает адрес пользовательского буфера данных и, наконец, значение смещения (из таблицы файлов), равное смещению в байтах внутри файла до места, откуда начинается ввод-вывод. После того, как ядро установит значения параметров ввода-вывода в адресном пространстве процесса, оно обращается к индексу, используя указатель из таблицы файлов, и блокирует его прежде, чем начать чтение из файла.

алгоритм read входная информация: пользовательский дескриптор файла адрес буфера в пользовательском про- цессе количество байт, которые нужно прочи- тать выходная информация: количество байт, скопированных в поль- зовательское пространство { обратиться к записи в таблице файлов по значению пользо- вательского дескриптора файла; проверить доступность файла; установить параметры в адресном пространстве процесса, указав адрес пользователя, счетчик байтов, параметры ввода-вывода для пользователя; получить индекс по записи в таблице файлов; заблокировать индекс; установить значение смещения в байтах для адресного пространства процесса по значению смещения в таблице файлов; выполнить (пока значение счетчика байтов не станет удов- летворительным) { превратить смещение в файле в номер дискового блока (алгоритм bmap); вычислить смещение внутри блока и количество байт, которые будут прочитаны; если (количество байт для чтения равно 0) /* попытка чтения конца файла */ прерваться; /* выход из цикла */ прочитать блок (алгоритм breada, если производится чтение с продвижением, и алгоритм bread - в против- ном случае); скопировать данные из системного буфера по адресу пользователя; скорректировать значения полей в адресном простран- стве процесса, указывающие смещение в байтах внутри файла, количество прочитанных байт и адрес для пе- редачи в пространство пользователя; освободить буфер; /* заблокированный в алгоритме bread */ } разблокировать индекс; скорректировать значение смещения в таблице файлов для следующей операции чтения; возвратить (общее число прочитанных байт); }



Содержание  Назад  Вперед