Поки люди позначають одне і те ж різними словами, між ними завжди буде виникати протиріччя. З іншого боку, щоб люди добре розуміли один одного (в ідеалі - однозначно), їм потрібно мати єдиний словник понять.
Публікуючи цю статтю я не претендую на звання гуру і не хочу узурпувати право на істину. Більш того, я припускаю, що стаття буде трохи змінюватися при отриманні додаткової інформації, якою я не мав на момент її написання.
Ось так вийшло, що переважна більшість людей, які зараз активно використовують Лінукс, прийшло з табору Віндовс. І дуже незначна кількість людей виросли на UNIX / Linux системах. Мова не про те - погано це чи добре. Це факт. Просто факт, з яким я не буду тут давати оцінку. Просто давайте приймемо цей факт як певну даність, у якій є невелика проблема. Ось цю проблему я і спробую позначити.
Проблема в тому, що люди, які прийшли з табору Віндовс, не володіють системою знань щодо терміналів і інших понять, винесених в заголовок.
ДОС ніколи не була на багато користувачів системою. Віндовс, теж не зовсім розрахована на багато користувачів. Її тільки умовно можна так називати. Звичайно, в тій старій Віндовс, яку ми знали, можна було створити кілька облікових записів для різних користувачів. Але ось одночасна робота в системі відразу декільком користувачам була вкрай важка, або взагалі не можлива. Згадайте - щоб зайти в систему під іншим ім'ям, потрібно перезавантажитися.
- Ага, точно розрахована на багато користувачів!
В один і той же час в системі міг працювати тільки один користувач. Як зараз - не знаю! Давно вже не торкався до ...
- ... забув як по литині, А по русски - вже краще не говорити! (С) фраза з к / ф «Летюча миша».
Знову ж таки - це не погано, і не добре. Це просто факт, який випливає з того, що система встановлювалася на PC (англ.) - на ПЕРСОНАЛЬНИЙ комп'ютер.
- На персональний, Карл!
Ну, в тому плані, що комп'ютер спочатку був призначений тільки для одного користувача. Нікого іншого на ньому бути не повинно. Тому операційні системи, які на ньому встановлювалися, негласно слідували цій парадигмі - були теж «персональними». А в слід за «залізом» і опреаціонкой, випускалися «персональні» прикладні програми.
Через як якийсь час Майкрософт усвідомила свою помилку і почала робити багато користувачів підпірки і прикручувати милиці до персональної операционке.
Спочатку виходило жахливо ... Але не про те мова! Мова про те, що будучи баранами і не знаючи правильних шляхів, ми бігли за пастухом Майкрософтом і вбирали з материнським молоком його не зовсім правильні технології. (До речі, з тих пір у відносинах пастуха і баранів нічого не змінилося!)
Загалом, завдяки нав'язаному нам особливому розумінню, який повинен бути комп'ютер, від нас пішов цілий пласт понять багатокористувацьких операційних систем, а так само і інші поняття, типу терміналу і консолі.
Ось так, поклавши руку на серце, зізнайтеся собі - що ви не особливо розрізняєте ці поняття? Бо так?! А це означає, що плутанина в цих поняттях призводить до нерозуміння серед інших користувачів.
Але це добре! Як небудь між собою розберемося! Найстрашніше інше. Ті, хто не розуміє природи речей, використовує їх неправильно. І що найсумніше - деяких особливо упоротих ж не переконаєш!
Спочатку кілька сухих визначень. Я їх ніде не вичитав, ні звідки не скопіював. Це всього лише моя інтерпретація цих понять. І я не володію монополією на ці поняття. Якщо вам є що сказати по справі, то я із задоволенням вислухаю вас і, можливо, внесу корективи в визначення.
Що таке «Термінал»?
Термінал - це деяке обладнання, яке підключено до комп'ютера не безпосередньо, а через деякі ліній зв'язку та додаткове обладнання, наприклад, модеми. Термінал - він так тому і називається, що терминирующего (то є кінцевим пристроєм) для каналу інформації. Тобто від терміналу інформація вже нікуди не йде. (Ну, хіба що «в людини»!)
Як правило, термінал складається з двох пристроїв - пристрої введення та пристрої виведення.
Пристроєм введення зазвичай служить клавіатура. Також до пристроїв введення можна віднести мишку і деякі інші аксесуари.
Як пристрій виведення зазвичай використовується дисплей. Але в ряді випадків, можна використовувати також і принтер.
До речі кажучи, спочатку в якості терміналу використовувався телетайп. Телетайп - це така пекельна друкарська машинка з електронним управлінням. Можете вважати, що телетайп - це принтер, поєднаний з клавіатурою.
Забавно відзначити, що саме телетайп дав абревіатуру tty (від t ele ty pe), яка стійко використовується і до цього дня.
Термінал служить для здійснення інтерактивного управління комп'ютером - введення команд і отримання результатів роботи. У певному сенсі, термінал - це інформаційні ворота в систему.
Потрапити в систему можна тільки через термінал. Для цього потрібно ввести ім'я облікового запису та пароль. Після успішного входу (реєстрації в системі), ви можете повноцінно управляти системою. Запам'ятайте, це важливо!
Що таке «Консоль»?
Консоль - це всього лише працює екран дисплея, зображення на екрані. Непрацюючий дисплей консоллю не є! Консоль завжди «жива», вона завжди показує актуальну (поточну) інформацію.
Дисплей обов'язково повинен бути приєднаний до комп'ютера безпосередньо. Інакше це буде консоль чи не цього компа, а того, до якого підключений дисплей.
Відеокарта, до якої підключений дисплей, є частиною обладнання компа. Процесор компа записує байти в адресний простір (в відеопам'ять) цієї карти. Процесор має безпосередній доступ до цієї відеопам'яті. Відображення на екрані вмісту цієї відеопам'яті називаються консоллю. Запис в інформації в відеопам'ять - це і є висновок на консоль.
Так. У світі повно понять, яким неможливо дати чіткого визначення. Але можна познайомити людини з цими поняттями методом багаторазових описів цих понять з різних позицій.
Що таке «Дисплей»?
Дисплей - це фізичний пристрій для відображення інформації на екрані.
Дисплеї бувають різного типу. Зараз в основному всі дисплеї рідко-кристалічні (РКІ), кольорові. А ось 10-15 років тому дисплеї виготовлялися на основі електронно-променевих трубок (ЕПТ). В основному вони теж були кольоровими.
Якщо просунутися по часу ще трохи далі, то можна відзначити, що в світі випускалися ще й монохромні дисплеї. Вони могли світитися тільки якимось одним кольором - або білим, або помаранчевим, або зеленим. Колір світіння визначався типом люмінофора (світиться покриття) ЕПТ.
До речі, старі маститі програмісти, які захопили цей період розвитку обчислювальної техніки, зазвичай віддають перевагу саме зелений колір символів при виведенні інформації на свої термінали. З одного боку, їм так звичніше, а з іншого - зелений колір найбільш комфортний для очей.
В середині 80-х років радіоаматори в якості дисплея для своїх саморобних комп'ютерів (РК-86, Sinclair Spectrum і інших) використовували телевізори. А чому б і ні?! Інформацію з компа відображає - значить, теж дисплей!
Що таке «Монітор»
Тут трохи складніше. Монітор - це може бути і програма, і може бути який-небудь пристрій. Монітором може бути дисплей, хоча і не обов'язково, що це завжди так.
Основне призначення монітора - стежити за процесом - «моніторити».
Чим термінал відрізняться від консолі?
Консоль завжди підключена до свого обчислювальному блоку безпосередньо. Наприклад за допомогою VGA-кабелю.
Термінал же підключений до обчислювальному блоку за допомогою лінії зв'язку. Лінія зв'язку може бути як короткою, так і вельми довгою. Прикладом короткої лінії зв'язку є шнур RS232, який підключає термінал до послідовного порту комп'ютера.
Довга лінія зв'язку (якщо взагалі так можна говорити!) - це інтернет-з'єднання.
Десь на іншому кінці земної кулі працює потужний комп, а на вашому столі стоїть простенький компік. Ваш комп - це ні що інше, як віддалений термінал потужного супер-комп'ютера. Весь тягар вирішення ваших мега-завдань лягає на плечі потужного компа. Ваш компік займається тільки відображенням результатів роботи великого комп'ютера. Ви також вводите на своєму компі (точніше - на його клавіатурі) команди для виконання на великому комп'ютері.
Оскільки дисплей вашого компа підключений безпосередньо до вашого вашого комп'ютера (вибачте за тавтологію!), То він є консоллю по відношенню до вашого комп'ютера. Тільки до вашого комп'ютера!
З іншого боку, весь ваш комп разом з клавіатурою і дисплеєм є терміналом по відношенню до супер-комп'ютера.
Чим консоль відрізняється від дисплея?
Консоль - це екран, на якому відображається інформація в даний час. Дисплей - цей пристрій, який може бути вимкнено або взагалі зламано.
Дисплей «стає» консоллю, коли він відображає поточну інформацію від компа, до якого він підключений. Вимкніть дисплей, екран його згасне, ніякої інформації на екрані не буде - ні про яку консолі говорити вже не можна.
Увімкніть знову.
- О-о! На консолі з'явилося повідомлення про помилку! Інтернет обірвався ...
Хто видав це повідомлення на консоль?
Припустимо, наш комп підключений до комп'ютера обчислювального центру в CERN-е (Центр ядерних досліджень). Наш комп'ютер для того ЦЕРН-ського комп'ютера - це віддалений термінал.
До цього моменту на консоль нашого компа виводилося зображення з великого комп'ютера. Потім зв'язок обірвався. Отже від ЦЕРН-а ніяких повідомлень про помилку вчинити не може.
З іншого боку, процесор вашого компа пов'язаний з консоллю безпосередньо. Саме він і видав повідомлення на свою консоль.
Сподіваюся, мені вдалося передати тонку грань відмінності між цими поняттями.
Що таке «Віртуальний термінал»?
Ви бачили процес завантаження Debian?
Спочатку на (чорному) екрані дисплея пробігають (білі) повідомлення про розгортання системи, завантаження модулів і так далі. Так ось, це все ще не «віртуальний термінал». Це всього лише відображення на консолі вашого компа.
Через якийсь час на екрані з'являється напис:
Це висновок першого терміналу - 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 #) зверху важким фреймворком, без якого ця програма просто не злетить. І дай вам Бог не переплутати версію фреймворку!
Іноді я дивуюся, на які тільки жертви не йдуть люди, щоб тільки не вивчати Лінукс! В Лінуксі нічого цього робити не потрібно. Все це вже давним давно зроблено і налагоджено - всі ці термінали і пререкодіровщікі. Бери і користуйся! А якщо ти такий розумний, і тобі хочеться творчості - бери готове і допрацьовувати, вдосконалюй! Єдина проблема - не бажання людини знати, як це працює.
- Ні! Ми будемо винаходити свій «велісапет» з зеленими колесами!
Але найсумніше це те, що все це розробляється фахівцем без урахування поняття що таке термінал і для чого він взагалі потрібен.
Здавалося б, просте запитання:
Термінал також призначений і для реєстрації користувача в системі і подальшого надання доступу до неї. А як бути з цим «універсальним терміналом» - адже він не дозволить термінального пристрою зареєструватися в системі і не надасть можливість давати їй (системі) команди для виконання. А якщо з нього неможливо увійти в систему, то ніякий це зовсім і не термінал, а так собі - жорстко обмежена в своїх можливостях програма, яка тільки й уміє що приймати і відправляти байти тільки через СОМ-порт, так відображати їх на екрані консолі. Автор, звичайно, вільний називати своє творіння терміналом, але терміналом ця програма - від того, що її так називають - вона все одно не стане.
Ось так, поклавши руку на серце, зізнайтеся собі - що ви не особливо розрізняєте ці поняття?Бо так?
Що таке «Термінал»?
Що таке «Консоль»?
Що таке «Дисплей»?
А чому б і ні?
Чим термінал відрізняться від консолі?
Чим консоль відрізняється від дисплея?
Хто видав це повідомлення на консоль?
Що таке «Віртуальний термінал»?