Терминал, консоль, дисплей…

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

Публикуя эту статью я не претендую на звание гуру и не хочу узурпировать право на истину. Более того, я предполагаю, что статья будет немного изменяться при получении дополнительной информации, которой я не имел на момент её написания.

Вот так получилось, что подавляющее большинство людей, которые сейчас активно используют Линукс, пришло из лагеря Виндовс. И очень незначительное количество людей выросли на UNIX/Linux системах. Речь не о том — плохо ли это или хорошо. Это факт. Просто факт, которому я не буду здесь давать оценку. Просто давайте примем этот факт как некую данность, у которой есть небольшая проблема. Вот эту проблему я и попытаюсь обозначить.

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

ДОС никогда не была многопользовательской системой. Виндовс, тоже не совсем многопользовательская. Её только условно можно так называть. Конечно, в той старой Виндовсе, которую мы знали, можно было создать несколько учётных записей для разных пользователей. Но вот одновременная работа в системе сразу нескольким пользователям была крайне затруднительна, либо вообще не возможна. Вспомните — чтобы зайти в систему под другим именем, нужно перезагрузиться.

— Ага, точно многопользовательская!

В одно и то же время в системе мог работать только один пользователь. Как сейчас — не знаю! Давно уже не прикасался к …

— … забыл как по лытыни, А по русски — уж лучше не говорить! (с) фраза из к/ф «Летучая мышь».

Опять же — это не плохо, и не хорошо. Это просто факт, который вытекает из того, что система устанавливалась на PC (англ.) — на ПЕРСОНАЛЬНЫЙ компьютер.

— На персональный, Карл!

Ну, в том плане, что компьютер изначально был предназначен только для одного пользователя. Никого другого на нём быть не должно. Поэтому операционные системы, которые на нём устанавливались, негласно следовали этой парадигме — были тоже «персональными». А в след за «железом» и опреационкой, выпускались «персональные» прикладные программы.

Спустя как какое-то время Майкрософт осознала свою оплошность и начала делать многопользовательские подпорки и прикручивать костыли к персональной операционке.

Сначала получалось ужасно… Но не о том речь! Речь о том, что будучи баранами и не зная правильных путей, мы бежали за пастухом Майкрософтом и впитывали с материнским молоком его не совсем правильные технологии. (К стати, с тех пор в отношениях пастуха и баранов ничего не изменилось!)

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

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

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

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

Что такое «Терминал»?

Терминал — это некоторое оборудование, которое подключено к компьютеру не непосредственно, а через некоторые линий связи и дополнительное оборудование, например, модемы. Терминал — он так потому и называется, что терминирует (то является оконечным устройством) для канала информации. То есть от терминала информация уже никуда не идёт. (Ну, разве что «в человека»!)

Как правило, терминал состоит из двух устройств — устройства ввода и устройства вывода.

Устройством ввода обычно служит клавиатура. Также к устройствам ввода можно отнести мышку и некоторые другие девайсы.

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

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

Забавно отметить, что именно телетайп дал аббревиатуру tty (от teletype), которая устойчиво используется и по сей день.

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

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

Что такое «Консоль»?

Консоль — это всего лишь работающий экран дисплея, изображение на экране. Неработающий дисплей консолью не является! Консоль всегда «живая», она всегда показывает актуальную (текущую) информацию.

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

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

Да. В мире полно понятий, которым невозможно дать чёткого определения. Но можно познакомить человека с этими понятиями методом многократных описаний этих понятий с разных позиций.

Что такое «Дисплей»?

Дисплей — это физическое устройство для отображения информации на экране.

Дисплеи бывают разного типа. Сейчас в основном все дисплеи жидко-кристаллические (ЖКИ), цветные. А вот 10-15 лет назад дисплеи изготавливались на основе электронно-лучевых трубок (ЭЛТ). В основном они тоже были цветными.

Если продвинуться по времени ещё чуть дальше, то можно отметить, что в мире выпускались ещё и монохромные дисплеи. Они могли светиться только каким-то одним цветом — либо белым, либо оранжевым, либо зелёным. Цвет свечения определялся типом люминофора (светящегося покрытия) ЭЛТ.

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

В средине 80-х годов радиолюбители в качестве дисплея для своих самодельных компьютеров (РК-86, Sinclair Spectrum и других) использовали телевизоры. А почему бы нет?! Информацию из компа отображает — значит, тоже дисплей!

