이번 글에서는 운영체제 과제를 수행하며 다뤘던 공유 메모리 생성 및 메시지 통신 기법에 대해 알아보려고 합니다
공유 메모리(Shared memory)는 컴퓨터 환경에서 여러 프로그램이 동시에 접근할 수 있는 메모리이다. 과다한 복사를 피하거나 해당 프로그램 간 통신을 위해 고안되었다. 환경에 따라 프로그램은 하나의 프로세서에서나 여러 개의 프로세서에서 실행할 수 있다. (예를 들어 여러 개의 스레드 간에) 하나의 프로그램 안에서 통신을 위해 메모리를 사용하는 일은 일반적으로 공유 메모리로 부르지 않는다.
출처: https://ko.wikipedia.org/wiki/%EA%B3%B5%EC%9C%A0_%EB%A9%94%EB%AA%A8%EB%A6%AC
프로세스 간 통신: 서로 다른 프로세스들이 데이터를 공유하고 통신해야 하는 경우에 사용됩니다. 예를 들어, 한 프로세스가 생성한 데이터를 다른 프로세스가 사용해야 하는 경우에 공유 메모리를 활용할 수 있습니다.
병렬 컴퓨팅: 병렬 컴퓨팅 환경에서 여러 프로세스나 스레드가 동시에 작업을 수행하고 서로의 결과를 공유해야 할 때 사용됩니다. 이를 통해 병렬 처리 성능을 향상시킬 수 있습니다.
고성능 및 실시간 응용: 데이터를 빠르게 처리하고 실시간으로 반응해야 하는 응용 프로그램에서 사용됩니다. 공유 메모리는 데이터를 직접 메모리에 접근하여 처리하기 때문에 빠른 속도를 제공합니다.
자원 공유 및 최적화: 여러 프로세스가 동일한 데이터나 자원을 공유해야 하는 경우에 사용됩니다. 이를 통해 자원의 중복 사용을 최소화하고 메모리 사용량을 최적화할 수 있습니다.
동기화: 여러 프로세스가 동시에 공유 메모리에 접근하면 데이터 일관성을 유지하기 위해 동기화가 필요하게 됩니다. 그렇기 때문에 데이터를 읽고 쓰는 시점을 조절하여 경쟁 상태나 일관성 문제를 방지해야 합니다.
보안: 공유 메모리를 사용하는 경우에는 보안 문제에 대해 신중해야 합니다. 민감한 데이터가 노출되지 않도록 적절한 보호 방법이 필요하며, 접근에 대한 권한을 잘 제어해서 의도치 않은 위험 접근을 방지해야 합니다.
자원 누출: 공유 메모리를 사용할 때는 메모리 누출이 발생하지 않도록 주의해야 합니다. 메모리를 할당한 후에는 반드시 메모리를 해체해서 자원을 반환해야 안전합니다.
데드락: 여러 프로세스가 공유 메모리를 사용하는 경우에는 데드락이 발생할 수 있습니다. 이를 방지하기 위해서 데드락을 탐지하고 해결하는 메커니즘이 필요합니다.
성능 저하: 너무 많은 프로세스가 동시에 공유 메모리를 사용하면 성능이 저하될 수 있습니다. 이를 방지하기 위해서 적절한 메모리 및 자원 관리가 필요합니다.
공유 메모리 객체를 생성하거나 열기 위해 사용됩니다
예시:
int fd = shm_open("/my_shared_memory", O_CREAT | O_RDWR, 0666);
if (fd == -1) {
perror("shm_open");
exit(EXIT_FAILURE);
}
주의할 점!
name 파라미터에 공유 메모리 경로를 작성할 때에는 꼭 이름 앞에 '/'이 존재해야 함
공유 메모리 객체를 삭제할 때 사용됩니다
예시:
if (shm_unlink("/my_shared_memory") == -1) {
perror("shm_unlink");
exit(EXIT_FAILURE);
}
파일을 메모리에 매핑하거나 메모리를 할당할 때 사용됩니다
flag 정보:
예시:
void *shm_ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (shm_ptr == MAP_FAILED) {
perror("mmap");
exit(EXIT_FAILURE);
}
메모리 매핑을 해제할 때 사용됩니다
예시:
if (munmap(shm_ptr, 4096) == -1) {
perror("munmap");
exit(EXIT_FAILURE);
}
파일의 크기를 변경할 때 사용됩니다
예시:
if (ftruncate(fd, 4096) == -1) {
perror("ftruncate");
exit(EXIT_FAILURE);
}
일정 시간동안 프로세스를 대기시킬 때 사용됩니다
예시:
usleep(1000000); // 1초 동안 대기