Pipe!
아래의 정보들은 제가 Pipex 과제를 하며 정리한 레퍼런스 링크와 정리글입니다! 틀린 내용이 있다면 알려주세요!
프로세스간 통신, 파이프 공부!
Concept :
리눅스의 모든 것은 파일로 이루어져 있다!
리눅스 기반 운영체제는 ‘파일 디스크립터’ 라는 것으로 리눅스의 모든 파일을 관리한다. 하물며 우리가 아무생각 없이 쓰는 명령어들도 전부! 파일형태이다.
리눅스 기반으로 만들어진 운영체제의 모든 프로그램들은 파일로 존재한다.
따라서, 실제로 리눅스 기반 운영체제의 모든 프로그램들은 파일 형태로 존재하게 되고, 이러한 프로그램을 실행시키기 위해서는 가장 먼저 파일을 열어야 한다.
파일을 열면, 커널이 해당 프로세스가 동작을 하는데 필요한 장치나 파일들에 관한 정보를 번호를 붙여서 관리를 하게 되고, 이러한 번호를 fd(file descriptor)‘라고 한다. 이러한 fd값은 파일 디스크립터 테이블’에 저장된다
파일테이블은 모든 열려진 파일을 커널에서 관리하기 위한 테이블!
파일 디스크립터 테이블
이러한 파일 디스크립터 테이블에는 자주 쓰이는 3개의 장치가 미리 저장(예약)되어 있다. 아래의 표는 fd table에 미리 예약되어 지정된 fd 번호 0, 1, 2를 나타낸 것이다.
따라서, 리눅스에서는 프로그램을 실행하게 되면, 파일 디스크립터 테이블이 생기게 되고, 다음과 같은 (미리 예약된) 3개의 스트림이 자동으로 열린다.
스트림: 유닉스 계열 운영체제에서 프로그램(프로세스)가 주변 기기 사이에 미리 연결된 입출력 통로.
- 파일 디스크립터(fd)
파일 디스크립터(fd)는 프로세스가 파일에 접근하기 위해 제공되는 고유 식별자이다.
특정 파일을 접근하고자 하면, 커널에서는 해당 프로세스에게 사용하지 않은 양수값의 fd 번호를 부여하고, 사용하고 있는 파일의 디스크립터를 테이블의 형태로 관리하게 되는데 이게 바로 파일 테이블이다.
⇒ 프로세스가 특정 파일에 접근하기 위해 해당 파일의 디스크립터를 이용한다. fd는 시스템으로부터 할당받은 파일이나 소켓을 대표하는 정수값이다.
그런 다음, 프로세스가 열려있는 파일에 시스템콜을 이용해서 접근하게 되면, 파일 디스크립터 값을 이용해서 파일을 지칭할 수 있다.
file descriptors 테이블의 각 항목은 FD 플래그와 파일 테이블로의 포인터를 가지고 있다. 이 포인터를 이용하여 FD 를 통해 시스템의 파일을 참조 할 수 있다. 프로세스는 이런 FD 테이블과 파일 테이블의 정보를 직접 고칠 수 없으며, 반드시 커널을 통해서 수정을 해야 한다!
tmi) 이러한 FD의 최대값은 OPEN_MAX라는 값이다. 즉, 하나의 프로세스 당 최대 OPEN_MAX개의 파일을 열 수 있다. OPEN_MAX 값은 플랫폼에 따라 다르다.
프로그램과 프로세스, 그리고 스레드
- 프로그램
프로그램 : 프로그램은 실행 가능한 명령어의 집합이다. 이는 저장장치(하드디스크 같이)에 저장되어 있지만 메모리에는 올라가지 않은, 실행되고 있지 않은 정적인 상태를 의미한다. 이 때, 중요한건 디스크에 저장된 실행 가능한 명령어의 집합인지 아닌지의 여부이다.
프로그램 : 실행가능한 명령어의 집합. 정적인 상태.
- 프로세스
프로세스 : 이러한 프로그램을 실행하는 순간 파일은 컴퓨터 메모리 위에 올라가게 된다. 그리고 실행이 된다! 이렇게 작동중인 프로그램을 프로세스라고 한다.
프로세스 : 메모리에 load되어서 실행되고 있는 프로그램. 동적인 프로그램.
여기서 우리가 구분해야 될 것은, 프로세스는 프로그램과 다르게 동적이라는 것이다.
이러한 프로세스는 커널에 의해 직접! 관리된다. 따라서 커널의 메모리 안에는 프로세스에 대한 여러 데이터들이 존재한다. 이러한 커널 메모리 안에서는 PCB(Process Control Block)라고 하는 자료구조형식의 정보를 관리한다. 이러한 정보들은 다시 (1) 커널 메모리와 (2) 유저가 사용하는 메모리 공간상의 프로세스 정보로 나뉘게 된다.
이때, (2)유저가 사용하는 메모리 공간상의 프로세스는 4가지 영역으로 구성이 된다. 감이 오지 않는가! 그렇다. 처음 C언어 배우면서 메모리 공간에 대해 배울 때 매번 등장하던 (1)코드영역 (2)데이터 영역 (3)힙 영역 (4)스택 영역이다.
tmi: 프로세스를 프로그램의 인스턴스라고 표현하기도 하는데 객체 지향에서는 하나의 프로그램에서 여러 프로세스가 동시에 존재할 수 있어서 이런 표현을 쓴다고 한다.
- 스레드
스레드는 thread. ‘실’이다.
스레드는 프로세스에서 실행되는 흐름, 즉 프로세스의 실행단위를 의미한다. 더 자세하게 이야기해보자면, 스레드는 운영체제의 프로세스 스케쥴러에 의해서 스케쥴링 될 수 있는 최소한의 실행단위이다.
일반적으로 하나의 프로세스는 하나의 스레드로 시작되고, 이를 메인 스레드라고 한다. 스레드를 추가로 생성하지 않는 한, 모든 프로그램은 메인 스레드에서 실행된다.
위의 프로세스 개념과 스레드를 연결시켜 보자면, 프로세스는 스레드의 컨테이너라고 할 수 있다. 프로세스는 스레드의 정보를 담고 있는 것에 불과하다!
- 프로세스와 스레드
하나의 프로세스는 스레드를 하나 이상 포함한다. 싱글 스레드는 프로세스의 스레드가 1개이고, 이 프로세스는 하나의 실행단위를 가짐을 의미한다. (= 한번에! 하나만! 해야한다는 의미.) 따라서, 싱글 스레드 프로세스는 곧 프로세스가 곧 스레드가 된다.
싱글 스레드 : 프로세스의 스레드가 1개. 하나의 실행단위.
(프로세스 == 스레드)
프로세스는 운영체제로부터 독립된 시간과 공간의 자원을 할당받아서 실행이 되는 반면에, 스레드는 한 프로세스 내에서 자원을 공유하면서 병렬적으로 실행이 된다.
미니쉘때 배울 ‘리다이렉션’
리다이렉션은 표준 스트림의 흐름을 바꿔준다. 일반적으로 이 모든 스트림은 (표준 입력, 표준 출력, 표준 에러) 일반적인 문자열로 콘솔에 출력하게 되어있는데, 밑에있는 리다이렉션 기호들을 입력하면, 이렇게 디폴트로 지정되어있는 스트림의 흐름을 바꿔줄 수 있게 된다!
⇒ 실행된 프로세스의 스트림을 콘솔이 아닌 파일로 사용하고 싶으면 리다이렉션을 하면 된다. 리다이렉션을 이용하면 각 스트림의 방향을 지정할 수 있으니까!
이러한 리다이렉션과 파이프는 섞어서 쓸 수 있다!
프로세스간의 통신(IPC)
한줄요약 : 프로세스 간의 통신은 어렵다… 근데 일단 우리의 pipex 과제에서는 이걸 파이프를 통해서 할거야!
본론으로 들어가자면, 프로세스는 스레드와는 다르게 통신할 수 있는 공간이 없어서 통신을 위한 별도의 공간을 만들어 주어야 통신을 할 수 있다. 그래서, 프로세스간의 통신을 위해 커널 영역에서 IPC라는 것을 제공하게 된다. 프로세스는 커널이 제공하는 이 IPC설비를 이용해서 프로세스간 통신을 할 수 있게 된다.
프로세스간의 통신을 IPC(Inter-Process Communication)이라고 한다.
해당 블로그 내용 정리
Pipex 과제 파이팅!!!