Что такое «Монитор»

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

Основное назначение монитора — следить за процессом — «мониторить».

Чем терминал отличатся от консоли?

Консоль всегда подключена к своему вычислительному блоку непосредственно. Например с помощью VGA-кабеля.

Терминал же подключен к вычислительному блоку с помощью линии связи. Линия связи может быть как короткой, так и весьма длинной. Примером короткой линии связи является шнур RS232, который подключает терминал к последовательному порту компьютера.

Длинная линия связи (если вообще так можно говорить!) — это интернет-соединение.

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

Поскольку дисплей вашего компа подключен непосредственно к вашему вашему компу (простите за тавтологию!), то он является консолью по отношению к вашему компу. Только к вашему компу!

С другой стороны, весь ваш комп вместе с клавиатурой и дисплеем является терминалом по отношению к супер-компьютеру.

Чем консоль отличается от дисплея?

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

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

Включите снова.

— О-о! На консоли появилось сообщение об ошибке! Интернет оборвался…

Кто выдал это сообщение на консоль?

Допустим, наш комп подключен к компьютеру вычислительного центра в CERN-е (Центр ядерных исследований). Наш компьютер для того ЦЕРН-ского компьютера — это удалённый терминал.

До этого момента на консоль нашего компа выводилось изображение с большого компьютера. Потом связь оборвалась. Следовательно от ЦЕРН-а никаких сообщений об ошибке поступить не может.

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

Надеюсь, мне удалось передать тонкую грань различия между этими понятиями.

Что такое «Виртуальный терминал»?

Вы видели процесс загрузки Debian?

Сначала на (черном) экране дисплея пробегают (белые) сообщения о разворачивании системы, загрузке модулей и так далее . Так вот, это всё еще не «виртуальный терминал». Это всего лишь отображения на консоли вашего компа.

Через какое-то время на экране появляется надпись:

booting

Это вывод первого терминала — tty1.

Вот с этого момента мы уже можем говорить о том, что консоль отображает сообщения того или иного виртуального терминала.

Как правило, в Линуксе таких терминалов шесть и плюс еще седьмой терминал — графический. (Мы пока отложим его рассмотрение, иначе запутаемся.)

Итак, мы имеем шесть символьных терминалов. Символьные терминалы способны отображать только буквы, цифры и знаки препинания — то есть символы. Символьные терминалы не способны отображать графические примитивы и картинки.

Как вы знаете, переключаться с одного терминала на другой можно с помощью комбинаций клавиш Ctrl+F1, Ctrl+F2. Ctrl+F3… Ctrl+F6. До самих терминалов эти команды не доходят, их обрабатывает консоль — она переключает изображения. Другими словами, консоль может «показывать» изображение только с одного терминала.

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

Настоящий (не виртуальный) терминал — это существующее физическое устройство, и оно подключено к компу через линию связи.

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

Что такое «Псевдо-терминал»?

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

Как правило, в Линуксе седьмой виртуальный терминал является графическим. На нем отображаются картинки, менюшечки, кнопочки, окна разных программ и всё остальное!

Но кроме того, этот терминал может отображать так же и окна одной особой программы — программы псевдо-терминала. Это может быть gnome-terminal, xterm, mate-terminal и другие программы.

Что делают эти программы? Они отображают текстовую информацию на своем окне. Эти программы эмулируют работу терминала.

Они такие же виртуальные, как и те шесть виртуальных терминалов. Разница только в том, что эти псевдо-терминалы отображаются «на теле» седьмого виртуального терминала.

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

Послесловие

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

Во первых, при повседневном общении очень трудно учитывать (то есть произносить каждый раз) тип терминалов. Поэтому обычно произносят одно слово — «терминал», а вот конкретный тип — псевдо-терминал, виртуальный терминал, графический и о чём там идёт речь, — это всё определяется контекстом разговора.

Во вторых, я сказал, что шесть символьных виртуальных терминалов не способны отображать графическую информацию. Это не совсем так! Сам по себе терминал не предназначен для вывода графики. Но его информация отображается на консоли, а консоль — это часть оборудования компа. Помните, я говорил, что консоль всегда непосредственно подключена к системному блоку?

Так вот, консоль часть своей поверхности может отдать под вывод виртуального терминала, а часть — заполнить сама. Например вот так:

