OS

[운영체제] 프로세스 종료와 통신

ch010104 2025. 4. 2. 14:31

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개까지 저장. 가득 차면 송신자는 대기
무한용량 무한정 저장 가능. 송신자는 대기 안 함