조성호 님의 "쉽게 배우는 운영체제" 책을 정리한 포스팅 입니다
1. 프로세스 간 통신
같은 호스트에서 프로세스 간 통신 (IPC)
- 프로세스는 기본적으로 메모리를 공유하지 않기 때문에 통신이 필요함
| 구분 | 공유 메모리 | 파일 | 파이프 |
| 통신 방식 | 같은 메모리 공간 직접 접근 | 동일 파일 읽기/쓰기 | 단방향 스트림 |
| 속도 | 가장 빠름 | 가장 느림 | 중간 |
| 커널 개입 | ❌ | ⭕ | ⭕ |
| 동기화 | ❌ (직접 구현 필요) | ⭕ (커널이 관리함) | ⭕ (커널이 관리함) |
| 지속성 | ❌ | ⭕ | ❌ |
| 관계 제약 | ❌ | ❌ | ⭕ (부모–자식 필요) |
| 구현 난이도 | 높음 | 낮음 | 낮음 |
| 주 사용 목적 | 고성능 데이터 공유 | 기록·로그·설정 공유 |
간단한 데이터 전달
|
| 대표 예시 | 생산자–소비자 | 로그 파일 | ls | grep txt |
| 주요 API | shmget(), shmat() | open(), read(), write() | pipe() |
예제) 파이프
더보기
#include <stdio.h>
#include <unistd.h>
int main() {
int fd[2];
pipe(fd);
if (fork() == 0) { // 자식 프로세스
close(fd[1]); // 쓰기 닫음
char buffer[100];
read(fd[0], buffer, sizeof(buffer));
printf("Child read: %s\n", buffer);
} else { // 부모 프로세스
close(fd[0]); // 읽기 닫음
write(fd[1], "Hello, Pipe!", 13);
}
return 0;
}
다른 호스트에서 프로세스 간 통신 (네트워크)
| 구분 | Socket | RPC |
| 통신 개념 | 네트워크를 통해 두 프로세스가 직접 데이터 송수신 |
원격 서버의 함수를 로컬 함수처럼 호출
|
| 통신 단위 | 바이트 스트림 / 메시지 |
함수 호출(Request / Response)
|
| 방향성 | 양방향 통신 | 요청 → 응답 |
| 추상화 수준 | 낮음 (전송 계층 중심) |
높음 (네트워크 숨김)
|
| 개발자 제어 | 높음 (직접 프로토콜 설계) |
낮음 (프레임워크가 처리)
|
| 대표 예시 | 채팅 서버, 게임 서버 |
gRPC, REST API, Java RMI
|
2. 임계 구역
- 공유 자원에 접근하는 코드
Race Condition
- 여러 스레드나 프로세스가 동시에 접근하면서 실행 순서에 따라 결과가 달라지는 상황
- ✅ 실행 순서에 따라 데이터가 꼬일 수 있음
- ➡️ 실행 순서를 규칙으로 제어해야 함
해결 조건
| 조건 | 설명 |
| 상호 배제 (Mutual Exclusion) |
한 프로세스가 임계 구역에 있으면, 다른 프로세스는 동시에 진입할 수 없음
|
| 한정 대기 (Bounded Waiting) |
특정 프로세스가 임계 구역에 들어가기 위해 무한정 기다리게 하면 안 됨 (공정한 기회 보장)
|
| 융통성 (Progress & Fairness) |
대기하는 프로세스가 적절한 시점에 실행될 수 있어야 함
|
'OS' 카테고리의 다른 글
| [쉽게 배우는 운영체제] 7. 물리 메모리 관리 (0) | 2024.12.12 |
|---|---|
| [쉽게 배우는 운영체제] 6. 교착 상태 (1) | 2024.12.12 |
| [쉽게 배우는 운영체제] 4-2. CPU 스케줄링: 인터럽트 처리 (0) | 2024.12.12 |
| [쉽게 배우는 운영체제] 4-1. CPU 스케줄링: 스케줄링 (0) | 2024.12.12 |
| [쉽게 배우는 운영체제] 3-2. 프로세스와 스레드: 스레드 (0) | 2024.12.12 |