На этой фотке изображен процесс загрузки Линукса. Нижняя часть дисплея отведена под символьный вывод, и тут присутствует только символьный вывод. А в верхней части экрана находится графическое изображение. Иначе говоря, обладая определёнными знаниями можно творить чудеса.

Количество пингвинчиков (Tux-ов) сообщает нам о количестве ядер в системе. На этой фотке один Тукс, значит, комп — одноядерный.

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

Вы знаете, что Линукс говорит что «всё есть файл». Всякий терминал — тоже есть файл. Всякое устройство имеет свое имя в системе и с ним можно работать как с обычным файлом. (Ну, за некоторым исключением, конечно!) Файлы устройств размещаются в специальном, предназначенном для них, директории — /dev.

Файлы устройств редко используются сами по себе, обычно их упоминают (используют) в совокупности с полным путём к ним.

Вот примеры обозначений файлов виртуальных терминалов:

/dev/tty1
/dev/tty1
/dev/tty3

/dev/tty7

Есть еще один файл виртуального терминал — /dev/tty0. Этот терминал по умолчанию, то есть — консоль. Его файл недоступен для обычных пользователей, в него может писать только root.

Например, если root зарегистрировался на 3-ем виртуальном терминале (/dev/tty3), то вывод команды:

root@mycomp:~# echo "Привет от root-а!" > /dev/tty0

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

root@mycomp:~# echo "Привет от root-а!" > /dev/tty0
Привет от root-а!
root@mycomp:~# _

Кроме того, у самой консоли тоже имеется файл — /dev/console.

Что касается псевдо-терминалов, то имена их файлов будут такими:

/dev/pts/0
/dev/pts/1
/dev/pts/2

То есть, для них создан специальный поддиректорий pts, в котором именами являются числа — 0, 1, 2 и так далее.

Ну и наконец имена настоящих удалённых терминалов. Это может показаться странным, но на самом деле, если подумать, всё правильно — имена (настоящих) удаленных терминалов точно такие же как и у псевдо-терминалов — /dev/pts/0, dev/pts/1, dev/pts/2 и так далее.

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

Четвертый момент касается не столько темы терминалов, сколько самого принципа построения Линуксовых программ.

Вот смотрите, допустим, у вас есть некая программа, которая что-то там «у себя в голове» вычисляет. Ну, для предметности разговора, допустим, программа вычисляет таблицу квадратов чисел от 1 до 10. Границы вычислений заданы в программе в виде констант и не вводятся извне (с клавиатуры, из файла или еще как-то).

Вопрос — когда програ посчитает, куда она должна вывалить результат?

Начнем немного не логично — прога может осуществить запись результатов на диск в обычный текстовый файл. Мы можем это файл потом скопировать на флешку, посмотреть  в редакторе, распечатать на принтере, ну и так далее. Это один из способов выдать во внешний мир результат работы. Но его не интересно рассматривать в контексте терминалов.

Другой способ — прога может выдать результаты на терминал. Стоп! А что такое терминал в понятиях программы?

Если прога написана на С/С++, то использование функции printf приведёт к выводу информации в стандартное устройство вывода — /dev/stdout.

А что у нас является стандартным устройством вывода?

Правильно — по умолчанию это терминал. Если программа была запущена в в терминале /dev/tty2, то туда и будет осуществлён её вывод.

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

/dev/stdin
/dev/stdout
/dev/stderr

Причем, вся пикантность ситуации заключается в том, что программе даже и знать не надо, куда или откуда ведёт та или другая «дырочка».

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

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

Например, к последовательному порту компа /dev/ttyS0 подключено некое микроконтроллерное устройство. С точки зрения Линукса — это ни что иное, как удалённый терминал. Теперь, чтобы начать с этим терминалом работать, нам всего лишь нужно указать, что к «дырочкам» /dev/stdin и /dev/stdout нашей комповой программы будет пристыкован /dev/ttyS0, а не /dev/tty0. Причём, на исходном коде нашей комповой программы это никак не отразиться. Перекомпиляция не потребуется!

Если наше устройство будет пристыковано к компу не через последовательный порт, а через USB-порт, который эмулирует последовательный порт, то и в этом случае ничего не надо менять. Комповая программа будет одинаково работать как с /dev/ttyS0, так и с /dev/ttyUSB0. (Я тут написал ttyS0 и ttyUSB0, но понятно, что это условно. Конкретные имена файлов устройств нужно уточнять на месте.)

