💡프로세스 1️⃣ 각자 독립된 메모리 공간을 가지고 있어 서로 간의 데이터를 공유할 수 없음. 2️⃣ 성능을 높이기 위해 여러 프로세스를 만들어서 동시 실행시, 프로세스 간 상태 확인 및 데이터 송수신 필요함.
💡프로세스 구조 프로세스 가상 메모리 구조 및 커널 가상 메모리 구조
✅ 모든 프로세스 동일한 내용을 가지고 있는 부분 존재함. → 같은 내용을 복사해서 각각 가지고 있는 것은 비효율적 → 커널 내부에 모든 프로세스가 공유하는 부분 존재함.
프로세스 A, B 메모리 공유
📌 통신 방법
1️⃣ PIPE(익명 PIPE)
💡한쪽 방향으로만 통신이 가능한 파이프의 특징 때문에 Half Duplex(반이중) 통신 == 단반향 통신
• 하나의 프로세스는 데이터를 쓰기만, 다른 하나는 데이터를 읽기만 할 수 있음.
• 통신을 할 프로세스가 명확하게 알 수 있는 경우 사용
• 구현 간단함.
2️⃣ Named PIPE(FIFO)
• 부모 프로세스와 무관하게 전혀 다른 모든 프로세스들 사이에서 통신 가능
• 통신을 위해 이름이 있는 파일을 사용함.
• 단방향 통신만 가능하지만 이름이 있는 파일 두 개를 사용해 해결 가능
3️⃣ 메시지 큐(Message Queue)
• Named PIPE와 입출력 방식 동일
Named PIPE
Message Queue
데이터의 흐름
메모리 공간
• 메시지 큐에 쓸 데이터에 번호를 붙임으로써 여러 개의 프로세스가 동시에 데이터를 쉽게 다룰 수 있음.
→ 즉, 다수의 프로세스들이 큐에 메시지를 보낼 수 잇고 다수의 프로세스들이 큐로부터 메시지를 꺼낼 수 있음.
• 작동 방식
: 프로세스 P1이 P2에 데이터를 보내기 위해 시스템 콜 사용
→ 시스템 콜에 의해 P1의 주소 영역에서 메세지가 카피되어 커널에 보내짐.
→ P2가 데이터를 받기 위해 시스템 콜을 사용함.
→ 메세지 큐의 메세지가 터널에서 P2의 주소 영역으로 보내짐.
4️⃣ 공유 메모리
• 커널에서 제공하는 통신 설비가 아닌, 데이터 자체를 공유하도록 지원하는 설비
• 별다른 통신 없이 직접적으로 데이터에 접근하기 때문에 IPC 중 가장 속도가 빠름.
• 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 해당 프로세스에 메모리 공간을 할당해주며 이후 어떤 프로세스든지 해당 메모리 영역에 접근 가능함.
• 작동 방식
: Writer 프로세스가 공유 메모리에 데이터 작성
→ 데이터 쓰기가 완료되면 해당 데이터가 타프로세스에 대해 접근 가능한 상태가 됨.
→ Reader 프로세스가 공유 메모리에서 데이터를 가져다 씀.
5️⃣ 세마포어(Semaphore)
• 프로세스 간 데이터를 동기화하고 보호 목적
💡 동기화 공유 데이터가 동시에 접근하여 값을 변경시키면 문제가 발생할 수 있는데 이것을 막는 방법
💡 Critical Section = 임계 영역 둘 이상의 스레드 혹은 프로세스가 동시에 접근해 연산을 실행하면 안되는 공유 변수가 존재하는데 이런 변수가 존재하는 코드 블록을 Critical Section이라고 함.
• 그림 예시
‣ T1, Y에서 값 5 읽음.
→ Context Switching에 의해 T2가 running 상태
→ Y에서 값을 읽었는데, 변경이 없으므로 5를 읽음.
→ *2 한 값 10을 저장
→ Context Switching
→ T1이 가지고 있던 값 1번에서 읽은 5였으므로 5 + 1 = 6 Y에 저장
⛔프로세서 각 작업의 묶음 단위가 무엇인지 모르기 때문에 작업을 묶음 단위로 실행시키지 못하여 위와 같은 문제 발생
💡Mutual Exclusion 공유되는 자원의 접근 권한을 통제하여 위와 같은 현상을 방지함. ➡️ Race condition을 발생시킬 수 있는 공유 자원(Critical Section)에 대해 하나의 프로세스가 접근하여 lock() 메서드를 이용해 다른 프로세스의 접근을 막음.
6️⃣ Signal
• Software Interrupt 또는 이벤트 알림 또는 프로세스의 처리 과정에 있어 발생할 수 있는 예외
• 시그널이 발생하면 OS는 프로세스의 실행을 멈추고, Signal handler를 통해 발생한 시그널 처리함.
• 시그널 처리 방법
‣ 시그널 무시
‣ 시그널 블록(이후, 블록 풀면 해당 프로세스에서 시그널 처리)
‣ 등록된 Signal handler로 특정 동작 수행
‣ 커널에서 기본 동작 수행(Default)
7️⃣ 소켓(Socket)
• 일종의 소프트웨어 구조로 네트워크 상에서 데이터를 주고/받는 endpoint 역할
• 컴퓨터와 컴퓨터 사이에서 데이터를 주고 받는 것도 가능하지만, 하나의 컴퓨터 안에서 각 컴포넌트끼리 데이터를 주고 받는데 사용하는 것도 가능함.