Ввод вывод данных способы

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

Устройство ввода-вывода

Устройство ввода-вывода — устройства взаимодействия компьютера с внешним миром: с пользователями или другими компьютерами. Устройства ввода позволяют вводить информацию в компьютер для дальнейшего хранения и обработки, а устройства вывода — получать информацию из компьютера.

Содержание

Компоненты устройства ввода-вывода

Компоненты устройства ввода-вывода — устройство ввода-вывода обычно состоят из двух компонентов: самого устройства и контроллера.

Контроллер — микросхема или набор микросхем, которые управляют устройством на физическом уровне. Он принимает от операционной системы команды, например считать данные с помощью устройства, а затем их выполняет.

Устройство имеет простые интерфейсы, и должно удовлетворять двум обязательным условиям: [Источник 1]

  1. Обладать простыми возможностями;
  2. Отвечать общим стандартам.

Соблюдение условия об общих стандартах устройства приводит к тому, что любой контроллер SATA-диска может работать с любым SATA-диском. На данный момент SATA является стандартным типом дисков на многих компьютерах. Интерфейс устройства скрыт контроллером. По причине того, что операционные системы видят только интерфейс контроллера, то для общения операционных систем с устройством был создан драйвер устройств .

Типы устройств ввода-вывода — обычно выделяют 2 типа устройств ввода-вывода — блок-ориентированные и байт-ориентированные. [Источник 2]

  1. Блок-ориентированные устройства нацелены на сохранение информации в блоках фиксированного размера, при этом каждый из них имеет свой собственный адрес. Например, диск.
  2. Байт-ориентированное устройство не имеет адреса и не позволяет производить операцию поиска. Например, строчные принтеры, сетевые адаптеры.

Драйвер устройств

Драйвер устройств — это компьютерная программа, позволяющая выполнять общение между операционной системой и интерфейсом устройства. Для того,чтобы использовать драйвер, поместив его в операционную систему, необходимо предоставить ему возможность работать в режиме ядра.

Цикл жизни драйвера устройств:

  • Инициализация — получение ресурсов драйвером;
  • Поиск аппаратуры — получение аппаратуры от ядра или нахождение им самостоятельно;
  • Активация — драйвер начинает работу;
  • Деактивация — прекращение обслуживания запросов;
  • Выгрузка — освобождение всех ресурсов ядра, драйвер больше не существует.

Модели построения драйвера устройств:

Рассмотрим каждую из них.

Драйвера на основе поллинга (циклического опроса)устройства имеются, как правило, только у встроенных микроконтроллерных систем, по причине наличия большого срока службы данного прибора. Также такие драйвера затрачивают достаточное количество электроэнергии.

Драйвера на основе прерываний создают самостоятельно для себя нить — поток управления, который реализуется только на поступлении прерываний от устройства. При получении запроса записи, драйвер включает прерывания и самостоятельно отправляет первый байт данных в устройство. После чего данная нить перестает свою работу, ожидая конца передачи. После обработки данного байта в устройстве, оно подаст сигнал в виде прерывания, что драйверу дает возможность послать очередной байт на обработку, либо закончить работу.

От предыдущего драйвера этот отличается созданием собственной нити, которая имеет большее количество преимуществ, по сравнению с драйвером на основе прерываний. Преимуществами собственной нити являются — выделение памяти,управление таблицами страниц, вызов любой функции ядра.

Способы установки драйвера в ядро

  1. Заново скомпоновать ядро вместе с новым драйвером и затем перезагрузить систему.
  2. Создать в специальном файле операционной системы запись, сообщающую ей о том, что требуется, и затем следует перезагрузка системы. Во время перезагрузки ОС сама находит нужный ей драйвер и загружает его.
  3. Динамический способ загрузки драйвера — ОС принимает самостоятельно новые драйверы в процессе работы и оперативно устанавливает их, при этом не требуя ее перезагрузки.

Ввода и вывод данных

Ввод и вывод данных можно осуществлять тремя способами.

Способ 1 : ( способ активного ожидания) — пользовательская программа производит системный вызов, затем драйвер приступает к процессу ввода-вывода. При этом он выполняет короткий цикл, постоянно спрашивая устройство и отслеживая завершение операции. Именно опрос устройства и есть самый главный недостаток данного способа. После завершения операции ввода-вывода драйвер помещает данные в нужное место и возвращает управление.

