운영체제 2주차
프로세스 간 통신(IPC)
서로 다른 프로세스가 데이터를 주고받기 위한 기법. 각 방법마다 동기화 방식, 속도, 구현 난이도에서 차이가 있다.
방법특징장점단점파이프 (Pipe)한 방향 통신 (익명 파이프), 부모-자식 간 사용간단하고 구현 쉬움양방향 어렵고 제한적임메시지 큐메시지 형태로 데이터 전송, 큐를 통해 비동기 처리비동기 지원, 독립적 통신커널 리소스 필요, 크기 제한공유 메모리메모리 공간을 공유, 가장 빠른 통신 방식속도 빠름동기화(락) 필수, 복잡함소켓네트워크 기반 통신, 원격 프로세스와 통신 가능네트워크를 통한 유연한 통신프로토콜 관리 복잡, 느림
[프로세스 A] --| 파이프 |--> [프로세스 B]
[프로세스 A] --| 메시지 큐 |--> [프로세스 B]
[프로세스 A]
|
| 공유 메모리 (Shared Memory)
|
[프로세스 B]
[프로세스 A] <-- TCP/UDP 소켓 --> [프로세스 B]
공유 자원과 임계 구역
공유 자원은 여러 프로세스나 스레드가 접근하는 데이터나 자원이다. 임계 구역은 그 자원에 접근하는 코드 영역으로, 동시에 접근하면 문제 발생 가능성이 있다.
용어설명공유 자원여러 프로세스나 스레드가 동시에 접근하는 자원 (예: 파일, 메모리)임계 구역공유 자원에 접근하는 코드 블록으로, 동시에 접근하면 데이터 일관성 문제가 생김동기화 도구임계 구역을 보호하기 위해 사용 (락, 세마포어, 모니터 등)
세마포어
동기화 객체로, 카운터 값을 통해 자원 접근을 제어한다. 임계 구역에 여러 프로세스가 접근하지 못하게 조정하며, 두 가지 연산으로 관리한다.
wait()
(P 연산): 세마포어 값을 감소. 값이 0보다 작으면 대기signal()
(V 연산): 세마포어 값을 증가. 대기 중인 프로세스가 있으면 깨움
종류설명카운팅 세마포어자원의 개수를 관리. 값이 0 이상일 때만 접근 허용이진 세마포어0 또는 1 값을 가짐. 뮤텍스와 유사하게 동작
// wait() 연산 (P)
wait(S):
while S <= 0:
wait
S = S - 1
// signal() 연산 (V)
signal(S):
S = S + 1
모니터
공유 자원과 그 자원을 사용하는 메서드를 하나의 단위로 캡슐화하고 동기화를 자동으로 처리하는 구조이다. 특정 언어나 플랫폼에서 구현 방식이 다르다.
언어/플랫폼구현 방법설명Javasynchronized
키워드 사용메서드나 블록 단위로 동기화 처리C#lock
키워드, Monitor
클래스Monitor.Enter/Exit
또는 lock
문법 사용.NETC# 동일 + Task
, async/await
병렬 처리와 비동기 지원을 강화
데드락(교착 상태)
서로 자원을 점유하고 대기하는 상황이 꼬여서 아무도 작업을 진행하지 못하는 상태.
[P1] ----(점유중)---> [R1]
^ |
| |
| (대기중)
| |
[P4] <----(점유중)---- [R4]
데드락 발생 조건 (4가지 필요조건)
조건설명상호 배제자원을 한 번에 하나의 프로세스만 점유 가능비선점자원을 강제로 빼앗을 수 없음점유와 대기자원을 점유한 채로 다른 자원을 기다리는 상태순환 대기프로세스들이 원형으로 자원을 점유하고 대기하는 구조
데드락 해결 방법
방법설명장점단점예방데드락 발생 조건 중 하나를 제거하여 사전에 차단단순하고 명확함시스템 자원 활용도 낮음회피자원 할당 시 안전 상태인지 판단 후 할당 (은행원 알고리즘)교착상태 회피 가능복잡하고 오버헤드 큼검출 및 복구교착 상태 발생 후 감지 및 해결 (롤백, 강제 종료 등)유연성 있음오버헤드, 데이터 손실 가능성
회피 전략 - 은행원 알고리즘
안정 상태(Safe): 자원 요청이 들어와도 교착 상태가 발생하지 않는 상태
불안정 상태(Unsafe): 교착 상태가 발생할 가능성이 있는 상태지만, 아직 교착 상태는 아님
검출 방법
방식설명특징가벼운 검출 (타임아웃)일정 시간 동안 작업이 없으면 교착 상태로 간주하고 복구 시도간단하지만 오탐 가능성 있음무거운 검출 (자원 할당 그래프)자원/프로세스 관계를 그래프로 그려 순환 존재 여부 탐지정확하나 지속적 검사로 인한 오버헤드 발생
컴파일과 프로세스
언어 구분
구분설명언어 예시컴파일 언어소스 코드를 기계어로 변환 후 실행 파일 생성C, C++, C#, Go인터프리터 언어소스 코드를 실행할 때 한 줄씩 해석하여 실행Python, JavaScript, Ruby
컴파일 과정 (C 기준)
복사편집test.c → 전처리기 → test.i
test.i → 컴파일러 → test.s
test.s → 어셈블러 → test.o
test.o → 링커 → test.exe
실행 파일이 프로세스로
링커가 생성한 실행 파일은 OS에 의해 메모리에 적재되고, 프로세스로 생성되어 실행된다.
메모리 종류
메모리 유형설명특징레지스터CPU 내부, 가장 빠른 속도CPU 연산용, 소량캐시 메모리CPU와 메인 메모리 사이에 위치L1(가장 빠름) ~ L3 존재메인 메모리(RAM)실행 중인 프로그램과 데이터를 저장휘발성, 속도 중간보조 저장장치HDD, SSD 등비휘발성, 대용량 저장
비트 수에 따른 주소 공간
32비트: 2³² → 4GB 주소 공간 한계
64비트: 2⁶⁴ → 이론상 수십 기가바이트 이상의 메모리 접근 가능
메모리와 주소
주소 구분설명물리 주소실제 메모리 주소, 하드웨어가 직접 접근논리 주소사용자 프로세스가 접근하는 가상의 주소경계 레지스터커널과 사용자 공간을 구분하며, 보호 기능 수행
메모리 할당 방식
방식설명장점단점가변 분할(세그멘테이션)프로세스 크기에 맞게 메모리 공간 할당공간 효율적외부 단편화 발생고정 분할(페이징)일정 크기 페이지 단위로 메모리 할당관리 간단, 단편화 적음내부 단편화 가능성버디 시스템2의 거듭제곱으로 메모리 블록을 분할 및 병합분할/병합 유연함일부 메모리 낭비 가능
버디 시스템 예시
메모리 전체 크기: 2048바이트
요청 크기: 500바이트
2048 → 1024 → 512바이트로 분할 후 500바이트 할당
나머지 12바이트만 낭비, 효율적 공간 사용 가능
회고..
배운 점
IPC 방식의 차이점과 적절한 사용처를 구분할 수 있게 되었다.
세마포어와 모니터의 개념적 차이와 구현 방식을 언어별로 정리했다.
메모리 할당 방식에서 외부 단편화, 내부 단편화 개념이 헷갈렸는데 확실히 정리했다.
아쉬운 점
은행원 알고리즘은 개념적으로만 접근했고, 실제 코드 구현이나 응용 사례가 부족했다. IPC도 실습 위주로 보완이 필요하다.
더 해보고 싶은 것
세마포어, 모니터를 직접 구현 해본 코드 검색해보기
데드락 검출을 위한 자원 할당 그래프를 찾아보기
댓글을 작성해보세요.