리눅스에서 중요한 세 가지 개념은 바로

파일 시스템, 프로세스, 스트림 이다.

데이터에 이름을 붙여 보관하고 관리하는 파일 시스템이 있다. 그리고 어떤 활동을 하는 주체로서 프로세스가 있다. 마지막으로 프로세스가 파일 시스템이나 다른 프로세스와 데이터를 주고받는 수단으로서 스트림이 있다. 단순한 구조이지만 이것을 올바로 이해하는 것이 리눅스 프로그래밍에 있어서 매우 중요하다.

 

 

 

 

 

파일 시스템 File System

 먼저 파일의 종류에는 보통 일반적인 파일, 디렉토리, 심볼릭 링크, 디바이스 파일, 명명된 파이프, UNIX 도메인 소켓 등이 있다. 또 파일에는 데이터 그 자체 외에도 메타 정보가 존재한다. 메타 정보 내부에는 파일의 종류(보통 파일인지, 디렉토리인지), 권한, 크기, 마지막 수정 시간 등이 들어있다. 이러한 정보는 "ls -l" 을 통해서 살펴볼 수 있다.

파일 시스템과 마운트

 파일 시스템은 어디에 있을까? 물론, SSD나 HDD, USB 메모리처럼 물리적인 기억 장치에 존재한다. 예를 들어 SSD나 HDD의 경우, 먼저 디스크를 파티션(partition) 단위로 나눠 그 위에 파일시스템을 얹어서 마운트(mount)하면 거대한 디렉토리 트리가 생성된다. mount 명령어를 사용하면, 현재 사용하고 있는 시스템에서 어떤 파일 시스템을 사용하고 있는지 확인할 수 있다. 현재 리눅스에서 가장 일반적으로 사용되는 파일 시스템은 ext4 이다.

파티션이 하나밖에 없어서 한 줄만 나왔다. 파티션이 더 있는 경우에는 그만큼 더 출력될 것이다. /dev/sda1은 디스크의 파티션에 대응하는 디바이스 파일의 이름이다. 그것이 루트 경로(/)에 마운트되어 있고 ext4라고 하는 파일 시스템을 사용하고 있음을 알 수 있다.

 

 

 

 

 

프로세스 Process

 프로세스란, 간단히 말해 실행 중인 프로그램을 말한다. 그리고 프로그램이란 파일 형태로 존재하는 실행 가능한 파일을 말한다. 예를 들어 hello.c 를 컴파일해서 만든 hello 실행파일이 있다고 해보자. 그러면 hello 는 프로그램이다. 이것을 실행하면 그때마다 새로운 hello 프로세스가 만들어진다. 즉, 하나의 프로그램이 있으면 새로운 프로세스를 계속 만들 수 있는 것이다.

 Console에서 'ps -ef'를 실행하면 현재 시스템에서 수행 중인 프로세스 목록이 표시된다.

.

.

.

뭐가 엄청나게 많은 것을 알 수 있다.

 이 때 하나의 프로그램으로 여러 개의 프로세스를 만들 수 있다는 것은, 프로그램의 이름만으로는 프로세스를 서로 구별할 수 없음을 의미한다. 여기서 도움이 되는 것이 프로세스 ID(process ID)이다. ps 명령어의 출력 결과에서 왼쪽에서 두 번째 열에 표시되는 것이 각 프로세스의 프로세스 ID이다. 이 ID는 특정 프로세스를 지정할 수 있어 유일하다(unique)고 말할 수 있다.

시그널

 프로세스 ID가 사용되는 대표적인 예로 시그널(signal)이 있다. Ctrl+C 를 눌러 실행 중인 프로세스를 멈춘 경험이 있을 것이다. 이때 사용된 기능이 바로 시그널이다. Ctrl+C 를 누르면 커널이 해당 프로세스에 인터럽트 시그널(SIGINT)을 보내, 이를 전달받은 프로세스가 자발적으로 종료한다. 시그널은 유닉스에서 예전부터 존재했고, 리눅스 프로그래밍에서 매우 중요한 위치를 차지한다.

 

 

 

 

 

스트림 Stream

여기서의 스트림은 바이트의 흐름, 즉 바이트 스트림(byte stream)을 말한다. 스트림을 바이트들이 흘러다니는 길이라고 생각해도 좋다. 또한, 스트림은 파일이나 open file로 다뤄지기도 하고, 스트림이란 단어를 FILE 타입과 STREAMS 커널 모듈의 두 가지 의미로 사용하기도 한다. STREAMS는 스트림 기능을 위해 사용되는 커널 모듈을 말한다.

파일에 연결된 스트림

 스트림은 리눅스의 여기저기서 사용된다. 예를 들어 프로세스가 파일의 내용을 읽고 싶다면 어떻게 해야 할까? 파일에 연결된 스트림을 만들도록 커널에(시스템 콜을 사용하여) 의뢰한다. 그리고 다시 시스템 콜을 사용하여 파일의 내용을 읽는다. 스트림에서 바이트 열을 꺼내는 것을 읽는다(read)고 한다. 반대로 바이트 열을 흘려보내는 것을 쓴다(write)고 한다.

디바이스에 연결된 스트림

 스트림은 이외에도 바이트 열이 흘러갈 수 있는 곳이라면 어떤 것도 스트림에 연결될 수 있다. 예를 들어 SSD나 HDD, 키보드와 같은 하드웨어도 마찬가지다. SSD나 HDD는 바이트 덩어리라고 볼 수 있는 하드웨어이므로 당연히 스트림이 연결될 수 있다. 키보드도 입력된 키를 바이트 열로 보내는 장치이므로 스트림의 끝단에 위치할 수 있다.

파일 시스템에서 살펴본 디바이스 파일은 스트림 연결에 사용된다.

파이프 pipe

바이트 열이 흘러다니는 곳이 스트림이다. 프로세스에 스트림이 연결되어 바이트 열이 흘러간다. 스트림의 양 끝에 프로세스가 있는 구조의 스트림을 파이프(pipe)라고 한다. 명령어의 출력을 less 명령어로 보거나, grep 명령어로 검색하거나 할 때 파이프를 사용한다.

네트워크 통신 network communication

스트림이란 바이트 열의 통로다. 바이트 열이 잘 수송될 수 있다면 스트림이 다른 컴퓨터로까지 연결될 수도 있다. 이것이 네트워크 통신이다. 네트워크 통신에서는 프로세스 간 스트림 연결이 많아 스트림의 끝단에 프로세스라고 표시했지만, 파일이 연결될 수도 있다.

프로세스 간 통신 InterProcess Communication, IPC

파이프나 네트워크 통신과 같이 프로세스 간에 스트림을 통해 데이터를 주고받으며 의사소통하는 것을 일반적으로 프로세스 간 통신이라 한다. 스트림은 프로세스 간 통신에 있어 중요한 역할을 수행한다. 그러나 스트림만이 유일한 프로세스 간 통신 방법인 것은 아니다. 예를 들어 POSIX IPC 는 스트림을 사용하지 않는 프로세스 간 통신 기법이다.

+ Recent posts