index

overview

UNIVAC console

1950~60년대의 컴퓨터는 콘솔이라는 물리적인 장치를 통해 조작했다

초기 컴퓨터의 프로그램을 천공 카드로 작성하고 카드 리더기에 넣어 실행한 뒤 프린터 장치를 통해 결과를 확인하는 방식이었다

이후 60년대에는 TTY(teletypewriter, teleprinter, teletype)라는 장치를 통해 입력된 데이터를 컴퓨터에게 전송하고, 프린터에 표시된 컴퓨터의 처리 결과를 확인했다

사실 teleprinter라는 장치는 컴퓨터가 등장하기 이전부터 존재했었다

19세기 후반에 모스 부호를 사람이 해독해야 했는데, 이를 자동화하기 위해 디지털 코드 문자(Baudot Code)를 개발하였고 이 코드 체계를 기반으로 teleprinter가 탄생되었다

위키피디아의 이미지를 참고하면 제 2차 세계대전 잉글랜드에서 이 장치를 사용하는 모습을 볼 수 있다

teletype worldwor2

1950년대의 teleprinter는 키보드를 누르면 문자를 전기 신호로 변환해서 원격지로 보냈고 받은 문자는 다시 문자로 인쇄하는 방식으로 동작하는 것에 불과했으나 당시 프로그램을 실행하는 도구인 천공 카드의 비효율성을 대체할 장치가 필요했는데 그게 teleprinter였다

아래의 이미지와 같은 teleprinter를 컴퓨터에 연결해서 입/출력 장치로 통해 문자를 인식하고 컴퓨터의 모니터로 결과를 출력하는 방식으로 사용하였다 teletype demo 영상

ASR-33-Teletype

1960년대에 들어서면서 입력된 데이터를 컴퓨터에게 전달하고 컴퓨터가 처리한 결과를 실시간으로 처리할 수 있는 CRT(cathode ray tube) 비디오 모니터가 등장함에 따라 점차 화면을 사용하는 방식으로 바뀌었다

IBM 2260 비디오 디스플레이 터미널

IBM 2260 video display terminal

하지만 발전된 teleprinter라고 해도 단순히 입출력 장치일 뿐이고 실제 계산과 프로그램 실행은 메인프레임 컴퓨터에서 수행했다(터미널 자체에는 계산 능력이 없다)

컴퓨터 성능이 발전하면서 하드웨어 터미널을 직접 연결하는 방식이 비효율적이라는 문제가 생겼고 이를 해결하기 위해 운영체제에서 소프트웨어적으로 터미널을 흉내내는 방식으로 전환했다

1980~90년대에 unix에서 가상의 터미널(pty, pseudo terminal)이라는 개념을 도입하여 하드웨어 없이도 소프트웨어적으로 여러 개의 터미널을 실행할 수 있게 되었다

unix-like 운영체제들은 /dev/tty 라는 가상 장치를 통해 터미널을 관리하며 ls /dev/tty* 명령어로 현재 사용 가능한 터미널 목록을 확인할 수 있다

ls /dev/tty*

이후 gui 환경에서 동작하는 터미널 에뮬레이터(macos - terminal 등)가 등장하였고, 현재는 gpu 가속을 지원하는 고성능 터미널(kitty, alacritty 등)이 오픈소스를 통해 많은 관심을 받고 있다

teleprinter의 발전 과정 정리

console

콘솔은 초기 컴퓨터와 상호작용하는 입출력 환경을 의미하는 물리적 장치였지만 터미널의 발전에 따라 비디오 터미널에 의해 대체되었다

현재는 컴퓨터에 직접 연결된 인터페이스로써 사용자가 컴퓨터와 직접 소통(입출력)할 수 있도록 한다

또한 운영체제 콘솔, 브라우저 콘솔, 비디오 게임 콘솔 등과 같이 넓은 범주에서 소프트웨어 환경을 지칭하기도 한다

리눅스 및 맥os의 단일 사용자 부팅 모드를 사용하면 터미널도 아닌 콘솔만 제공된다

콘솔은 연결된 컴퓨터 시스템이랑만 통신할 수 있는데에 비해 터미널은 어느 컴퓨터와 통신할 수 있다

