짬뽕얼큰하게의 맨땅에 헤딩 :: 'IPC 개요' 태그의 글 목록

'IPC 개요'에 해당되는 글 1건

1. IPC 방법의 분류

크게 3개의 기능적 분류로 나눌 수 있음.

  • 통신 : 프로세스 간에 데이터를 주고받는 방법

  • 동기화: 프로세스나 스레드 간에 동기화를 맞추는 방법

  • 시그널: 시그널은 다른목적으로 설계되었지만, 특정 상황에서 동기화를 맞추는 방법으로 사용 가능

    시그널 번호 자체가 하나의 정보 형태기때문에 통신목적으로도 사용 가능(연관된 정수, 포인터를 수반할 수 있음)

 

 

2. 통신 방법

  • 데이터 전송: 쓰기와 읽기 두가지 요소로 구분
    통신을 하려면 한 프로세스에서 IPC방법에 데이터를 쓰고 다른 프로세스는 이 데이터를 읽어야함
    이 기술에는 사용자 메모리와 커널 메모리 간에 통신하는 두가지 전송 모드가 있음
    - 쓰는 동안 사용자 메모리로부터 커널 메모리로 전송
    - 읽는 동안 커널 메모리에서 사용자 메모리로 전송
  • 공유 메모리: 특정 메모리 영역에 데이터를 저장해 프로세스간 데이터를 공유하는 방식
    사용자 메모리와 커널 메모리 사이에 시스템 호출이나 데이터 전송이 필요하지 않기 때문에 공유 메모리는 매우 빠른 통신을 제공

데이터 전송방법은 다음과 같이 하위 카테고리로 더 세분화 할 수 있음

  • 바이트 스트림: 파이프, FIFO, 스트림 소켓을 통해 전송되는 데이터는 제한되지 않은 바이트 스트림
    각 read 오퍼레이션은 전송자가 얼마만큼의 데이터를 섰는지에 상관없이 IPC방법으로부터 임의의 크기의 바이트를 읽어야 하는지 얻어와서 읽음
  • 메시지: 시스템 V 메시지큐, POSIX 메시지 큐, 소켓 데이터그램은 데이터를 전송할 때 한 번에 전송할 수 있는 크기에 제한이 있음. 각 읽기 오퍼레이션은 송신자의 프로세스가 쓴 데이터 전체를 한번에 읽게됨.
    IPC방법에 메시지의 일부를 놔두고 메시지의 일부분만을 읽을 수 없음
    한번의 읽기 오퍼레이션으로 여러개의 메시지를 읽는것도 불가능
  • 가상 터미널: 가상터미널은 통신 방법중 하나이며 특정 상황에서 설계됨. 이건 나중에 더 공부 필요...
    송신자, 수신자 프로세스 간의 동기화는 자동으로 이루어짐. 읽기시 수신한 데이터가 없다면 자동으로 블록

 

공유 메모리는 시스템 V 공유 메모리, POSIX 공유 메모리, 메모리 매핑 세가지 공유 메모리를 제공

공유 메모리가 빠른 통신 방법을 제공하지만, 이런 속도의 장점은 공유 메모리를 동기화하는 데 들어가는 시간과 상쇄될 수 있음. 하나의 프로세스는 다른 프로세스가 메모리상에서 작업을 하고 있을 때 접근 불가능.

메모리에 저장된 데이터는 같은 메모리를 공유하는 모든 프로세스에서 볼 수 있음.

 

 

3. 동기화 방법

세마포어: 리눅스는 시스템 v 세마포어와 POSIX 세마포어를 제공

 

파일 잠금: 같은 파일에 다중 프로세스가 작업을 할 때 이를 중재

읽기 잠금과 쓰기 잠금으로 사용. flock(), fcntl() 시스템 호출로 제공.

flock()은 전체파일 잠금. 거의 사용하지 않음.

fcntl()으로 레코드 잠금. 파일의 여러곳에 lock할수 있음.


뮤텍스: POSIX 스레드에서 일반적으로 사용

 

-> 통신 방법을 동기화에 사용할 수 있음. 

 

 

4. IPC 방법 비교하기

데이터 전송 방법 vs 공유 메모리

데이터 전송 방법(파이프, FIFO, 메시지)은 동기화를 커널이 자동으로 처리. 여러 응용프로그램 설계에 적합

공유메모리는 하나의 프로세스가 같은 메모리 공간을 공유해 다른 여러 프로세스에서 데이터를 볼수있게 할때 유용.

공유메모리는 동기화를 지원해야하므로 복잡한 설계를 추가해야 할 수 있음.

 

바이트 스트림(파이프, FIFO, 소켓) 전송 vs 메시시 전송(메시지 큐, 데이터그램 소켓)

응용프로그램이 바이트 스트림 방법의 메시지 중심 모델을 선호 할 수 있는데 구분문자를 사용, 고정 길이 메시지를 사용, 최종 메시지 길이를 헤더에 표시 등을 사용할 수 있기 때문

 

시스템V와 메시지 큐 VS 그밖의 데이터 전송 방법

시스템 V와 메시지 큐는 숫자형이나 우선순위를 메시지에 줄 수 있음. 보낸 순서와 다른순서로 도착 할 수 있음

 

파이프, FIFO, 소켓은 파일 디스크립터를 통해 구현됨.

I/O 모델의 대안으로 제시된 멀티플렉싱(select()와 poll() 시스템 호출), 시그널 기반 I/O, 리눅스 고유의 epoll API를 모두 지원. 동시에 다중 파일 디스크립터를 관찰해 I/O중 어떤 것이 사용 가능한지 파악 할 수 있음.

시스템 V 메시지 큐는 파일 디스크립터 기술을 사용하지 않고 이런 기술을 지원하지 않음. 

 

POSIX 메시지큐는 통지 방법을 제공, 프로세스나 새로운 스레드에 비어있는 쿠에 메시지가 도착하면 시그널을 전송

 

유닉스 도메인 소켓은 파일 디스크립터를 하나의 프로세스에서 다른 프로세스로 전달할 수 있는 기능을 제공

이 기능은 하나의 프로세스에서 파일을 열고 이를 파일에 접근할 수 없는 다른 프로세스가 사용 가능하게 함

 

레코드 잠금은 fcntl() 을 이용해 걸게됨 fcntl()을 사용할 경우 커널이 데드락을 감지하지만 시스템V와 POSIX 세마포어는 소유권 속성을 갖고있지 않아 세마포어의 데드락을 커널이 자동으로 감지 할 수 없음.

 

시스템 V IPC 설계 이슈

시스템 V IPC는 전통적인 유닉스 I/O 모델과는 독립적으로 설계됐기 때문에 결과적으로 기이한 프로그래밍 인터페이스가 존재, 사용하기 복잡 //  POSIX IPC는 이런 문제를 고려해 설계됨

시스템 V IPC는 비 연결형 : IPC를 열기 위해 사용하는 핸들 개념을 제공하지 않음. 커널은 프로세스가 객체를 열고있는지 기록하지 않기때문에 객체가 안전하게 제거되는지 알기 위해서는 추가적인 프로그래밍이 필요

 

 

 

출처: 리눅스 API의 모든것 고급 리눅스 API

'시스템 프로그래밍' 카테고리의 다른 글

리눅스 역사와 표준  (0) 2020.04.25
블로그 이미지

짬뽕얼큰하게

,