Способ 2 : драйвер запускает устройство и просит его выдать прерывание по окончании выполнения ввода-вывода данных. После этого, драйвер возвращает управление. Затем ОС блокирует вызывающую программу, если это необходимо, и переходит к выполнению других задач. Когда контроллер обнаруживает окончание передачи данных, он вызывает прерывание, чтобы дать сигнал о завершении операции.

Прерывания часто происходят в очень неподходящие моменты, например во время работы обработчика другого прерывания. Поэтому центральный процессор обладает возможностью запрещать прерывания с последующим их разрешением. Пока прерывания запрещены, любые устройства, закончившие свою работу, продолжают выставлять свои запросы на прерывание, но работа процессора не прекращается, пока прерывания снова не станут разрешены.Побеждает устройство, имеющее наивысший приоритет, которое и обслуживается в первую очередь. Все остальные устройства должны ожидать своей очереди.

Читайте также:  Способы образования спор у растений

Способ 3 : в данном способе используется специальный контроллер прямого доступа к памяти (Direct Memory Access (DMA) ), который может управлять потоками битов между оперативной памятью и некоторыми контроллерами без постоянного вмешательства центрального процессора. Центральный процессор, в свою очередь, выполняет настройку контроллера DMA, сообщая ему о том, сколько байтов следует передать, какое устройство и адрес памяти задействовать, также в каком направлении передать данные, а затем дает ему возможность действовать самостоятельно [Источник 3] .

Источник

Ввод-вывод в Си

Основной задачей программирования является обработка информации, поэтому любой язык программирования имеет средства для ввода и вывода информации. В языке Си нет операторов ввода-вывода.

Ввод и вывод информации осуществляется через функции стандартной библиотеки. Прототипы рассматриваемых функций находятся в файле stdio.h . Эта библиотека содержит функции

  • printf() — для вывода информации
  • scanf() — для ввода информации.

Вывод информации

Функция printf() предназначена для форматированного вывода. Она переводит данные в символьное представление и выводит полученные изображения символов на экран. При этом у программиста имеется возможность форматировать данные, то есть влиять на их представление
на экране.

Общая форма записи функции printf() :

СтрокаФорматов состоит из следующих элементов:

  • управляющих символов;
  • текста, представленного для непосредственного вывода;
  • форматов, предназначенных для вывода значений переменных различных типов.

Объекты могут отсутствовать.

Управляющие символы не выводятся на экран, а управляют расположением выводимых символов. Отличительной чертой управляющего символа является наличие обратного слэша ‘\’ перед ним.

Основные управляющие символы:

  • ‘\n’ — перевод строки;
  • ‘\t’ — горизонтальная табуляция;
  • ‘\v’ — вертикальная табуляция;
  • ‘\b’ — возврат на символ;
  • ‘\r’ — возврат на начало строки;
  • ‘\a’ — звуковой сигнал.

Форматы нужны для того, чтобы указывать вид, в котором информация будет выведена на экран. Отличительной чертой формата является наличие символа процент ‘%’ перед ним:

  • %d — целое число типа int со знаком в десятичной системе счисления;
  • %u — целое число типа unsigned int ;
  • %x — целое число типа int со знаком в шестнадцатеричной системе счисления;
  • %o — целое число типа int со знаком в восьмеричной системе счисления;
  • %hd — целое число типа short со знаком в десятичной системе счисления;
  • %hu — целое число типа unsigned short ;
  • %hx — целое число типа short со знаком в шестнадцатеричной системе счисления;
  • %ld — целое число типа long int со знаком в десятичной системе счисления;
  • %lu — целое число типа unsigned long int ;
  • %lx — целое число типа long int со знаком в шестнадцатеричной системе счисления;
  • %f — вещественный формат (числа с плавающей точкой типа float );
  • %lf — вещественный формат двойной точности (числа с плавающей точкой типа double );
  • %e — вещественный формат в экспоненциальной форме (числа с плавающей точкой типа float в экспоненциальной форме);
  • %c — символьный формат;
  • %s — строковый формат.

Строка форматов содержит форматы для вывода значений. Каждый формат вывода начинается с символа % . После строки форматов через запятую указываются имена переменных, которые необходимо вывести.
Количество символов % в строке формата должно совпадать с количеством переменных для вывода. Тип каждого формата должен совпадать с типом переменной, которая будет выводиться на это место. Замещение форматов вывода значениями переменных происходит в порядке их следования.
Пример на Си

