IPC(Inter-Process Communication) 의 개념과 예시에 대해 다뤄보겠습니다.
IPC 개념과 기법
IPC는 여러 프로세스들이 서로 데이터를 공유하거나 서로 협력할 수 있게 해주는 다양한 메커니즘을 제공합니다. 이 기법들을 통해 프로세스는 데이터나 정보를 주고받거나 동기화할 수 있게 됩니다.
IPC 기법의 주요 종류
- 시그널 (Signal)
- 프로세스가 특정 이벤트나 조건을 알리기 위해 사용하는 메커니즘입니다.
- 예시: 프로세스 A가 프로세스 B에게 종료하라는 신호를 보낼 때 사용.
- 특징: 비동기적, 수신한 프로세스는 해당 시그널에 맞는 처리를 합니다.
- 인터럽트 (Interrupt)
- 프로세스의 실행 중에 외부 혹은 내부 이벤트가 발생하여 프로세스의 흐름을 일시적으로 중단시키는 방식입니다.
- 예시: 하드웨어 장치에서 입력이 들어오면 이를 처리하기 위해 프로세스를 일시 중단시킬 수 있습니다.
- 공유파일 (Shared File)
- 여러 프로세스가 동일한 파일을 공유하여 데이터를 주고받는 방법입니다.
- 시스템 호출: open(), read(), write(), close() 등을 사용하여 파일을 열고, 데이터를 읽고, 쓰고, 닫습니다.
- 심화: 순차 파일을 사용하는 경우, 파일 디스크립터(fd)와 관련된 관리가 필요합니다.
- 파이프 (Pipe)
- 데이터를 한 프로세스에서 다른 프로세스로 전달하는 방식입니다.
- 특징:
- 하나의 파이프를 사용할 경우 읽기/쓰기 오류가 발생할 수 있으므로 읽기용과 쓰기용 파이프를 구분해야 합니다.
- 주로 부모-자식 프로세스 간의 통신에 사용됩니다.
- 메시지큐 (Message Queue)
- 여러 프로세스 간에 데이터를 주고받을 수 있는 큐를 이용한 방식입니다.
- 특징: 양방향 통신, 비동기식 방식으로 데이터를 삽입(Enqueue)하고 추출(Dequeue)합니다.
- 부모-자식 관계가 없어도 데이터 공유가 가능합니다.
- 공유메모리 (Shared Memory)
- 운영체제에서 별도의 메모리 영역을 할당하여 여러 프로세스가 그 영역을 공유하는 방식입니다.
- 각 프로세스는 포인터를 통해 이 영역에 접근합니다.
- 특징: 메모리 공간을 직접 공유하므로 빠른 데이터 전송이 가능합니다.
- 소켓 (Socket)
- 네트워크를 통한 다른 컴퓨터에 있는 프로세스와 통신하는 방식입니다.
- 특징:
- PF_LOCAL: 같은 호스트 내 프로세스 간 통신.
- PF_INET: IPv4를 통한 인터넷 통신.
- PF_INET6: IPv6를 통한 인터넷 통신.
임계구역(Critical Section) 문제
임계구역 문제는 공유 자원에 접근하는 순서에 따라 실행 결과가 달라질 수 있는 영역을 의미합니다. 여러 프로세스가 동시에 공유 자원에 접근하려고 할 때 문제가 발생할 수 있습니다. 이를 해결하기 위한 조건이 있습니다.
문제 해결 조건
- *상호배제 (Mutual Exclusion)
- 한 프로세스가 임계구역에 들어가면 다른 프로세스는 그 임계구역에 들어갈 수 없어야 합니다.
- 한정대기 (Bounded Waiting)
- 어떤 프로세스도 무한 대기 상태에 빠지지 않도록 해야 합니다.
- 진행의 융통성 (Progress Flexibility)
- 한 프로세스가 다른 프로세스의 진행을 방해해서는 안 됩니다.
알고리즘 및 동기화 방법
1. 피터슨 알고리즘 (Peterson’s Algorithm)
개요
- 피터슨 알고리즘은 두 개의 프로세스만을 위한 임계구역 문제 해결 알고리즘입니다.
- 상호배제, 한정대기, 진행의 융통성을 만족하는 알고리즘으로, 프로세스들이 공유 자원에 접근하는 순서를 잘 조정합니다.
작동 방식
- 각 프로세스는 두 개의 변수를 사용하여 서로 협력하며, 임계구역에 진입하려는 의도를 나타냅니다:
- flag[i]: 프로세스 i가 임계구역에 들어가려고 한다는 신호.
- turn: 임계구역에 들어갈 차례가 누구인지 나타냅니다.
- 두 프로세스 P0와 P1가 있다고 할 때, 다음과 같은 방식으로 동작합니다:
- P0가 임계구역에 들어가고 싶다면:
- flag[0] = true로 설정.
- turn = 1로 설정 (P1에게 차례가 돌아가도록).
- P0는 P1이 임계구역을 사용하지 않으면 계속 진행하고, P1이 임계구역에 들어가려 할 때는 기다립니다.
- P1이 임계구역에 들어가고 싶다면:
- flag[1] = true로 설정.
- turn = 0으로 설정 (P0에게 차례가 돌아가도록).
- P1은 P0가 임계구역을 사용하지 않으면 계속 진행하고, P0가 임계구역을 사용하고 있을 때는 기다립니다.
- P0가 임계구역에 들어가고 싶다면:
핵심 원리
- 상호배제: 한 프로세스가 임계구역에 들어가면, 다른 프로세스는 들어갈 수 없습니다.
- 한정대기: 한 프로세스가 무한정 대기하지 않도록 보장합니다.
- 진행의 융통성: 한 프로세스가 다른 프로세스의 진행을 방해하지 않도록 합니다.
2. 데커 알고리즘 (Dekker’s Algorithm)
개요
- 데커 알고리즘은 두 개의 프로세스를 위한 상호배제를 보장하는 알고리즘입니다. 피터슨 알고리즘과 유사하지만, 데커 알고리즘은 더 복잡한 구조를 가집니다.
- 이 알고리즘은 **상호배제(mutual exclusion)**를 보장하며, 한정대기와 진행의 융통성은 보장하지 않습니다.
작동 방식
- 데커 알고리즘에서는 두 개의 프로세스 P0와 P1가 사용할 수 있는 두 개의 공유 변수가 있습니다.
- flag[i]: 프로세스 i가 임계구역에 진입하려고 할 때 true로 설정.
- turn: 현재 임계구역을 들어갈 차례를 결정하는 변수.
- 각 프로세스는 다음과 같이 동작합니다:
- flag[i] = true로 설정하고 임계구역에 들어가려는 의사를 표시.
- turn 변수를 사용하여 상대 프로세스가 기다려야 할 차례를 설정.
- 상대 프로세스가 기다리는 동안 반복문을 통해 상대 프로세스가 임계구역을 사용하지 않으면 계속 진행합니다.
핵심 원리
- 상호배제: 한 프로세스가 임계구역에 들어가면, 다른 프로세스는 들어갈 수 없습니다.
- 한정대기: 각 프로세스는 무한 대기하지 않도록 보장해야 하지만, 데커 알고리즘에서는 이것을 보장하지 않기 때문에 이 부분은 취약점이 될 수 있습니다.
3. 세마포어 (Semaphore)
개요
- 세마포어는 동기화 및 상호배제를 관리하기 위해 사용되는 변수입니다. 세마포어를 사용하여 프로세스들이 자원을 안전하게 공유할 수 있도록 합니다.
작동 방식
- 세마포어는 정수 값을 가지며, **P()**와 V() 연산으로 자원에 대한 접근을 제어합니다.
- P() (Proberen): 자원을 요청하는 연산입니다.
- 자원 수가 0이면 해당 프로세스는 대기 상태로 전환됩니다.
- 자원 수가 1 이상이면, 자원을 하나 빼고 자원에 접근할 수 있게 됩니다.
- V() (Verhogen): 자원을 해제하는 연산입니다.
- 자원 수가 증가하며, 대기 중인 프로세스가 있으면 그 중 하나를 깨워서 자원에 접근하게 만듭니다.
- P() (Proberen): 자원을 요청하는 연산입니다.
핵심 원리
- 상호배제: 세마포어를 통해 한 번에 하나의 프로세스만 자원에 접근할 수 있습니다.
- 한정대기: 세마포어는 무한 대기를 방지할 수 있지만, 이 부분은 구현에 따라 달라질 수 있습니다.
- 진행의 융통성: 대기 중인 프로세스가 자원을 얻을 수 있도록 보장합니다.
예시
- 바이너리 세마포어 (Binary Semaphore): 자원에 대한 접근이 두 가지 상태만 있을 때 사용됩니다. (0 또는 1)
- 카운팅 세마포어 (Counting Semaphore): 여러 자원에 대한 동기화를 관리할 때 사용됩니다.
4. 모니터 (Monitor)
개요
- 모니터는 공유 자원에 대한 접근을 자동적으로 동기화하고, 자원에 대한 상호배제를 보장하는 고수준의 동기화 기법입니다.
- 모니터는 공유 자원을 숨기고, 자원에 접근하는 인터페이스만 제공합니다. 이로써 외부에서 자원에 접근하려면 반드시 모니터의 메서드를 통해 접근해야 합니다.
작동 방식
- 모니터 내에서는 동기화된 메서드를 통해 자원에 접근합니다. 이를 통해 프로세스가 임계구역에 접근하려 할 때, 자동으로 상호배제가 이루어집니다.
- 모니터는 프로그래머가 수동으로 동기화하는 것을 피할 수 있도록 도와줍니다. 예를 들어, 모니터 내부에서 조건변수를 사용하여 프로세스가 대기하거나 신호를 받을 수 있도록 합니다.
- wait(): 조건이 만족되지 않으면 해당 프로세스를 대기 상태로 전환합니다.
- signal(): 조건이 만족되면 대기 중인 프로세스를 깨워서 진행할 수 있게 만듭니다.
핵심 원리
- 상호배제: 모니터 내의 공유 자원에 접근할 때는 하나의 프로세스만 접근할 수 있습니다.
- 조건 변수를 이용해 동기화를 지원하며, 프로세스는 필요한 조건이 충족될 때까지 대기하거나 신호를 받을 수 있습니다.
요약
기법 | 특징 | 사용조건 | 장점 |
피터슨 알고리즘 | 두 프로세스만 사용, 상호배제, 한정대기, 진행의 융통성 보장 |
2개의 프로세스 | 간단하고, 프로세스 간 상호배제 보장 |
데커 알고리즘 | 두 프로세스만 사용, 상호배제 보장 | 2개의 프로세스 | 상호배제 보장, 한정대기 보장은 안 됨 |
세마포어 | P()와 V()를 이용한 동기화 | 여러 프로세스 | 동기화 및 자원 관리에 유용 |
모니터 | 자원을 숨기고 인터페이스만 제공, 조건변수 사용 | 여러 프로세스 | 고수준의 동기화, 코드 간소화 |
각 기법들은 임계구역 문제를 해결하기 위해 사용되며, 각기 다른 방식으로 동기화 및 상호배제를 구현합니다. 선택은 시스템의 요구사항과 프로세스의 수, 구현의 복잡성에 따라 달라질 수 있습니다.
시각적으로 정리해보기
이를 더 직관적으로 이해할 수 있도록 시각적으로 나타내기 위해, 각 IPC 기법을 차례로 묶은 도식이나 그림을 그려볼 수 있습니다. 예를 들어:
- 시그널 및 인터럽트는 이벤트 기반의 비동기 통신이므로 서로 비슷한 그룹으로 묶을 수 있습니다.
- 공유파일, 파이프, 메시지큐, 공유메모리는 데이터 공유 방식으로, 각 방식의 특징과 차이를 도식으로 설명할 수 있습니다.
- 세마포어, 모니터는 동기화 기법으로 묶어 서로 간의 동기화가 어떻게 이루어지는지 보여줄 수 있습니다.
'computing' 카테고리의 다른 글
20250403_java5 (0) | 2025.04.03 |
---|---|
java중간고사 정리 (0) | 2025.04.03 |
20250331_DB4 (0) | 2025.03.31 |
20250327_java4 (자바 자료형, 연산자, 형변환 핵심요약) (1) | 2025.03.27 |
20250325_OS4 (1) | 2025.03.25 |