이 글에서 언급하는 terminal은 Linux-based 시스템입니다. (mac OS 포함)
Telegraph 기계의 진화
전쟁 당시 소통을 위해 Telegraph라는 기계를 통해서 원격으로 정보를 전달하였다.
전쟁 이후에도 Telegraph 기계는 사용되었고, 더 빠르고 좋은 기계가 탄생한다. Teleprinter 의 등장으로 키보드가 달렸고, ASCII Code 등 text를 encoding 하는 방식이 등장한다. (현재는 동양 언어 (한자, 한국어, 일본어 등) 을 지원하기 위해 Unicode 가 가장 대중적으로 사용된다)
컴퓨터와 TTY
Linux 운영체제를 공부하거나 /dev 에서 'ls' command를 shell에 입력하면 'tty'를 볼 수 있다. tty는 Teletype의 약자로 Teletype은 Teleprinter를 생산하는 주요 브랜드 회사이다. 정말 예전 중앙 컴퓨터를 두면서 컴퓨터를 사용했던 시절에는 컴퓨터를 사용하는 절차는 다음과 같았다.
1. Teletype을 이용하여 펀치 카드에 코드를 작성
2. 중앙 컴퓨터에 펀치 카드 입력
3. 기계 언어 출력
4. 출력된 기계 언어를 다시 해독 기계에 넣어 사람이 이해
여기서 또 한번의 발전이 발생합니다. 언제까지 펀치 카드 (종이)에 찍어서 할거야?
Video Terminal (Display Monitor) a.k.a "console", "terminal"
한마디로 유리 teletype 입니다. 터미널에 드디어 디스플레이가 달렸습니다. 컴퓨터와 분리된 external device로 존재하였으며 Video Terminal은 유리 모니터와 키보드를 포함합니다.
Unix 기반의 운영체제, (Linux, MacOS)는 모든 것이 file 이며 external device도 예외는 아닙니다. 따라서, unix 운영체제에 teletype 또는 Video Terminal 을 연결하면 연결된 device를 'tty'라는 파일로 소개합니다. 이 file은 external device와 컴퓨터 사이에 interface (소통 역할) 입니다.
그런데 teletype과 video terminal은 input, output을 연결만 하지 그 안에 어떠한 logic이 담기지 않습니다. 이걸 어떻게 할까요?
Shell
사용자가 입력하는 command를 이해하고 실행하는 (intepret) 프로그램으로 shell이 사용됩니다. shell은 kernel에 system call을 통해 운영체제 측면에서 작동할 수도 있고 user (client) 입장에서 작동할 수도 있습니다.
Terminal Emulators
이제까지 위에서 언급한 terminal은 실제 Video Terminal 또는 Teletype 등 실제로 현실 세계에 존재하는 terminal 이었습니다. 하지만 현대 기술의 발전으로 요즘은 노트북, 개인용 컴퓨터에서 몇 개의 terminal을 실행할 수 있습니다. 현대에 와서의 terminal은 점점 추상화 되어 terminal emulator로 이름이 바뀌었으며, 이 emulation을 TTY device라고 부르고 더 이상 external device가 아닙니다.
과거에는 terminal이 실제 현실세계에 존재하는 teletype 또는 video terminal로 존재하여 중앙 컴퓨터에 연결하면 /dev/tty0 /dev/tty1 로 표시되었지만 현재는 각 컴퓨터마다 Display가 따로 존재하면 여러 개의 terminal을 동시에 열 수 있고, 각 terminal은 여전히 /dev/tty0 , /dev/tty1 로 표시되지만 컴퓨터 내부에서 emulation으로 구현됩니다.
Virtual Consoles (TTY)
Virtual Console은 kernel에서 작동하는 terminal emulator 입니다. 더 이상 teletype 또는 video terminal이 사용되지 않는다면 당연히 Display를 보기 위해서 Virtual Console이 사용 됩니다. 이 Virtual Console은 input, output 만 담당하기 때문에 모든 운영체제에서 termianl에 shell을 붙입니다. 모든 command는 shell을 통하여 이해된다.
사용자 입력 -----> Kernel (Terminal (/dev/tty1) ) < ------ > Shell
중요한 점은 Virtual Console 자체는 kernel 에서 실행되지만, 사용자가 상호 작용하는 shell은 user 영역에서 실행됩니다.
이후에 개발된 desktop 환경으로 인해 virtual console은 사실 서버가 아니면 잘 사용되지 않습니다. 서버에서는 여러 명에 개발자가 Virtual Console을 통해 로그인 할 수 있으며, Linux kernel은 사실 멀티-사용자를 염두에 두고 개발된 운영체제입니다.
물론 desktop 환경도 display server를 두고 있으며, display server는 TTY를 먼저 호출한 후에 호출됩니다.
Pseudoterminals (PTY)
위에서 언급했다 시피, virtual console은 kernel 영역에서 작동합니다. Pseudoterminal은 user 영역에서 작동하는 터미널입니다. Desktop 환경 (GUI 환경) 에서 실행시키는 터미널은 모두 Pseudoterminal (PTY) 입니다.
Terminal Emulator 심화
TTY Core
사용자 input (키보드, 마우스) 등등 을 line discipline으로 넘긴다.
The Line Discipline
TTY Core가 보낸 command를 이해하여 escape sequence나 control character를 실행한다.
Line Discipline은 4 개의 다른 mode로 실행 가능하다:
1. canonical mode : ENTER를 누르기 전에는 정지.
2. noncanonical mode : 모든 character는 즉각적으로 line discipline, TTY driver 를 통과형 foreground 프로세스로 전달된다.
3. cooked mode : canonical mode에서 control character, control sequence를 foregroud process로 보내지 않으면서 실행하는 mode
4. raw mode : line discipline은 더 이상 작동하지 않고 바로 TTY driver 전달된다.
TTY Drivers
Line Discipline을 통과한 command는 TTY Driver로 와서 하드웨어와 프로세스 (shell)과 직접적으로 연결된다.
'Computer Science' 카테고리의 다른 글
Linux File 구조 [리눅스 파일 구조] (0) | 2023.12.03 |
---|