1. 프로세스 종료 (Process Termination)
🔹 종료 시점
- 프로세스는 마지막 명령어 실행 후 종료됨
- 종료 시 exit() 시스템 호출을 통해 운영체제에 종료 요청
🔹 종료 방법
- 명시적 종료: 코드에서 exit() 호출
- 암묵적 종료: 컴파일러가 자동으로 프로그램 끝에 exit() 삽입
🔹 운영체제의 역할
- 할당된 자원 회수 (메모리, 파일 등)
- PCB 제거
- 부모 프로세스가 wait 중이면, 자식 종료 상태를 전달하고 준비 상태로 전환
🔹 종료 관련 시스템 호출
| 방식 | 설명 |
| exit() | 자신을 정상적으로 종료 |
| abort() | 부모가 자식을 비정상적으로 종료, abort() 함수는 자기 자신을 종료시키는 함수 |
| kill() | 사용자가 임의로 종료 (시그널 전송) |
2. 프로세스 간 통신 (IPC: InterProcess Communication)
🔹 필요성
- 상호 독립 프로세스: 서로 영향을 주지 않음
- 상호 협조 프로세스: 통신과 동기화가 필요
- 병행 처리, 자원 공유 등에 사용
🔹 IPC 메커니즘
| 방식 | 설명 |
| 공유 메모리 (Shared Memory) | 버퍼 등 공유 공간을 사용하여 데이터를 주고받음 |
| 메시지 전달 (Message Passing) | 명시적으로 메시지를 send, receive 하여 전달 |
3. 공유 메모리(Shared Memory)와 메시지 전달 (Message Passing)
상호 협조 프로세스에서 여러 프로세스가 정보를 어떻게 공유할까?
1) 공유 메모리(Shared Memory)
🔹 생산자-소비자 문제(Producer-Consumer Problem)
- 생산자 프로세스는 정보를 생산하고, 소비자 프로세스는 정보를 소비
- 예를 들어, 인쇄 프로그램은 문자들을 생산하고 프린터 구동기에 의해 소비됨.
- 생산자가 만든 정보를 저장하고 소비자가 소비할 수 있는 버퍼 저장소가 필요.
- 버퍼 저장소가 공유 메모리
2) 메시지 전달 (Message Passing)
- 프로세스들이 메시지를 송수신하여 서로 통신
- 직접 통신, 간접 통신 2가지 방식이 있음
🔹 기본 연산
- send(message)
- receive(message)
🔹 통신 링크 필요
- 두 프로세스 사이에 통신 링크 설정 후 메시지 송수신
4. 직접 통신 vs 간접 통신
네트워크에서의 통신이 아닌, 하나의 컴퓨터 내에서 P1과 P2 프로세스간의 통신임
| 항목 | 직접 통신 | 간접 통신 |
| 식별 방식 | 상대 프로세스 ID 명시 | 메일박스(또는 포트) 공유 |
| 링크 수 | 프로세스 쌍당 1개 링크 | 여러 프로세스와 공유 가능 |
| 예시(시스템 호출) | send(P, msg) - 프로세스 P에게 메시지 msg를 송신 receive(Q, buf) - 프로세스 Q로부터 메시지를 buf로 수신 |
send(id, msg) - mailbox 에게 메시지 msg를 송신 receive(id, buf) - mailbox 로부터 메시지를 buf로 수신 |
| 연결성 | 강한 결합 | 느슨한 결합 |
| OS 역할 | PID 기반 통신 관리 | 메일박스 생성/제거 지원 |
1) 직접 통신

- P1이 send(P2, msg)를 보내면 운영체제가 시스템 호출을 통해 운영체제에 보낸 사람(P1) 와 메시지(msg)를 복사해서서 PCB2에 연결함.
- 이후, P2가 recieve(P1, buf) 을 보내면 PCB2에 연결된 P1가 보낸 msg를 찾아서 buf에 저장한 후, 운영체제에서 P1 msg를 삭제함.
2) 간접 통신

- 직접 프로세스 PID로 msg를 전송하는 것이 아니라, 운영체제의 mailbox 를 공유 메모리로서 msg를 전송 및 저장함.
- 하나의 mailbox는 여러 개의 프로세스가 링크로 연결되어 있음.
- id = create_mailbox("name") 과 같이 mailbox의 name을 선언하면서 mailbox를 만듬.
- 성공 시에 OS에 만들어진 mailbox의 id를 반환함.(mailbox를 만드는 함수 이름이 create_mailbox()가 아닐 수도 있음. 이는 운영체제에 따라 다름).
- 이 id로 send(id, msg)를 통해 msg를 OS mailbox에 연결함.
- 이 msg는 선입선출(FIFO)로 먼저 들어간 것이 먼저 반환됨.
- P2에서 id = create_mailbox("name")을 호출함.
- 해당 name의 mailbox가 없으면 새로 만들지만, 있을 경우, 해당 mailbox의 id를 반환함.
- 이 id로 receive(id, buf)를 통해 가장 먼저 들어간 msg를 buf에 저장함.
- 이 후, buf에 저장된 msg는 삭제되고, 나머지 msg들이 당겨서 mailbox와 연결됨.
- receive시에 특정 타입의 메시지 타입을 지정시에 중간의 msg를 buf에 저장하는 것도 가능함.
5. 동기화 방식
- 위와 같이 메시지를 전송(send)을 했는데 수신(receive)를 바로 하지 않을 수도 있음.
- 이를 기다리느냐 아니냐에 따라 지연 방식, 비지연 방식으로 나뉩.
| 방식 | 설명 |
| 동기적 (blocking) - 지연 방식 | 보내는 쪽/받는 쪽이 서로 기다림 - 수신자는 메시지가 수신될 때까지 지연 - 수신자는 메시지가 있을 때까지 지연 |
| 비동기적 (non-blocking) - 비지연 방식 | 메시지 전송 후 기다리지 않음 - 송신자는 메시지를 보내고 계속 일을 수행 - 수신자는 메시지를 받거나 바로 null을 반환 |
6. 버퍼링 (Buffering)
- 메시지를 임시로 저장하는 큐의 용량에 따라 다름
- 즉, 링크에 부착된 메시지 큐의 크기가 제한됨.
| 종류 | 설명 |
| 무용량 (0) | 메시지 저장 공간 없음. 수신자가 먼저 대기해야 함 (rendezvous) |
| 한계용량 (n) | 최대 n개까지 저장. 가득 차면 송신자는 대기 |
| 무한용량 | 무한정 저장 가능. 송신자는 대기 안 함 |
'OS' 카테고리의 다른 글
| [운영체제] CPU 스케줄링 이란?? (0) | 2025.04.09 |
|---|---|
| [운영체제] 쓰레드(Thread) 란?? (0) | 2025.04.07 |
| [운영체제] 프로세스의 스케줄링(Scheduling) 이란? (0) | 2025.03.31 |
| [운영체제] 프로세스의 상태(Process State) 란? (0) | 2025.03.26 |
| [운영체제] 프로세스(Process) 란? (0) | 2025.03.24 |