Результат работы программы

Тот же самый код может быть представлен с использованием одного вызова printf :

Табличный вывод

При указании формата можно явным образом указать общее количество знакомест и количество знакомест, занимаемых дробной частью:

В приведенном примере 10 — общее количество знакомест, отводимое под значение переменной; 5 — количество позиций после разделителя целой и дробной части (после десятичной точки). В указанном примере количество знакомест в выводимом числе меньше 10, поэтому свободные знакоместа слева от числа заполняются пробелами. Такой способ форматирования часто используется для построения таблиц.

Ввод информации

Функция форматированного ввода данных с клавиатуры scanf() выполняет чтение данных, вводимых с клавиатуры, преобразует их во внутренний формат и передает вызывающей функции. При этом программист задает правила интерпретации входных данных с помощью спецификаций форматной строки.
Общая форма записи функции scanf( ) :

Строка форматов аналогична функции printf() .
Для формирования адреса переменной используется символ амперсанд ‘&’ :
адрес = &объект

Строка форматов и список аргументов для функции обязательны.

Результат работы программы:

Функция scanf( ) является функцией незащищенного ввода, т.к. появилась она в ранних версиях языка Си. Поэтому чтобы разрешить работу данной функции в современных компиляторах необходимо в начало программы добавить строчку

Другой вариант — воспользоваться функцией защищенного ввода scanf_s( ) , которая появилась несколько позже, но содержит тот же самый список параметров.

Комментариев к записи: 96

#include
#include
#include
#include

int main() <
int a[4][5];
int i,j,range,max,maxi,maxj;
float kproiz1,kproiz2;
int proiz1=1;
int proiz2=1;

Читайте также:  1 что такое подлежащее способы выражения подлежащего

