728x90
반응형
SMALL
프로세스 간 통신(IPC, Inter-Process Communication)이란?
컴퓨터에서 프로그램은 각각 독립적으로 실행되는 프로세스라는 단위로 나뉘어요. 하지만 때로는 한 프로세스가 다른 프로세스와 데이터를 주고받거나 협력해야 할 때가 있습니다. 이를 프로세스 간 통신(IPC)이라고 해요. 😊
IPC는 운영체제가 프로세스들끼리 정보를 공유할 수 있게 하는 방법이에요.
간단히 말해서, 프로세스들이 서로 대화하거나 파일을 주고받는 방법이에요. 😊
📂 IPC에서 자주 사용되는 개념
- 파이프 (Pipe): 데이터를 한쪽에서 보내면 다른 쪽에서 받을 수 있는 터널 같은 것!
- 소켓 (Socket): 네트워크로 연결된 두 프로세스가 통신하는 방식.
- 공유 메모리: 프로세스들이 같은 메모리 공간을 함께 사용하는 방법.
- 메시지 큐: 데이터를 보내고 받고 할 수 있는 편지함 같은 구조.
🌐 소켓 (Socket)
- 소켓은 두 프로세스가 네트워크를 통해 통신할 수 있는 연결 통로를 만드는 도구예요.
- 쉽게 말해, 한 컴퓨터에서 또는 인터넷을 통해 데이터를 주고받는 전용 전화선 같은 거예요.
- 소켓은 클라이언트(데이터를 보내거나 요청하는 쪽)와 서버(데이터를 받거나 제공하는 쪽)로 구성됩니다.
🐍 파이썬으로 소켓 통신 예제
# 서버 코드 (데이터를 기다림)
import socket
def start_server():
# 서버 소켓 생성
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345)) # 서버 주소와 포트 설정
server_socket.listen(1) # 클라이언트의 연결을 기다림
print("서버가 준비되었습니다. 클라이언트를 기다립니다 😊")
conn, addr = server_socket.accept() # 클라이언트와 연결 수락
print(f"클라이언트와 연결되었습니다: {addr}")
data = conn.recv(1024).decode() # 클라이언트로부터 데이터 수신
print(f"받은 메시지: {data}")
conn.send("안녕하세요! 😊".encode()) # 클라이언트에게 메시지 전송
conn.close() # 연결 종료
if __name__ == "__main__":
start_server()
# 클라이언트 코드 (데이터를 보냄)
import socket
def start_client():
# 클라이언트 소켓 생성
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345)) # 서버에 연결
print("서버에 연결되었습니다 😊")
client_socket.send("안녕하세요! 😊".encode()) # 메시지 전송
data = client_socket.recv(1024).decode() # 서버로부터 응답 수신
print(f"서버의 응답: {data}")
client_socket.close() # 연결 종료
if __name__ == "__main__":
start_client()
☕ 자바로 소켓 통신 예제
// 서버 코드
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(12345); // 서버 소켓 생성
System.out.println("서버가 준비되었습니다. 클라이언트를 기다립니다 😊");
Socket clientSocket = serverSocket.accept(); // 클라이언트 연결 수락
System.out.println("클라이언트와 연결되었습니다");
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String message = in.readLine(); // 클라이언트로부터 데이터 수신
System.out.println("받은 메시지: " + message);
out.println("안녕하세요! 😊"); // 클라이언트에게 응답 전송
clientSocket.close();
serverSocket.close();
}
}
// 클라이언트 코드
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 12345); // 서버에 연결
System.out.println("서버에 연결되었습니다 😊");
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out.println("안녕하세요! 😊"); // 서버에 메시지 전송
String response = in.readLine(); // 서버로부터 응답 받기
System.out.println("서버의 응답: " + response);
socket.close();
}
}
🧠 동작 설명 😊
- 서버는 특정 포트(전화번호 같은 거!)에서 클라이언트의 연결 요청을 기다려요.
- 클라이언트는 서버에 연결 요청을 보내고 데이터를 전송해요.
- 서버는 클라이언트의 데이터를 받고 응답 메시지를 다시 보내요.
2024.12.16 - [운영체제] - [쉬운설명]프로세스 간 통신(IPC)이란? : 파이프
2024.12.17 - [운영체제] - [쉬운설명]프로세스 간 통신(IPC)이란? : 메시지 큐
2024.12.17 - [운영체제] - [쉬운설명]프로세스 간 통신(IPC)이란? : 공유 메모리
😊 마무리
- 소켓: 네트워크 통신.
- 공유 메모리: 프로세스 간 공용 메모리 공간.
- 메시지 큐: 메시지를 저장하고 교환하는 우체통.
반응형
SMALL
'네트워크' 카테고리의 다른 글
[네트워크] NAT(Network Address Translation) 완벽 가이드: 역할, 종류, 동작 원리 및 보안 강화 (0) | 2024.12.18 |
---|---|
[웹 서비스] REST vs SOAP: 차이점, 장단점, 사용 사례와 예제 코드 비교 (1) | 2024.12.18 |
[네트워크] DNS 쉽게 이해하기: 도메인과 IP 주소 변환 원리 완벽 정리 (2) | 2024.12.18 |
[네트워크] DNS 작동 원리와 역할: 도메인과 IP 변환 쉽게 이해하기 (0) | 2024.12.18 |
[네트워크] 로드 밸런싱 주요 기술 완벽 정리: DNS 라운드 로빈, 최소 연결 기반, 해시 기반 등 개념과 장단점 (0) | 2024.12.10 |