Более того, может оказаться так, что устройство еще не готово, а комповую прогу уже нужно начинать отлаживать. Вопрос — как?

— Да, элементарно, Ватсон!

В качестве входного потока вполне сгодится поток с клавиатуры или из файла на диске. В крайнем случае можно написать простенькую прогу, которая будет выдавать (привязанный ко времени) предполагаемый поток данных (команд управления) на свой стандартный вывод /dev/stdout. Затем средствами операционной системы нужно направить вывод этой тестовой проги (эмулирующей устройство) на вход проги, которую мы отлаживаем. И всё!

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

Пятый момент.

Идеологически правильные программы проектируются и создаются с учетом принципа, что внутри программы данные не имеют визуального представления. Данные — это всего лишь биты и байты! Поэтому у «нормальных» программ прослеживаются два уровня: уровень backend и уровень frontend.

Уровень backend отвечает только за обработку данных. Откуда они приходят, куда уходят, как отображаются — это не его проблемы! Этот уровень живет внутри ящика с тремя «дырочками», о которых мы недавно говорили.

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

Этот уровень определяет как следует выводить результат работы программы — выводить ли таблицу квадратов чисел от 1 до 10 в виде таблички из двух колонок, отображать ли в виде графика, или еще как-то.

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

Мне бы не хотелось сейчас охаивать Виндовые программы, в которых уровни backend и frontend сильно переплетены друг с другом и проникают друга друга на столько сильно, что порой не понятно как это всё вообще работает! Вспомнить Delphi, так можно вообще тихо сползти под стол!

Вот недавний пример радиолюбительской братии. Некто пишет универсальный терминал для работы с последовательным портом в Виндовсе.

— Э-э… Простите, что?

Да, да! Человеку нужна программа для работы с последовательным портом. Для чего? Для того, чтобы можно было получать информацию от внешних устройств, подключенных к последовательному порту. (В Виндовсе этот порт называется «коммуникационным» и имеет обозначение COM.)

И что этот «великомученик» делает? Он пишет код для отображения информации в текстовом виде. В шестнадцатиричном виде. В ещё каком-то виде! Он еще не учел — о-о, ужас! — разные кодировки: CP1251, CP866 и LCD-кодировку для символьных дисплеев. А вдруг появится необходимость учитывать ещё и Unicode… Чувствуете, что на душе становится как-то кисло?

Причём ему нужно отображать текст именно зелёными символами на чёрном фоне. Добавьте сюда еще и то, что человеку нужно управлять самим портом. Ну, например, задавать скорость или выбирать номер (COM2 вместо COM1).

Человек в один проект закладывает столько функционала, что я уверен, что наступит момент, когда рухнувшая мега-конструкция «универсального терминала» упадет на каком-то этапе прикручивания очередной подпорки и похоронит желание автора вообще продолжать её развитие.