printf( «введите диапазон заполнения\n» );
scanf( «%d» , &range);
//if (range>=1)
//range=range+5;
printf ( «матрица\n» );
for (i=0; i for (j=0; j «%d » , a[i][j]);
>
printf( «\n» );
>
max = 1;
for (i=0; i for (j=0; j if (a[i][j] > max) <
max = a[i][j];
maxi=i;
maxj=j;
>
>
>
printf( «Максимальный элемент матрицы %d[%d;%d] \n» ,max,maxi+1,maxj+1);
proiz1= proiz2 = a[maxi][maxj];
if (maxi for (i=maxi+1; i if (maxj!=5) <
for (j=maxj; (j if (maxj!=0) <
if (maxj==5) <
proiz1=proiz1*a[i][maxj];
>
for (j=maxj-1; (j «Среднее геометрическое %f \n» ,kproiz1);
>
if (maxi>=2) <
for (i=maxi-1; i>0; i—) <
if (maxj!=5) <
for (j=maxj; (j if (maxj!=0) <
if (maxj==5) <
proiz2=proiz2*a[i][maxj];
>
for (j=maxj-1; (j «Среднее геометрическое %f» ,kproiz2);
>
return 0;
>

int main()
<
float a=8.5;
float b=4.57;
int c=(pow(pow(a,2)-pow(b,2),1/2));
int p=((a+b+c)/2);
int r=(pow((((p-a)*(p-b)*(p-c))/2),1/2));
int y=((log(r)+pow(cos (b),2)+1.8*(exp(a-b)))/(0.15*c+r*pow(sin(b),2)));
printf( «a=%f b=%f\n» , a, b );
printf( «c=%f \n» , c );
printf( «p=%.3f \n» , p );
printf( «r=%.3f \n» , r );
printf( «y=%.3f \n» , y );
getchar();
return 0;
>

Источник

Способы ввода-вывода

Технология ввода вывода

Лекция 11. Ввод-вывод

Программа, которая общается с контроллером устройства ввода-вывода, отдает ему команды и получает ответы, называется драйвером устройства.

Каждый производитель контроллеров должен поставлять драйверы для поддерживаемых им операционных систем. Для того, чтобы получить возможность использовать драйвер, его нужно установить в операционную систему так, чтобы он мог работать в режиме ядра.

Теоретически драйверы могут работать вне ядра, но такую возможность поддерживают всего несколько существующих систем, так как для этого требуется, чтобы драйвер в пространстве пользователя имел доступ к устройству неким контролируемым способом — очень редко поддерживаемое свойство.

Три способа установки драйвера в ядро.

  • Первый способзаключается в том, чтобы заново скомпоновать ядро вместе с новым драйвером и затем перезагрузить систему. Так работает множество систем UNIX.
  • Второй способ: создать запись во входящем в операционную систему файле, говорящую о том, что требуется драйвер, и затем перезагрузить систему. Во время начальной загрузки операционная система сама находит нужные драйверы и загружает их. Так работает система Windows.
  • Третий способ: операционная система может принимать новые драйверы, не прерывая работы, и оперативно устанавливать их, не нуждаясь при этом в перезагрузке. Этот способ редко используется, но сейчас он становится все более и более распространенным. Такие съемные устройства, как шины USB и IEEE 1394, всегда нуждаются в динамически загружаемых драйверах.

Ввод и вывод данных можно осуществлять тремя различными способами (рис 11.1)

Способ ввода-вывода Без использования прерываний С использованием прерываний
Передача данных из устройства в/в в память с использованием процессора Программируемый ввод/вывод (режим опроса готовности) Ввод/вывод, управляемый прерыванием (режим обмена с прерыванием)
Прямая передача данных из устройства ввода/вывода в память Прямой доступ к памяти(DMA)

Рис. 11.1. Способы ввода-вывода

  1. Управление в/в осуществляет ЦП– программный канал обмена данными между ОП и ВУ
  2. Управление в/в осуществляет специальное дополнительное оборудование –канал прямого доступа.
  1. Программируемый ввод-вывод (режим опроса готовности). Синхронное управление.Простейший метод состоит в том, что пользовательская программа выдает системный запрос, который ядро транслирует в вызов процедуры соответствующего драйвеpa. Затем драйвер начинает процесс ввода-вывода. В это время драйвер выполняет очень короткий программный цикл, постоянно опрашивая готовность устройства, с которым он работает (обычно есть некий бит, который указывает на то, что устройство все еще занято). По завершении операции ввода-вывода драйвер помещает данные туда, куда требуется, и возвращается в исходное состояние. Затем операционная система возвращает управление программе, осуществлявшей вызов. Этот метод называется ожиданием готовности или активным ожиданием и имеет один недостаток: процессор должен опрашивать устройство до тех пор, пока оно не завершит свою работу.

В набор используемых команд входят команды ввода-вывода, принадлежащие следующим категориям.

  • Управление. Команды этой категории используются для того, чтобы привести внешнее устройство в действие и сообщить ему, что нужно делать. Например, блоку с магнитной лентой можно отдать команду перемотки или перемещения вперед на одну запись.
  • Состояние. Используется для проверки состояния контроллера ввода-вывода и соответствующих периферийных устройств.
  • Передача. Используется для чтения и/или записи данных в регистры процессора и внешние устройства и из регистров процессора и внешних устройств.

2. Режим обмена с прерываниями (асинхронное управление). При втором способе драйвер запускает устройство и просит его выдать прерывание по окончании ввода-вывода. После этого драйвер возвращает данные, операционная система блокирует программу вызова, если это нужно, и начинает выполнять другие задания. Когда контроллер обнаруживает окончание передачи данных, он генерирует прерывание, чтобы сигнализировать о завершении операции.

Процесс ввода-вывода в этом случае состоит из следующих шагов (рис. 11.2):

Рис. 11.2. Ввод-вывод, управляемый прерыванием

шаг 1. Драйвер передает команду контроллеру, записывая информацию в регистры устройства. Затем контроллер запускает устройство

шаг 2. Когда контроллер заканчивает чтение или запись того количества байтов, которое ему было указано передать, он посылает сигнал микросхеме контроллера прерываний, используя определенные провода шины.

Читайте также:  Алгоритм свойства алгоритма способы задания алгоритмов

шаг 3. Если контроллер прерываний готов к приему прерывания (а этого может и не быть, если он занят прерыванием более высокого приоритета), то он подает сигнал на определенный контакт процессора информируя центральный процессор.

шаг 4.Контроллер прерываний выставляет номер устройства на шину так, чтобы центральный процессор мог прочесть его и узнать, какое устройство только что завершило свою работу (ведь в одно и то же время могут работать несколько устройств).

Как только центральный процессор решил принять прерывание, содержимое счетчика команд (PC) и слова состояния процессора (PSW) помещается в текущий стек, а процессор переключается в режим работы ядра. Номер устройства может использоваться как индекс части памяти, служащий для поиска адреса обработчика прерываний данного устройства. Эта часть памяти называется вектором прерываний. Когда обработчик прерываний (это часть драйвера устройства, пославшего прерывание) начинает свою работу, он удаляет расположенные в стеке счетчик команд и слово состояния процессора, сохраняет их и запрашивает устройство, чтобы получить информацию о его состоянии. После того как обработка прерывания целиком завершена, управление возвращается кработавшей до этого программе пользователя, к той команде, выполнение которой еще не было закончено.

Для того чтобы не потерять связь с устройством может быть запущен отсчет времени, в течение которого устройство обязательно должно выполнить команду и выдать таки сигнал запроса на прерывание.

Максимальный интервал времени, в течение которого устройство ввода/вывода или его контроллер должны выдать сигнал запроса на прерывание, часто называют установкой тайм-аута.

Если это время истекло после выдачи устройству очередной команды, а устройство так и не ответило, то делается вывод о том, что связь с устройством потеряна и управлять им больше нет возможности. Пользователь и/или процесс получают соответствующее диагностическое сообщение.

Драйверы, работающие в режиме прерываний, представляют собой сложный комплекс программных модулей и могут иметь несколько секций:

  • секцию запуска,
  • одну или несколько секций продолжения
  • и секцию завершения.

Секция запускаинициирует операцию ввода/вывода. Эта секция запускается для включения устройства ввода/вывода либо просто для инициации очередной операции ввода/вывода.

Секция продолжения(их может быть несколько, если алгоритм управления обменом данными сложный и требуется несколько прерываний для выполнения одной логической операции) осуществляет основную работу по передаче данных.

Секция продолжения, собственно говоря, и является основным обработчиком прерывания.

Используемый интерфейс может потребовать для управления вводом/выводом несколько последовательностей управляющих команд, а сигнал прерывания у устройства, как правило, только один.

Поэтому после выполнения очередной секции прерывания супервизор прерываний при следующем сигнале готовности должен передать управление другой секции.

Это делается за счет изменения адреса обработки прерывания после выполнения очередной секции, если же имеется только одна секция прерываний, то она сама передает управление тому или иному модулю обработки.

Секция завершенияобычно выключает устройство ввода/вывода либо просто завершает операцию.

Управление операциями ввода/вывода в режиме прерываний требует больших усилий со стороны системных программистов — такие программы создавать сложнее, чем те, что работают в режиме опроса готовности.

Примером тому может служить ситуация с драйверами, обеспечивающими печать. Так, в ОС Windows (и Windows 9x, и Windows NT) драйвер печати через параллельный порт работает не в режиме с прерываниями, как это сделано в других ОС, а в режиме опроса готовности, что приводит к 100%-й загрузке центрального процессора на все время печати. При этом, естественно, выполняются и другие задачи, запущенные на исполнение, но исключительно за счет того, что ОС Windows реализует вытесняющую мультизадачность и время от времени прерывает процесс управления печатью и передает центральный процессор остальным задачам.

3. Прямой доступ к памяти. Третий метод ввода-вывода информации заключается в использовании специального контроллера прямого доступа к памяти (DMA, Direct Memory Access), который управляет потоком битов между оперативной памятью и некоторыми контроллерами без постоянного вмешательства центрального процессора. Процессор вызывает микросхему DMA, говорит ей, сколько байтов нужно передать, сообщает адреса устройства и памяти, а также направление передачи данных и позволяет дальше действовать ей самой. По завершении работы DMA инициирует прерывание, которое обрабатывается так же, как было описано выше.

Операционная система может воспользоваться прямым доступом к памяти только при наличии аппаратного DMA-контроллера, который есть у большинства систем. Как правило, DMA-контроллер, устанавливаемый на материнской плате, обслуживает запросы по передаче данных нескольких различных устройств ввода-вывода, часто на конкурентной основе.

Где бы он ни располагался физически, DMA-контроллер может получать доступ к системной шине независимо от центрального процессора (рис. 11.3). Он содержит несколько регистров, доступных центральному процессору для чтения и записи.

Рис. 11.3. Ввод-вывод с использованием прямого доступа

К ним относятся регистр адреса памяти, счетчик байтов и один или более управляющих регистров. Управляющие регистры задают:

Источник

Оцените статью
Разные способы