Главная страница  Межпроцессное взаимодействие (состязание) 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 [ 85 ] 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187

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

Программа, работающая на Х-терминале, собирающая ввод с клавиатуры или мыши и принимающая команды от удаленного компьютера, называется Х-серве-ром. Х-сервер общается по сети с Х-клиентами, работающими на удаленном хосте. Он посылает им данные с клавиатуры и мыши, а также принимает от них команды отображения. Может показаться странным наличие Х-сервера на терминале и клиентов на удаленном хосте, но работа Х-сервера состоит в отображении битов, поэтому он должен находиться близко к пользователю. С точки зрения программы, клиент велит серверу выполнить те или иные действия, например вывести текст или отобразить геометрическую фигуру. Сервер (в терминале), как и все серверы, просто делает то, что ему велят. Схема взаимодействия клиента и сервера показана на рис. 3.22.

Удаленный

X-терминал

Окно

Г 1хПроцесс Ь Х-клиента

Оконный менеджер


Монитор

Процессор Х-терминала

Процесс Х-сервера

Мышь

Клавиатура

Сеть

Рис. 3.22. Клиенты и серверы в системе X Windows

Поверх экрана Х-терминала выводятся окна, каждое из которых представляет собой прямоугольник из пикселов. У каждого окна обычно есть строка заголовка в верхней части, полоса прокрутки слева и прямоугольник в нижней левой части для изменения размера окна. Одним из Х-клиентов является программа, называемая менеджером окон (window manager). Ее назначение - контролировать процесс создания, уничтожения и перемещения окон на экране. Управляя окнами, она посылает Х-серверу команды, говорящие ему, что делать. Среди этих команд есть, например, такие, как рисование точки, линии, прямоугольника, многоугольника, заполненных прямоугольника и многоугольника и др.

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



3.9.2. Программное обеспечение терминала

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

Программное обеспечение ввода

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

Эта философия хорошо удовлетворяет потребности таких сложных текстовых редакторов, как emacs, который позволяет пользователю связать любое действие с любым символом или последовательностью символов. Однако это означает, что если пользователь вместо date наберет на клавиатуре dste, а затем исправит ошибку, удалив три последние символа и допечатав символы ate, за которыми нажмет Enter, программа пользователя получит одиннадцать ASCII-символов.

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

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



Получив символ, драйвер должен начать его обработку. Если клавиатура передает информацию о номере нажатой клавиши, а не о коде символа, который нужен для прикладных программ, драйверу требуется преобразовать номер в код символа при помощи таблицы. Не все IBM-совместимые клавиатуры имеют одинаковую нумерацию клавиш, поэтому драйвер, чтобы обеспечить поддержку различных клавиатур, должен иметь разные таблицы перекодировки для разных клавиатур. Простейший подход - скомпилировать драйвер с таблицей, предназначенной для преобразования кодов клавиш в кодировку ASCII (American Standard Code for Information Interchange, американский стандартный код обмена информацией). К сожалению, такое решение неудовлетворительно для неанглоязычных пользователей. В разных странах приняты разные раскладки клавиатур, и стандартного набора символов ASCII недостаточно для большинства людей, населяющих восточное полушарие. Например, тем, кто разговаривает на французском, португальском и испанском языках, требуются буквы с надстрочными знаками и знаки препинания, которых нет в английском. Чтобы обеспечить гибкую работу с клавиатурными раскладками для различных языков, во многих операционных системах имеется возможность загружать различные кодовые страницы. Они позволяют выбирать (при загрузке или позже), как клавиатурные коды будут преобразовываться в коды символов.

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

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

Другой подход заключается в том, что буферизация производится прямо в структуре данных терминала, без центрального пула буферов. Поскольку пользователи часто печатают команду, обработка которой требует некоторого времени (например, на перекомпиляцию и сборку большой программы), а затем печатают еще несколько строк, буфер драйвера должен вмещать не меньше 200 символов для каждого терминала. В крупной системе разделения времени с сотней терминалов постоянное выделение 20 Кбайт на буфер ввода с клавиатур кажется чрезмерным, поэтому центральный пул буферов размера около 5 Кбайт будет, видимо, достаточным. С другой стороны, при выделенном буфере для от-



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 [ 85 ] 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187

© 2000 - 2018 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.