용's
[OS#1] 프로세스 통신 본문
이번 N사 면접가서 굉장히 다양한 전공지식 질문을 받았는데...
대답 못한 질문이 대다수였지만 자꾸 생각나는 질문 하나를 이번 기회에 정리해보고자 한다.
"프로세스간에 통신은 못하나요?"
※ 본 글은 한빛미디어의 "프로세스 간 통신 방법과 프로그램 작성" 문서 요약문이 되겠다.
운영체제 내에서 수행되는 프로세스들은 여러 가지 필요에 의해 서로 데이터를 주고 받을 필요가 있다.
데이터를 주고받는 프로세스들을 분류해보면 간단하고 짧은 메시지를 주고 받거나 복잡하고 긴 메시지를 주고받을 수 있고, 동일한 시스템의 프로세스끼리 통신을 하거나 서로 다른 시스템의 프로세스끼리 통신할 수 있다. 그리고 통신의 주체가 되는 양쪽 끝의 프로세스가 모두 사용자 프로세스일 수도 있고 한쪽이 시스템의 커널일 수도 있다.
간단하게 먼저 요약하면,
- 프로세스간의 동기화를 위한 것이라면 시그널 방식을 선택
- 동일한 시스템 내에서 메시지를 주고받는 것이라면 파이프를 선택
- 서로 다른 시스템에 프로세스끼리 메시지를 주고받는 것이라면 소켓을 선택
(1) 시그널
- 기대하지 않은 이벤트(인터럽트)가 발생하면 운영체제 시스템은 과녈ㄴ된 프로세스에게 이벤트와 관련된 시그널을 보내게 된다.
- 시그널은 번호가 붙여져 있고, 각 번호는 유일하다.
예) 수행중인 프로세스를 강제 종료시키는 'Ctrl + C'는 커널이 해당 프로세스에 SIGTERM이라는 이름의 시그널을 보내게 되고, 이 시그널은 15번에 해당한다.
→ 커널만 시그널을 보낼 수 있는 것이 아니라 어떤 프로세스든지 권한만 있다면 선태된 프로세스에게 특정 시그널을 보낼 수 있다.
- 시그널을 수신한 프로세스는 보통 다음 중에 하나로 반응한다
① 시그널에 대해 기본적인 방법으로 대응한다. 대부분의 시그널에 대해서 프로세스는 종료하게 된다.
② 시그널을 무시한다. 단, SIGKILL과 SIGSTOP은 무시될 수 없다.
③ 프로그래머가 지정한 함수를 호출한다.
- 프로그래머는 프로세스가 특정 시그널을 포착했을 때 수행해야 할 별도의 함수를 지정할 수 있다.
→ 이런 함수를 '시그널 핸들러(Signal Handler)'라고 부른다.
→ 실행중인 프로세스가 시그널을 포착하게 되면 현재 진행중인 작업의 실행을 잠시 중단하고 시그널 핸들러를 실행하게 된다.
→ 시그널 핸들러의 실행이 끝나면 아까 중단했던 작업을 이어서 실행하게 된다.
- 시그널 목록
(2) 파이프와 네임드 파이프
- 백스패이스 키 바로 아래 있는 '|'를 일반적으로 파이프 기호라 부르고 '또는' 이라는 뜻으로 사용된다. 보통 유닉스 명령어에서 두 개의 명령이 파이프로 연결되면 앞에 놓인 명령이 표준 출력하는 내용을 뒤에 놓인 명령이 표준 이벽으로 받아들인다. 이때 중간에서 다리 역할을 하는 것을 '파이프'라고 부른다.
→ 파이프는 사용자가 파이프로 연결한 명령 라인을 실행하면 일시적으로 만들어졌다가 작업이 끝나면 삭제되는 임시 파일이다
→ 파일이기 때문에 파이프로 연결되어 작업에 관련된 프로세스라면 읽기와 쓰기가 모두 가능
But, 대부분의 구현에서 파이프의 앞에 놓은 프로세스는 파이프로 쓰기만 수행, 파이프의 뒤에 놓인 프로세스는 파이프로부터 읽기만 수행
예)
→ 첫 번째 명령어 라인은 'ls'로 루트 디렉토리에 대한 파일 항복을 표준 출력하는데, 이러한 내용이 파이프를 통해 다음 프로세스인 'wc'의 표준 입력으로 전달된다.
- 위처럼 '|'를 사용해서 임시로 만들어지는 파이프는 이름을 가지지 않는다. 말 그대로 임시로 만들어졌다가 사용이 끝나면 바로 사라지기 때문
→ 반전 이름을 가지고 있는 파이프가 존재하며 이를 '네임드 파이프(Named Pipe)' 또는 'FIFO'라고 부른다.
- 한쪽의 프로세스가 파이프를 개방하여 쓰기를 수행하고 다른 쪽의 프로세스는 네임드 파이프를 개방하여 읽기를 수행하는 식.
예)
→ 이 예는 'mkfifo' 명령을 사용하여 네임트 파이프를 생성하고 두 개의 'cat' 프로세스가 이를 사용하여 메시지를 전달하는 예제.
→ 참고로 'cat < fifo' 는 fifo로부터 메시지를 읽으려는 프로세스, 'cat > fifo' 는 메시지를 쓰려는 프로세스.
→ 메시지를 읽으려는 프로세스가 있어야만 비로소 fifo에 대한 쓰기 작업이 수행되고 fifo로 메시지를 쓰자마자 'cat < fifo'가 이를 읽어서 가져감
- 네임드 파이프를 적절히 사용하면 두명의 사용자가 간단하게 채팅도 할 수 있다.
→ 파이프는 단방향으로 메시지를 전송하는 방법이므로 양쪽이 서로 메시지를 주고받기 위해 두 개의 네임드 파이프(전송, 수신)를 생성해야함
(3) 소켓
- 동일한 시스템 내에 있는 프로세스 간뿐만 아니라 서로 다른 시스템에 있는 프로세스 간에도 통신이 가능하게 함.
- 커널의 도움이나 파일 시스템을 사용하여 메시지를 주고받는 것이 아닌 네트워크 장치를 통해 메시지를 주고받음.
- 소켓 방식은 연결형 모델과 비연결형 모델이 존재하는데, 이에 사용되는 대표적인 프로토콜이 TCP와 UDP임.
→ TCP와 UDP의 차이점은 http://gomoveyongs.tistory.com/44 에 정리한 적 있다.
- 소켓은 파일 기술자(File Descriptor)와 같다고 볼 수 있음.
But, 파일 기술자의 너머에는 파일이 존재하지만 소켓은 자신과마찬가지로 소켓을 가진 프로세스가 있다는 것.
파일 기술자로 통해서 파일로 데이터를 쓰거나 읽듯이 소켓을 통해서 상대 프로세스로 메시지를 쓰거나 읽을 수 있음
- 소켓에는 상대 프로세스에 대한 주소와 포트번호 등의 정보가 담겨져 있다.
→ 소켓이 생성되고 원하는 정보를 소켓에 연결했으면 그 다음붜는 파일로 데이터를 읽거나 쓰듯이 소켓을 통해서 메시지를 읽거나 쓰면 됨.
정리를 다 해놓고 보니... 면접 때 제대로 말하지 못한 것이 상당히 아쉽다... 결과는 아직 안나왔지만...
'Computer Science > 예상면접' 카테고리의 다른 글
[DB] 트랜잭션(Transaction) (0) | 2015.11.20 |
---|---|
[DB] DB가 중복을 허락하는 경우 (2) | 2015.11.18 |
[JAVA] BigDecimal (0) | 2015.10.12 |
[Network #4] TCP 제어 알고리즘 (0) | 2015.10.12 |
[DB] 예상 문제 (0) | 2015.09.28 |