-
2024 운영체제 정리 - 3. IPCOperating System 2024. 4. 2. 19:16728x90
2024 운영체제 정리 - 3. IPC
- 1. 운영체제란
- 2. Process & Thread
- 3. IPC
- 4. CPU Scheduling
- 5. Synchronization
- 6. Virtual Memory
IPC와 관련된 코드적인 내용은 아래 링크에 더 자세히 설명해두었다
https://asidefine.tistory.com/94
https://asidefine.tistory.com/98
- 프로세스마다 각각 다른 메모리 공간을 가지기 때문에, 데이터를 주고 받기 위해선 IPC (Inter Process Communication)가 필요하다
- IPC에는 5가지 방법이 있다 -> 1) 파일, 2) 소켓, 3) 파이프, 4) 메세지 큐, 5) 공유 메모리
- 위에서 2) 소켓, 3) 파이프, 4) 메세지 큐는 메세지 전달 방법에 속하며 system call을 사용해서 구현된다
아래에서는 메세지 전달 방식과 공유 메모리 방식을 나눠서 살펴 볼 것이다.
+) IPC와 System V IPC!?
유닉스는 처음 개발된 이래 다양한 형태로 발전했으며, 크게 BSD 계열과 시스템 V 계열로 구분할 수 있다.
System V IPC는 시스템 V 계열 유닉스에서 개발해 제공하는 프로세스 간 통신방법으로,
위에서 언급한 5가지 방법 중 메세지 큐, 공유 메모리가 System V IPC에 속한다 (뒤에서 나올 Semaphore도 여기에 속함)
공통 요소
- 시스템 V IPC를 사용하기 위해서는 IPC 객체를 생성해야 함
- IPC 객체를 생성하기 위해 공통적으로 사용하는 기본 요소는 키와 식별자메세지 전달 (Message Passing)
- system call를 통해 kernel에 요청하면 kernel이 다른 process에게 전달
- 장점
- 안전하고 구현하기 쉬움
- 단점
- 적은 데이터 전달 가능
- 속도가 느림
- -> System call을 이용하기 때문에 Kernel의 관여를 한 번 거쳐야 하기 때문에
- 2) 소켓, 3) 파이프 , 4) 메세지 큐는 메세지 전달 방법에 속함
- 2) 소켓은 네트워크를 이용하는 방식
- 3) 파이프, 4) 메세지 큐는 운영체제 단에서 작동한다
- 3) 파이프 (PIPE)
- 통신할 프로세스가 명확하게 알 수 있는 경우 사용
- 부모 자식 or 형제 프로세스 간에만 사용 가능 (외부 프로세스에서는 사용할 수 없다)
- 단방향 통신 - 한 프로세스는 데이터를 쓰기만 할 수 있고, 다른 하나는 읽기만 할 수 있다
- 송/수신을 모두하고 싶다면 두 개의 파이프를 만들어야 한다
- 통신할 프로세스가 명확하게 알 수 있는 경우 사용
- +) Named PIPE
- 전혀 모르는 상태의 프로세스들 사이의 양통신에 사용
- 부모 프로세스와 무관한 다른 프로세스도 통신 가능
- FIFO 라 불리는 특수 파일을 이용해 서로 관련 없는 프로세스 간 통신에 사용한다.
- mkfifo() 함수를 통하여 FIFO 파일을 생성한 후 어떤 프로세스라도 이 파일의 경로를 안다면 이 파일에 접근하여 read/write을 할 수 있다
- 전혀 모르는 상태의 프로세스들 사이의 양통신에 사용
- client (writer) 코드
#include <fcntl.h> #include <sys/stat.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #define MSG_SIZE 80 #define PIPENAME "./named_pipe_file" int main(void) { char msg[MSG_SIZE]; int fd; int nread, i; /* named pipe 열기, Write 전용으로 열기 */ if ((fd = open(PIPENAME, O_WRONLY)) < 0) { printf("fail to open named pipe\n"); return 0; } /* Data를 보낸다. */ for (i = 0; i < 3; i++) { snprintf(msg, sizeof(msg), "Send Message[%i]", i); if ((nread = write(fd, msg, sizeof(msg))) < 0 ) { printf("fail to call write()\n"); return 0; } } return 0; }
- 4) Message Queue
- 입출력 방식은 Named 파이프와 동일하다.
- 다른 점은
- 메시지 큐는 파이프처럼 데이터의 흐름이 아니라 메모리 공간이다. (메모리를 사용한 PIPE)
- PIPE나 FIFO와는 달리, 다수의 프로세스간 메시지를 전달 할 수 있음
- 특징
- 커널에서 제공하는 Message queue 이기 때문에 EnQueue 하는데 제한이 존재 한다.
- 각 메시지에는 메시지 유형이 있어 수신 프로세스는 어떤 유형의 메시지를 받을 것인지 선택 가능
- 사용 방법
- msgbuf라는 임의의 구조체를 만들어줘서 message queue에 보내줘야 한다
- 무조건 맨 처음에는 msgtype이 들어있어야 한다
- msgsnd할 때는 msgtype을 설정해줘야 하며, msgrcv에서는 원하는 msgtype을 읽어올 수 있다!
메시지 큐 방식은 위와 같이 메시지를 구분하기 위해 메시지에 태그(번호)를 달아 메시지를 구분 합니다. 위 그림의 동작을 보면 프로세스 A에서는 송신 함수를 통해 메시지 #3을 메시지 큐로 송신하는 과정이고 프로세스 B는 recv(수신 함수)를 통해서 메시지 #2를 프로세스 B의 메모리 공간으로 가져오는 작업입니다
2) 소켓
- 네트워크 소켓 통신을 통해 데이터를 공유한다.
- 데이터 교환을 위해 양쪽 PC에서 각각 임의의 포트를 정하고 해당 포트 간의 대화를 통해 데이터를 주고받는 방식이다.
- 이 때 각각 PC의 PORT를 담당하는 소켓은 각각 하나의 프로세스이다.
- 즉 해당 프로세스는 임의의 PORT를 맡아 데이터를 송수신 하는 역할을 진행하는 프로세스인 것 입니다.
- 각각의 PC에서 프로세스를 통해 타 PC PORT에 연결하라는 명령을 보내게 되면 두 프로세스는 서로 확인과정을 거쳐 연결을 진행하고 연결 후 마치 PIPE와 같이 1 대 1로 데이터를 주고받는 방식이다.
클라이언트와 서버가 소켓을 통해서 통신하는 구조로, 원격에서 프로세스 간 데이터를 공유할 때 사용한다.
공유 메모리 (Shared Memory)
- process들이 주소 공간의 일부를 공유 -> 공유한 메모리 영역에 읽기/쓰기를 통해서 통신을 수행
- process가 공유 메모리 할당을 kernel에 요청하면 kernel은 해당 process에 메모리 공간을 할당
- 공유 메모리 영역이 구축된 이후에는 모든 접근이 일반적인 메모리 접근으로 취급되기 때문에 더이상 kernel의 도움없이도 각 process들이 해당 메모리 영역에 접근할 수 있음
- 단 그래도 공유메모리는 커널에 의해서 관리되긴 함
- 장점
- 커널의 관여 없이 데이터를 통신할 수 있기 때문에 IPC속도가 빠르다는 장점
- 단순히 공유 메모리를 point 함으로써 프로세스에서 사용되는 메모리가 증가되지는 않는다.
- 단점
- 동시에 같은 메모리 위치에 접근하게 되면 일관성 문제가 발생할 수 있음 -> 동기화 문제 발생 가능
728x90'Operating System' 카테고리의 다른 글
2024 운영체제 정리 - 6. 메모리 관리와 Virtual Memory (0) 2024.04.02 2024 운영체제 정리 - 5. Synchronization & Deadlock (0) 2024.04.02 2024 운영체제 정리 - 4. CPU Scheduling (1) 2024.04.02 2024 운영체제 정리 - 2. Process & Thread (0) 2024.04.02 2024 운영체제 정리 - 1. 운영체제란 (0) 2024.04.02