Skip to content

Latest commit

 

History

History
57 lines (28 loc) · 3.14 KB

File metadata and controls

57 lines (28 loc) · 3.14 KB

IPC System

  • 실제로 사용하는 IPC 시스템의 예시로 공유 메모리 방식은 POSIX(Portable Operating System Interface for UniX) 공유 메모리를 사용하고 메세지 패싱 방식은 Unix-like 운영체제에서 많이 사용하는 파이프를 사용합니다.

POSIX Shared Memory

  • POSIX 공유 메모리 방식은 memory-mapped file을 사용합니다.

POSIX 생산자 프로세스의 구현

  • posix_producer.c

  • 공유 메모리 객체(memory-mapped file)를 생성(shm_open())하고 할당된 파일 디스크립터를 변수에 저장합니다.

  • 공유 메모리의 크기를 지정(ftruncate())합니다.

  • 공유 메모리의 시작 주소를 포인터 변수에 맵핑(mmap())시킵니다.

  • 전달할 데이터를 공유 메모리에 입력(sprintf())합니다.

POSIX 소비자 프로세스의 구현

  • posix_consumer.c

  • 생산자 프로세스가 생성한 공유 메모리 객체에 접근(shm_open())합니다.

  • 공유 메모리의 시작 주소를 포인터 변수에 맵핑(mmap())시킵니다.

  • 전달받을 데이터를 모두 소비했다면 링크를 삭제(shm_unlink())합니다.

  • POSIX 공유 메모리 방식도 파일 디스크립터를 사용해 open하고 데이터를 읽고 쓰는 방식은 동일하지만 실제 메모리에 존재하는 영역을 사용하기 때문에 포인터에 주소를 맵핑시킨다는 점이 특징입니다.

파이프(Pipes)

  • 파이프는 유닉스 초창기에 사용하던 메세지 패싱 방식입니다.

Ordinary Pipes

  • 프로세스의 밖에서는 접근할 수 없으며 부모 프로세스가 파이프를 생성하고 그것을 자식 프로세스와 통신하기 위해 사용합니다.

  • Ordinary Pipe는 단방향 통신입니다. 프로세스가 서로 데이터를 주고 받으려면 부모 프로세스의 표준 출력과 자식 프로세스의 표준 입력을 연결하는 파이프, 자식 프로세스의 표준 출력과 부모 프로세스의 표준 입력을 연결하는 파이프, 두개의 파이프를 사용합니다.

  • 부모 프로세스는 파이프를 생성합니다. 그리고 부모 프로세스는 자신의 표준 출력에 전달할 데이터를 입력하고 자식 프로세스는 자신의 표준 입력에 부모 프로세스가 전달한 데이터를 읽어와 입력합니다.

  • ordinary_pipes.c

pipe()

  • pipe()함수는 표준 스트림 외 새로운 파일 디스크립터를 생성합니다. 첫번째 스트림은 파이프를 통해 데이터를 읽는 프로세스가 사용하는 스트림이고 두번째 스트림은 파이프를 통해 데이터를 전달하는 프로세스가 사용하는 스트림입니다.

  • 그렇게 때문에 길이가 2인 배열을 생성하여 pipe()함수의 인자로 전달하고 파이프의 생성 후 생성된 스트림을 참조하는 해당 배열의 원소를 사용해 파이프로 프로세스간 통신을 할 수 있습니다.

Named Pipes

  • 부모 자식 관계가 아니더라도 통신을 할 수 있는 방식입니다.