운영체제 수업을 수강하며 정리한 내용을 작성하려고 합니다.
Shared memory (메모리 공유)

- 프로세스의 특정 메모리 영역을 공유
- 공유한 메모리 영역에 읽기/쓰기를 통해서 프로세스간 통신을 수행
- 프로세스 간 통신은 유저 프로세스 간 수행함
- OS는 통신 과정 자체에는 관여하지 않음
- OS는 공유 메모리를 생성하고 각 프로세스의 주소 공간에 공유 메모리 영역을 매핑하는 역할을 함
- 이슈: 두 프로세스가 공유된 영역을 동시에 접근하고 수정한다면?
- 공유된 영역: inconsistency 발생 가능
- inconsistency를 막기 위한 방법: 동기화(synchronization)
Message passing (메시지 전달)
- 프로세스간 메모리 공유 없이 동작 가능
- 주고받고자 하는 메시지를 별도의 공유된 변수 없이 “보내고”, “받는” 동작을 통해 통신 수행(함수 호출, 시스템 콜)
- Send(message)
- receive(message)
- 메시지의 길이는 1.고정 또는 2.가변 둘 다 가능
- 커널을 통해 메시지가 프로세스 간 복사됨
- 메시지 교환을 구현하는 다양한 메커니즘들 존재
IPC의 기본적인 동작방식 정리
- 메모리 공유 방식
- Read and Write
- 프로세스의 주소 공간의 일부를 공유 메모리 영역으로 설정하여 프로세스에서 바로 접근
- 메시지 전달 방식
- Send and receive
- 커널을 경유하여 메시지 전송 → Mode switch가 반드시 발생
- ~~문맥전환이 발생할 수 있음 - 오버헤드~~
IPC에서 동기화의 필요성
- 메모리 공유 방식 - 사용자가 제공
- 메모리 영역에 대한 동시적인 접근을 제어하기 위한 방법이 필요
- 동시적인 접근에 대한 제어를 “동기화”라고 함
- 메시지 전달 방식 - 커널이 동기화 제공
- send와 receive와 같은 연산에 대해서는 커널이 동기화
- send와 receive를 수행할 때에는 프로그램에서 동기화에 대한 고려 없이 사용 가능
Signal
- 특정 프로세스에게 이벤트를 전달하는 기법
- 송신 프로세스 : 여러 신호 중 하나를 특정 프로세스에 보냄
- 이 동작은 수신할 프로세스의 상태에 무관, 비동기적
- 운영체제 또한 송신 프로세스가 될 수 있음 (e.g., SIGINT signal)
- 수신 프로세스 : signal 수신 시 동작을 구현할 수 있음
- Ignore : 무시 (이 경우에도 SIGSTOP, SIGKILL 등은 무시되지 않음)
- Block : 신호를 붙잡아 둠 (나중에 처리)
- Handle : 시그널을 유저 프로그램이 바로 처리 (signal handler를 구현)
- 커널이 수신 프로세스가 시그널을 처리하도록 함
- 모든 프로세스는 signal 처리를 위한 default 코드(handler)를 지니게 됨
- 시그널의 비동기적인 동작
- Process A가 Process B에게 시그널을 보냄
- 시그널 처리는 Process B가 스케줄링 되어야 가능함
Pipe

- 하나의 프로세스가 다른 프로세스로 데이터를 직접 전달하는 (것처럼 보이는) 기법
- 데이터는 한 쪽 방향으로만 이동, 단방향 (half duplex)
- 양방향 통신을 위해서는 두 개의 파이프 필요(full duplex)
- 1대1 의사소통만 가능
- 보내진 순서대로만 받음 (ordering)
- Pipe에 쓰여지는 데이터는 커널(buffer)에 저장되고 관리됨
- 동기화 보장
- 한 시점에 하나의 프로세스만 접근 가능
Message Queue

- 고정된 크기를 갖는 메시지 큐를 이용하는 기법
- 프로세스는 메시지 큐(메일함)을 생성할 수 있음
- 메시지 단위의 통신
- 메시지의 형태는 통신하고자 하는 프로세스간의 약속 필요
- 메시지의 형태는 사용자가 정의하여 사용
- send, recieve되는 메시지는 커널의 메시지 큐에 저장, 관리됨
Socket
- 소켓 : endpoint for communication
- 통신에 참여하는 송수신자를 식별할 수 있게 함
- 식별을 위한 주소값을 가짐
- 소켓의 주소값: concatenation of IP address(interface) and port(프로세스 구분)
- e.g., socket 161.25.19.8:1625: Port #1625 on the host 161.25.19.8
- 프로세스의 위치에 independent
- 동일한 운영체제 내 IPC 뿐만 아니라, 다른 OS 내의 프로세스와 통신 가능
- Local 또는 remote
- Local : loopback address(한 컴퓨터 내 소켓통신)
- Remote의 경우 IP주소 + 포트번호 조합으로 식별
- 연결 방식(connection semantics)을 정할 수 있음
- Reliable, 패킷의 전달을 보장(TCP) / Unreliable(UDP)
소켓의 특성: communication endpoint

- Machine boundary를 넘어 통신을 위한 endpoint를 나타냄
- 프로세스는 여러 개의 socket을 사용 가능
- 특정 인터페이스(IP주소) 및 포트 번호를 지님
- Port : 통신을 위한 식별 번호
Port examples

- Well-known, Registered, Dynamic port
- Well-known ports: 0 ~ 1023
- Registered ports: 1024 ~ 49151
- Dynamic ports: 49152 ~ 65535
RPC (remote procedure call)

- Socket은 데이터를 읽고 쓰는 동작을 수행함 (procedure call)
- RPC: 반대편 컴퓨터의 프로세스에 procedure call을 유도
- 1984, birrell & nelson, Mechanism to call procedures on other machines
- 클라이언트 입장에서는 서버의 함수를 직접 호출하는 것처럼 동작, 리턴값까지 받아옴
- stub: 상이한 프로세스 간 호환을 위해 메모리 주소, 파라미터 등 변환