Если вы еще не устали от сарказма, то для полноты картины придавите весь этот винегрет из Си-Шарпоского кода (автор программы пишет её на C#) сверху тяжёлым фреймворком, без которого эта программа просто не взлетит. И дай вам Бог не перепутать версию фреймворка!

Иногда я удивляюсь, на какие только жертвы не идут люди, чтобы только не изучать Линукс! В Линуксе ничего этого делать не нужно. Всё это уже давным давно сделано и отлажено — все эти терминалы и пререкодировщики. Бери и пользуйся! А если ты такой умный, и тебе хочется творчества — бери готовое и дорабатывай, совершенствуй! Единственная проблема — не желание человека знать, как это работает.

— Нет! Мы будем изобретать свой «велисапет» с зелеными колёсами!

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

Казалось бы, простой вопрос:

Терминал также предназначен и для регистрации пользователя в системе и последующего предоставления доступа к ней. А как быть с этим «универсальным терминалом» — он ведь не позволит терминальному устройству зарегистрироваться в системе и не предоставит возможность давать ей (системе) команды для исполнения. А если с него невозможно войти в систему, то никакой это вовсе и не терминал, а так себе — жестко ограниченная в своих возможностях программа, которая только и умеет что принимать и отправлять байты только через СОМ-порт, да отображать их на экране консоли. Автор, конечно, волен называть своё творение терминалом, но терминалом эта программа — от того, что её так называют — она всё равно не станет.

Реклама

8 responses to “Терминал, консоль, дисплей…

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

    • Да. Есть такой момент в жизни. Но я планировал рассказать немножко не об этом.

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

      Но я не филолог. Я обычный техник. Поэтому говорю о проблемах в своей сфере.

  2. Хорошая статья. Вы совершенно правильно начали с понятий. Да, в них причина многих недоразумений.
    Я-бы только хотел сказать, что в наше время не иметь фундаментальных представлений об основах ОС вполне возможно.
    Мне кажется, что в силу своего коммерческого происхождения, а так-же своей изначальной ориентации на, мягко говоря, непрофессионалов, Windows и развивалась как красивая картинка, к которой последовательно прикручивали функционал имитирующий нормальную ОС. И правильного представления она в принципе дать не может. Но она многократно увеличила число пользователей ПК потому что была более удобна в использовании для прикладных задач. И , по моим наблюдениям, большинство разработчиков под Delfy или С# как раз скорее прикладники, которым их предметная область ближе чем какие-то «заморочки» и исторические особенности «правильных ОС».
    Сейчас есть даже веб- программирование и веб-дизайн, которые лет 20 назад программированием не называли. Тогда программистами ещё считались те, кто пишет на Ассемблере. Они есть и сейчас, но их уже не слышно.
    Боюсь, что всем нам придётся мириться с тем, что программирование стало объёмным и многомерным и уже далеко не всем нужно знать такие важные, с точки зрения ОС, понятия как консоль и терминал.
    Тем не менее, Ваша статья, подробно и правильно объясняющая основы правильного взгляда на важные для любой ОС понятия, необходима для всех тех, кто желает иметь верное представление об основах компьютерного мироздания. Только такое правильное представление о функционировании ОС и «железа» позволит иметь образную связь между реальным миром электроники — цифровой техники и виртуальным миром программного обеспечения.

    • Спасибо, Сергей! Спасибо!
      Не скрою, всегда приятно слышать лестные отзывы в свой адрес.
      Положительная оценка стимулирует на дальнейшее продолжение деятельности.

  3. Здравствуйте! Я начинающий пользователь Линукса. Прочитал много разных статей и окончательно запутался в теме… Скажите, я правильно понимаю, что весь вывод из текстовых, и, самое главное, из графических виртуальных терминалов в конечном счете направляется в /dev/console (/dev/tty0)?!
    Спасибо!
    С уважением, Алексей К.

    • День добрый, Алексей!

      Давайте, Алексей, подумаем вот, о чём — что из себя представляет экран? Что это такое? Как выглядит процесс вывода информации на экран? Для простоты понимания будем говорить о символьном выводе (то есть не о выводе графики).

      Давайте рассмотрим вопрос немного из далека. Вот, смотрите — в мире DOS было так: адресное пространство, которое мог адресовать процессор, условно разбивалось на функциональные области. То есть такие области с конкретными фиксированными адресами, где располагались некоторые конкретные устройства. Например, в области адресов от 0x00000 до 0x9FFFF располагалась оперативная память (RAM). Это те самые легендарные 640 Кбайт, которых «должно хватить на все случаи жизни». Здесь размещались и пользовательские программы, и коды ядра операционной системы, и данные. Здесь же находился и стек, и вектора прерываний, и «куча», и другие глобальные переменные. Если вы заметили, эта область находится в начале адресного пространства.

      Теперь переходим сразу к концу адресного пространства — к области памяти от 0xF0000 до 0xFFFFF. Здесь обычно располагались микросхемы постоянной памяти (ROM). В этих микросхемах был записан BIOS. А в некоторых более продвинутых компьютерах в этой области также находились микросхемы с интерпретатором BASIC.

      Между этими двумя областями, которые занимали оперативная память и BIOS, располагалась также область видео-памяти. Вот о ней-то и поговорим более подробно.

      Область видео-памяти начиналась с адреса 0xB8000. Конец области видеопамяти зависел от размера оперативной памяти, которая была установлена в видео-адаптере (видео-карте, или говоря по нынешнему — в «видяхе»).

      Возьмем в качестве «подопытного» образца стандартный видео-адаптер CGA. У CGA-адаптера видеопамять имела размер 16 КБайт. Таким образом, верхняя граница видео-памяти у CGA была равна 0xBBFFF.

      Вы видите, что три названные области не граничат друг с другом. В областях памяти от 0xA0000 по 0xB7FFF и от 0xBC000 по 0xEFFFF не было никаких устройств. Это были «дыры» в адресном пространстве. Сюда потом «встраивались» модемы, звуковые карты, сетевые карты и другое оборудование со своими микросхемами дополнительного BIOS-а.

      И уж поскольку я обмолвился о нюансах распределения памяти, то стоит упомянуть, что видео-адаптер CGA имел два режима работы: символьный и графический. В символьном (понятно!) он мог отображать только символы. А вот в графическом режиме адаптер мог рисовать любые геометрические фигуры, да и вообще всё, что угодно! При этом адреса видео-памяти или границы начала и конца видео-памяти зависели от режима работы видео-адаптера. Адреса видео-памяти адаптера, работающего в символьном режиме, я уже назвал. Но если адаптер перевести в режим «графики», то его видеопамять перестраивалась на адреса 0xA0000…0xA3FFF. Но это к делу не относится, просто рассматривайте как побочные знания!

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

      Куда и что писать — это было в воли программиста (и его программы), и ничто не ограничивало его действий. Делай, что хочешь!

      В общем-то, это был один из нескольких способов вывода информации на экран — достаточно было записать байт (код символа) в видео-память, и он (символ) тут же появлялся на экране. Легко и быстро. Красотень!

      Так вот, этот видео-адаптер ничто иное как именно пример классической КОНСОЛИ. Консоль — встроенное в компьютер оборудование, находящееся под прямым управлением процессора или его шин (адреса, данных, управления — вспомните архитектуру микропроцессорных устройств). Но факт того, что экран дисплея — это есть консоль, в среде DOS-программистов и пользователей как-то не очень сильно подчёркивался. Ну да, консоль. Ну да, экран. И что тут такого уникального? Да, ничего! Понятия «терминал» для DOS-среды не существовало. Поэтому соотносить (сравнивать, оценивать по отношению с чем-то) консоль было не с чем. Так, собственно, и жили — DOS-овские программы свой вывод осуществляли на
      консоль, которая иногда называлась экраном. Я еще раз скажу — определение консоли, её осознание в архитектуре компа, было абсолютно не важно — другого ведь ничего не было! Поэтому на этом вопросе не заостряли внимание.

      ТЕРМИНАЛ — это как правило удалённое оборудование (хотя и не всегда так). Говоря языком ребенка «терминал имеет свой выключатель питания». Нельзя говорить о терминале, как об интегрированном оборудовании в процессорный блок, и уж тем более об оборудовании, которое «отображается» на область памяти процессора и управляется его сигналами (его шинами). Если это так, то это консоль, но не терминал. Вы видите разницу?

      Чуть-чуть вернемся назад в нашем рассуждении. Обращаться к видео-адаптеру (во времена DOS) можно было также и другим способом — через вызовы подпрограмм BIOS. Упрощённо говоря, кладете в регистр процессора код символа, который хотите отобразить на экране, и вызываете подпрограмму, которая находится в BIOS-е. Тоже всё просто, но отображение информации на экране будет происходить чуть медленнее. Оно и понятно — если при прямом доступе процессор тратит время только на перемещение байта из регистра в область памяти, то тут приходится выполнять программный код, который по длительности выполнения займет времени раз в 100 больше.

      К подпрограмме вывода BIOS можно было обратиться напрямую вызвав её. А можно было занести необходимые данные в регистры процессора и вызвать прерывание. Если вы еще не догадались, то вектор прерывания как раз был направлен на подпрограмму вывода BIOS.

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

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

      Ну, так или иначе, способов вывода символа на экран было много. Причём, и это следует особо подчеркнуть, все способы вывода были примерно равнодоступны программисту. Я еще раз обращу внимание на этот факт — программист мог напрямую «залезть» в видео-память и что-то там изменить. И никто это об этом не мог никак узнать и, следовательно, как-либо ограничить его действия.

      А, собственно, и причин-то ограничивать непредсказуемые действия программиста не было! А зачем!? Компьютер-то — пер-со-наль-ный! Всё, что ты там делаешь, оно будет иметь последствия только для тебя. Ну, если ты сам себе злой Бурратино, то делай, что хочешь! Какое дело до твоего личного компа другим пользователям? — Да, здравствуют вирусы! Ура и понеслась!

      Теперь после длительного заплыва в океане DOS, давайте перейдем в нашу родную стихию — в мир UNIX/Linux. В отличие от DOS (Windows), среда UNIX/Linux изначально была ориентирована на общественное использование. Поэтому фокусы со вседозволенностью, которую предоставляет консоль, тут наглухо забетонированы.

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

      Но ведь как-то надо систему чинить? Тут уж не до консолей! Если есть возможность что-то отобразить на экране встроенного оборудования, то этим нужно пользоваться. Если можно писать сразу в область видео-памяти, или обращаться к экрану через BIOS, то почему бы этим не воспользоваться? Тем более, что консольный и терминальный ввод/вывод — это как велосипед и самолёт. Когда система сломана, вопрос о безопасности работы пользователей не стоит. Деятельности пользователей просто не существует! Единственным владельцем компа является системный администратор, который пытается восстановить систему. И более тут никого нет. Все сидят, пьют кофе и покорно ждут, когда системы будет восстановлена. А раз так, то работать сисадмину можно в консоли. Это и проще, и быстрее. Иное дело, что консоль может быть проброшена на какое-нибудь внешнее оборудование — которое как раз и называется ТЕРМИНАЛ.

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

      Консоль — это то, что очень сильно (и аппаратно, и программно) совмещено с процессором устройства. Консоль — это оборудование, которое входит в состав процессорного устройства. Консольный вывод можно перенаправить на терминал. Терминал, как правило подключается к оборудование через какой-нибудь стандартный интерфейс, например UART, RS232 и т.д. Но в отношении персональных компов программа, которая занимается выводом информации на терминал — понятное дело — так или иначе направляет поток в оборудование встроенной консоли. Пользовательская программа «думает», что она осуществляет вывод на терминал, поскольку она пользуется обращением к функциям терминала. Но операционная система «знает», что этот поток нужно осуществлять на встроенный в компьютер видео-адаптер. А какой-нибудь другой поток вывода операционка отправляет в последовательный порт, к которому подключен терминал. А третий поток — вообще будет направлен в Канаду через интерфейс сетевой карты. Но все три программы, «уверены», они они осуществляют вывод на терминал. И это правда! Вывод от программ принимается терминальной программой, и это главное, Но куда конкретно направляется поток — это уже зависит от того, что у конкретной программы является терминалом.

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

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

      Таким образом, экраны, которые в обычном режиме мы видим и можем переключать, — это есть экраны терминалов. Но это не экраны консоли!

      Система, основанная на терминалах, не позволит программе (программисту) иметь неконтролируемый доступ к экрану. Ведь системы рассчитаны на то, что в них работают несколько пользователей. Даже если это персональный компьютер, принцип «многопользовательства» (для операционной системы UNIX/Linux) не должен отменяться. А это значит, вывод на экран информации должен проходить только через обращение программы к определенным вызовам функций операционной системы. Пользовательская программа не должна обращаться напрямую к видео-памяти. Если она это попытается сделать, операционная система её тут же выкинет как не отвечающую принципам «общежития», то есть небезопасную.

      А поскольку вывод пользовательских программ происходит через вызовы функций операционной системы, то операционка сама регулирует куда дальше будет осуществляться поток символов — либо на экран встроенного видео-адаптера, либо по сети на какой-то удалённый терминал!

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

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

      Это всё очень запутанно поскольку это базовые понятия, которые образовались на пустом месте. То есть появилось оборудование, с ним начали работать, а уж теоретическую базу стали подводить довольно-таки поздно. Сравнить это положение (ситуацию относительно консоли и терминала) можно только с положением в области сетевых технологий. Вы наверняка слышали о семи-уровневой сетевой модели. Ну, натянули сову на глобус. Ну, молодцы! Ну дальше-то что? — Не работает на практике эта модель! Это только студентов можно гнобить этой теорией, но практически применять её плохо получается. В мире появляются новые технологии передачи данных и их всё сложнее вписывать в теоретическую базу. Ну возьмите для примера Bluetooth. Возьмите Wi-Fi. Посмотрите наконец на обычные сетевые стеки стеки протоколов! Насколько хорошо эта симиуровневая модель отвечает тому, что мы имеем на практике? Вот и с консолью и терминалом примерно та же ситуация. Единственное что может хоть как-то ставить мозги на место — это чтение литературы. И в самом деле, как вы можете рассказать слепому от рождения, что на свете бывает разноцветная радуга? Дайте ему четкое и однозначное понятие что такое зеленый цвет. Пока человек сам не попробует, что такое вода, он не поймет, что значит «мокрая». Пока человек не испробует множество попыток вывода информации на экран, он будет смутно понимать чем консоль отличается от терминала.

      Теперь скажу пару слов о графическом выводе. Графический вывод программ в Линуксе осуществляется, как вы понимаете, не напрямую в область видео-памяти, а путём обращения к функциям операционной системы. То есть это не есть консольный вывод! Это опять-таки терминальный вывод. Только по сравнению с символьным выводом тут всё намного сложнее. Ну, например, Linux предполагает, что на удаленном компьютере (на терминале) крутится программа — видео-сервера. Этот сервер обслуживает запросы программы-клиента. Программа-клиент работает на удалённом компе. На минутку! — Тут у новичков всегда вскипает мозг и происходит эмоциональный взрыв.

      В их понятии сервер — это программа, которая всегда работает на большом мощном компьютере, а клиент — это программа, которая крутится на маленьком и слабеньком компике, который находится у нас. Так вот, ребята! В отношении графического вывода тут всё с точностью до наоборот! Серверная часть работает на том, компе, который непосредственно «рисует» на своем экране. Клиентская часть работает на том, компе, на котором работает сама графическая программы.

      Мы запускаем тяжёлую графическую программу на мощном 128-ми ядерном компе, который находится в институте. Эта программа работает, что-то там вычисляет и хочет осуществить вывод информации в графическом виде. Но эта программа понятия не имеет, какой у неё графический терминал. Поэтому программа запрашивает свой терминал на предмет основных его параметров: какие у него размеры экрана, сколько он цветов может отобразить , может ли сам терминал рисовать линии, дуги ну и так далее. Затем графическая программа отправляет свой вывод на этот уделённый графический терминал. Но фокус в том, что прога оправляет «картинку» не по-пиксельно! Если отправлять по-пиксельно, то это будет очень «жирный» трафик.

      Вместо этого, программа говорит терминалу «нарисуй зелёную линию от точки с координатами 100, 200 до точки с координатами 300, 400.» Терминал сам, согласно запросам программы осуществляет работу по выводу графики. Вы уже заметили, что программа, которая работает на стороне большого мощного компа, ведет себя как клиентская программа — отправляет запросы на рисование тех или иных графических примитивов. А программа, которая работает на нашем маленьком и дохленьком компике, работает как сервер — принимает и выполняет эти запросы.

      Ну, кажись, я вас окончательно запутал!

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

      Ничего! Я думаю, Вы со временем разберётесь! Легкой дороги в математику даже для царей не бывает. Недавно в интернете я прочитал одну умную фразу — «Я не умнее вас. Просто я больше больше читал на эту тему». Вот и вся разница между знающим специалистом и начинающим изучать Линукс. А Линукс — это вещь! Красивая вещь! Это вселенная, созданная руками людей. Созданная ради удовольствия, а не на продажу. Ради этого стоит жить!

      • Алексей

        Вот это ДА!!! Это лучший ответ, который я вообще когда-либо получал.
        Задал, вроде, маленький вопрос, а в ответе открыл для себя многие моменты, о которых даже не подозревал. Наконец-то понял суть графической системы. Мне она как-то особенно трудно давалась. Огромнейшее спасибо!!!
        Успехов Вам!!! Буду ждать новые статьи.
        С уважением, Алексей К.

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

        Россия — этой мой дом. Я здесь живу. Здесь живут мои родители и мои дети. И очень хочу, чтобы здесь жить было хорошо.

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

        Мир удивительно правильно устроен. Соблюдайте гармонию природы, не ломайте установившуюся иерархию: оставьте Богу богово, Царю — царёво, занимайтесь решением проблем на своем уровне.

        Когда человек станет компетентен решать вопросы на более высшем уровне, окружающая среда сама повысит ему уровень. Мир достаточно мудр, чтобы допускать ошибки и исправлять их. Доверьтесь миру. Но если человек, не имея достаточно опыта и знаний, со своей ступени будет вносить возмущения в работу верхних уровней, то он будет мешать этим уровням делать их работу. От его периодического «дёргания» мир не станет лучше. Как раз наоборот, человек будет калечить мир, причинить проблемы. В результате верхние уровни понизят уровень этого наивного «борца» за правильность жития и справедливость.

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

        Я стараюсь не прыгать и не указывать что с моей точки зрения нужно делать правительству и не прошу у Бога ничего. Я живу забочусь на своем уровне. И это у меня получается вроде бы неплохо.

        Всего Вам доброго!

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s