[CS 퀴즈] 오답노트 (5)
CS 퀴즈 (5)
IPC / 프로세스간 커뮤니 케이션
프로세스간 커뮤니케이션을 해야하는 이유
프로세스들은 각각 개별적으로 분리되어 생성되며 프로세스들끼리는 서로에게 접근할 수 없다. 즉, 프로세스는 완전히 독립된 객체이며, 서로에게 접근하지 못하니 영향도 끼치지 않는다.
하지만 여러개의 프로세스를 실행하기 위해선 각 프로세스들이 서로 상태값이나 데이터를 주고받을 일이 생긴다.
예를 들어보자.
프로세스1과 프로세스2가 실행 중이다. 프로세스1과 프로세스2는 덧셈 작업을 수행하며, 프로세스1과 프로세스2의 목표는 하나의 파일에 덧셈 작업을 번갈아 수행해야 한다.
이때, 프로세스1은 1부터 1000까지 덧셈한 다음에 파일에 기록하고, 프로세스2는 1000부터 2000까지 덧셈한 다음에 파일에 기록해야 한다. 두 프로세스들은 모두 파일에 접근할 수 있지만, 서로 어디까지 덧셈을 했는지 알 수있는 방법은 없다.
왜냐면 프로세스끼리는 접근을 할 수 없기 때문이다. 프로세스2는 프로세스1의 덧셈 작업이 끝나야 작업을 실행할 수 있지만, 어디까지 덧셈했는지 정보를 알 수 없으니 프로세스를 처리할 수 없다.
하지만 프로세스들끼리 서로 데이터나 상태를 주고받을 수 있는 방법이 존재한다. 바로 운영체제의 커널 공간을 사용하는 것이다. 이 커널의 공간을 사용해서 프로세스들끼리 커뮤니케이션하는 방법을 IPC라고 한다.
위에선 간단하게 예를 들었지만, 실제 현업에서는 여러 프로세스나 노드들을 분산시켜 동시에 작업을 처리해야하는 복잡한 업무가 있을 수 있다. 각 프로세스들이 정보를 공유하거나, 작업 분산, 동기화, 자원 공유, 협력을 해야하는 경우가 충분히 발생할 수 있는데, 이때 IPC를 써야한다는 것을 기억해두면 도움이 될 것이다.
IPC(Interpocess Communication)
IPC는 운영체제에서 다른 프로세스 간에 데이터나 상태 정보를 주고받는 방법을 제공하는 기술이다. IPC를 사용하면 프로세스 간의 정보 교환, 동기화, 상호작용 등을 할 수 있다.
프로세스는 생성되면 메모리를 할당 받는다. 그 후, 할당받은 메모리를 데이터별로 공간을 분리(data, stack, heap, code 등등)하여 관리한다.
그 중 한 공간은 커널(운영체제)이 사용하는 전용 공간으로 둔다. 각 프로세스들은 메모리 자원이 필요할 때, 시스템콜을 호출하여 커널 메모리 공간에 있는 자원을 가져올 수 있다.
프로세스들은 각각 개별적으로 분리되어 보이지만, 실제로 커널의 공간을 공유하고 있다. 컴퓨터의 이런 구조를 이용해서 여러가지 프로세스 통신 기법(IPC)이 나오게 되었다.
맨날 헷갈리는 시스템 콜이란?
위키피디아의 정의에 따른 시스템 콜의 정의는 다음과 같다.
시스템 호출(system call)은 운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다. 보통 C나 C++과 같은 고급 언어로 작성된 프로그램들은 직접 시스템 호출을 사용할 수 없기 때문에 고급 API를 통해 시스템 호출에 접근하게 하는 방법이다.
시스템 콜은 왜 필요할까?
우리가 일반적으로 사용하는 프로그램은 ‘응용프로그램’이다. 유저레벨의 프로그램은 유저레벨의 함수들 만으로는 많은 기능을 구현하기 힘들기 때문에, 커널(kernel)의 도움을 반드시 받아야 한다.
이러한 작업은 응용프로그램으로 대표되는 유저 프로세스(User Process)에서 유저모드에서는 수행할 수 없다.
반드시 kernel에 관련된 것은 커널모드로 전환한 후에야, 해당 작업을 수행할 권한이 생긴다. 커널 모드를 통한 이러한 작업은 반드시 시스템 콜을 통해 수행하도록 설계되어 있다.
출처: Operating System Concepts 10th - SILBERSCHARTZ
그렇다면 권한은 왜 필요한 것일까?
그 이유는 해커가 피해를 입히기 위해 악의적으로 시스템 콜을 사용하는 경우나 초보 사용자가 하드웨어 명령어를 잘 몰라서 아무렇게 함수를 호출했을 경우에 시스템 전체를 망가뜨릴 수도 있기 때문이다.
따라서 이러한 명령어들은 특별하게 커널 모드에서만 실행할 수 있도록 설계되었고, 만약 유저 모드에서 시스템 콜을 호출할 경우에는 운영체제에서 불법적인 접근이라 여기고 trap을 발생시킨다.
여러가지 IPC 기법
프로세스들 간의 원활한 통신을 돕기위해 여러가지 통신 방법이 제시되었다.
① file 사용 기법
② 메세지 큐(Message Queue)
③ 공유 메모리(Shared Memory)
④ 파이프(Pipe)
⑤ 세마포어(Semaphore)
⑥ 소켓(Socket)
⑦ 기타 등등
여기서 중요한 기법은 ②와 ③이다. ②번부터는 모두 커널의 공간을 사용하는 통신 기법이다.
메세지 큐(Message Queue)
프로세스들은 메세지를 주고받을 수 있는 큐(Queue)를 사용해 통신한다.
메세지 큐를 통해 프로세스들은 비동기적으로 메세지를 교환하고 작업 상황을 주고받을 수 있다.
공유 메모리(Shared Memory)
여러 프로세스가 동일한 물리 메모리 영역을 공유하여 데이터를 주고받을 수 있다.
커널 공간의 물리 메모리에서 데이터를 직접 공유하도록 지원하며, 한 프로세스에서 변경한 메모리 공간의 내용을 다른 프로세스에서도 접근할 수 있다.
공유 메모리를 사용하면 빠른 데이터 전송이 가능하지만, 동기화와 관련된 이슈를 유의하면서 사용해야한다.
IPC는 프로세스 간의 데이터 공유, 작업 조율, 동기화 등을 가능하게 도우며, 다양한 형태의 통신 방법을 구현할 수 있다. IPC는 멀티 프로세싱, 멀티 스레드, 분산 시스템 등 당야한 컴퓨팅 환경에서 중요한 역할을 한다.
댓글남기기