Интернет магазин китайских планшетных компьютеров



Компьютеры - TTY-абстракция - Контроль потока и блокировка ввода-вывода

22 января 2011


Оглавление:
1. TTY-абстракция
2. Сценарий использования
3. Место TTY в модели процессов
4. Управление заданиями и сессиями
5. TTY и система сигналов
6. Контроль потока и блокировка ввода-вывода
7. Настройка TTY



Рассмотрим пример: пользователь вводит в Xterm команду yes. После этого в окне Xterm появляется множество букв y. Естественно, программа yes генерирует буквы y значительно быстрее, чем Xterm способен их принимать, обновлять свой кадровый буфер, вызывать процедуры отрисовки в X-сервере, и т. д.

Чтобы сделать возможной работу в таких условиях, применяется блокировка ввода-вывода. Буфер псевдотерминала, расположенный в пространстве ядра, имеет очень ограниченный объём, и когда он забьётся буквами y, генерируемыми программой yes, очередной системный вызов write, осуществлённый этой программой, будет заблокирован. Программа yes перейдёт в режим прерываемого сна, до тех пор пока Xterm не сможет хотя бы частично освободить буфер псевдотерминала.

Аналогичная ситуация возникнет и в случае, если TTY подключён к последовательному порту. Если программа заполнит буфер, очередной её системный вызов write заблокирует процесс. При желании TTY можно открыть в неблокируемом режиме при помощи флага O_NONBLOCK; тогда вместо блокировки системный вызов write вернёт ошибку EAGAIN.

Однако даже если в буфере ядра ещё есть место, процесс можно заблокировать. Рассмотрим, например, такую ситуацию: к компьютеру подключён старый видеотерминал VT-100, общающийся с ним на скорости 9600 бод. Пусть компьютер только что послал терминалу сложную последовательность управляющих символов, требуя пролистать текст на экране вверх или вниз. Подобная задача сильно загружает терминал, и он становится неспособен обрабатывать поступающие данные со скоростью 9600 бод. В результате внутренний буфер терминала скоро переполнится. Поэтому на время работы терминала следует заблокировать TTY.

Для этого, как и для многих других сигналов, используются спецсимволы. Например, как уже упоминалось выше, байт ^C не передаётся приложению, когда оно читает данные системным вызовом read, а вместо этого вызывает сигнал SIGINT, который передаётся активному заданию. Аналогичным образом работают байты ^S, который блокирует TTY, и ^Q, который его пробуждает. Старые текстовые терминалы автоматически передают эти байты, основываясь на объёме оставшегося свободного места в своих буферах. Это называется программным контролем потока. Именно по этой причине Xterm блокируется, если случайно нажать ^S.

Необходимо различать два случая:

  • Попытка записи в TTY, заблокированный контролем потока либо переполнением буфера ядра, приведёт к блокировке данного процесса;
  • Попытка записи в TTY во время работы в фоновом режиме приведёт к усыплению всей группы процессов.


Просмотров: 6515


<<< The UNIX-HATERS Handbook
Umask >>>