즉, 아래의 다이어그램처럼 콘솔은 로컬 환경에서만 동작하지만 터미널은 네트워크를 통해 원격 컴퓨터와 통신할 수 있다

--------------------------                        --------------------------
| 			 |			  |                        |
|	terminal ---------------------------------------> terminal(pty)    |
|   	   |		 |			  |          |             |
|	   V             |			  |          V             |
|  	 console	 |			  |        console         |
|	   |		 |			  |          |             |
|	   V	         |			  |          V             |
|    operating system	 |			  |    operating system    |
|			 |			  |                        |
--------------------------			  --------------------------

console main features

1. provide access to system input/output

사용자의 입력을 운영체제에게 전달하거나 명령어 실행 결과를 출력한다

입력 전달: stdin (standard input)

명령어 결과 출력: stdout (standard output)

명령어 오류 출력: stderr (standard error)

2. system management and debugging

운영체제 부팅 시 커널 메시지(dmesg)를 출력하거나 긴급 모드(recovery mode)에서 root 콘솔을 통해 시스템 유지보수를 수행할 수 있게 한다

3. virtual console (multitasking)

가상 콘솔은 하나의 물리적인 콘솔(물리적인 키보드/디스플레이를 공유하면서)에서 여러 개의 독립적인 콘솔 세션을 지원하는 기능이다

다음과 같은 용도로 사용할 수 있다

가상 콘솔은 주로 리눅스에서 사용되며 맥os에서는 멀티 터미널 세션 도구(tmux, screen)을 사용하여 대체한다

4. log/error msg output

/var/log/ 디렉토리에 시스템 로그를 저장한다

웹 개발 디버깅 시 브라우저 콘솔로 확인할 수 있다

tty, pty

tty

표준 입력에 연결된 터미널의 파일 이름이자 운영체제의 cli 환경에 접속할 수 있게 해주는 소프트웨어 디바이스 드라이버이다

리눅스의 경우 보통 tty0부터 tty6까지 터미널에 동시 접속할 수 있는 디바이스 드라이버이고 tty7부터 gui(x-windows)를 통한 접근을 의미한다

/dev/tty*를 통해 파일에 접근할 수 있으며 키보드 입력을 받고 출력 결과를 사용자 화면에 표시하는 역할을 한다

tty/pty 간 입출력을 전달할 수 있다

두 개의 터미널을 열고 각각 tty 명령을 통해 현재 터미널이 어느 tty를 사용하는지 확인한다 (맥os는 가상 터미널 인스턴스를 /dev/ttys* 파일로 나타낸다)

터미널 1
$ tty

/dev/ttys000

터미널 2
$ tty

/dev/ttys001

그리고 다음과 같이 연결된 tty를 통해 다른 터미널에 값을 출력할 수 있다

$ echo "Hello tty" >> /dev/ttys001

pty

네트워크 기반의 원격 접속(ssh)이나 소프트웨어적으로 구현된 가상 터미널에 접속할 수 있게 해주는 디바이스 드라이버

사용자가 터미널(tmux 등)을 열거나 원격 접속하면 pty가 동적으로 생성된다

pty는 pty master와 pty slave로 구성된다

마스터: 사용자 프로그램(ssh, tmux 등)이 연결되는 가상 터미널로, 마치 사용자가 직접 tty에서 입력하는 것처럼 동작한다

슬레이브: tty와 유사하게 동작하며 실제 셸이나 애플리케이션이 실행되는 공간이다. 슬레이브에 연결된 프로세스는 실제 터미널(tty)에서 실행되는 것처럼 행동한다

user input → pty master → pty slave → tty → shell (bash, zsh 등)

즉, pty는 tty의 프록시 역할을 한다고 이해할 수 있다

process/job control

process

job

프로세스 실행 명령어

실행 중인 프로세스 확인 명령어

프로세스 제어 명령어

프로세스 종료 및 강제 종료 명령어

시스템 리소스 확인 명령어

shortcut

bash/zsh 기준

커서 이동 단축키

텍스트 편집 관련 단축키

제어 관련 단축키

히스토리 및 검색 관련 단축키

탭 관련 단축키

터미널 세션 관리

implementations

다른 터미널 구경하기

terminal

ghostty

cool-retro-term

iterm2

warp

wezterm

alacritty

kitty

tabby