Программное управление потоком — это метод управления потоком , используемый в компьютерных каналах передачи данных , особенно в последовательном интерфейсе RS-232 . Он использует специальные коды, передаваемые внутри полосы по основному каналу связи. Эти коды обычно называются XOFF и XON (от «transmit off» и «transmit on» соответственно). Таким образом, «программное управление потоком» иногда называют «управлением потоком XON/XOFF». Это отличается от управления потоком с помощью выделенных внеполосных сигналов — « аппаратного управления потоком » — например, RS-232 RTS/CTS .
Для систем, использующих кодировку символов ASCII , XOFF обычно представляется с помощью символа или байта с десятичным значением 19; XON — со значением 17.
Стандарт ASCII не резервирует никаких управляющих символов для использования в качестве XON/XOFF специально. Однако он предоставляет четыре общих символа «управления устройством» (DC1 — DC4). Teletype Model 33 ASR принял два из них, DC3 и DC1, для использования в качестве XOFF и XON соответственно. Это использование было скопировано другими и теперь является фактическим стандартом . Эквиваленты клавиатуры Ctrl+ Sдля XOFF и + для XON также происходят от этого использования.CtrlQ
Когда один конец канала передачи данных не может принимать больше данных (или приближается к этой точке), он отправляет XOFF на другой конец. Другой конец получает код XOFF и приостанавливает передачу . Как только первый конец снова готов принимать данные, он отправляет XON, а другой конец возобновляет передачу.
Например, можно представить себе компьютер, отправляющий данные на медленный принтер . Поскольку компьютер отправляет данные быстрее, чем принтер может их распечатать, принтер отстает и приближается к ситуации, когда он будет перегружен данными. Принтер реагирует на эту ситуацию, отправляя XOFF на компьютер, который временно прекращает отправку данных. Когда принтер снова готов принимать больше данных, он отправляет XON на компьютер, который снова начинает отправлять данные.
XOFF/XON можно использовать в обоих направлениях, например, два телетайпа, подключенных друг к другу.
Главным преимуществом программного управления потоком является сокращение количества электрических проводников между отправителем и получателем. При наличии общего заземления требуется только два сигнала: один для отправки и другой для получения. Аппаратное управление потоком требует дополнительных проводов между двумя устройствами. Оно также требует определенной аппаратной реализации, которая имела более значительные затраты в ранние дни вычислений (т. е. в 1960-х и 1970-х годах).
Однако программное управление потоком не лишено своих проблем. Самым важным недостатком является то, что программное управление потоком менее надежно. Отправка XOFF требует как минимум одного символьного времени для передачи и может быть поставлена в очередь позади уже переданных данных, все еще находящихся в буферах. Аппаратные сигналы могут быть утверждены почти мгновенно и не по порядку.
Как следует из названия «программное управление потоком», управление потоком с использованием этого метода обычно реализуется в программном обеспечении (или прошивке ), что может привести к дополнительным задержкам в ответе XOFF. Эти задержки могут привести к повреждению данных из-за переполнения буфера . Аппаратное управление потоком, с другой стороны, обычно находится под прямым контролем передающего UART , который способен немедленно прекратить передачу без вмешательства более высоких уровней. Чтобы справиться с задержкой, вызванной встроенными FIFO , более продвинутые UART, такие как 16950, обеспечивают программное управление потоком «на кристалле». [1] UART, которые не поддерживают такую поддержку, такие как 16550 , могут страдать от переполнения буфера при использовании программного управления потоком, хотя это можно несколько смягчить, отключив FIFO UART. [1]
Наконец, поскольку коды XOFF/XON передаются внутри полосы, они не могут появляться в передаваемых данных, не будучи ошибочно приняты за команды управления потоком. Таким образом, любые данные, содержащие коды XOFF/XON, должны быть закодированы каким-то образом для правильной передачи с соответствующими накладными расходами. Это часто делается с помощью какой-либо escape-последовательности . Для печатающих устройств, которые напрямую интерпретируют коды ASCII, это не является большой проблемой, поскольку коды XON и XOFF используют кодовые номера ASCII «управления устройством».
Программное управление потоком широко используется низкоскоростными устройствами, особенно старыми принтерами и немыми терминалами , чтобы указать, что они временно не могут принять больше данных. Обычно это происходит из-за комбинации ограниченной скорости вывода и заполненности буферов . Некоторые пакеты управления терминалами, такие как termcap , используют «заполнение» (короткие задержки с использованием гранулярности в миллисекунды [2] ), чтобы дать такому оборудованию достаточно времени для выполнения запрошенных действий без необходимости подтверждения XOFF.
Операторы компьютеров до сих пор иногда вручную используют XOFF/XON для приостановки и перезапуска вывода, который в противном случае слишком быстро исчез бы с дисплея.
Программное обеспечение эмулятора терминала обычно реализует поддержку XOFF/XON как базовую функцию. Это обычно включает системную консоль на современных машинах Unix и Linux , а также эмуляторы графического интерфейса , такие как xterm и консоль Win32 .
Robust XON — это метод перезапуска связи, на случай, если она была прервана случайно полученным XOFF. Приемное устройство периодически отправляет символы XON, когда оно может принимать данные, а линия свободна. Одним из распространенных способов использования является последовательное принтеры (например, HP LaserJet II), чтобы указать, что они находятся в сети и готовы принимать данные. XON отправляется каждые 1–30 секунд в зависимости от конструкции прошивки принтера.