[OS] IPC

kafkaaaa·2023년 9월 18일
0

OS

목록 보기
1/1
post-thumbnail

프로세스와 스레드 (먼저 보시면 좋습니다)

📌 Process & Thread, Mutli Process & Thread

# IPC

Inter-Process Communication
= 내부 프로세스 간 통신

운영체제 상에서 실행중인 프로세스 간에 정보를 주고받는 것.
프로세스는 자신에게 할당된 메모리 내의 정보만 접근할 수 있고,
이를 벗어난 경우 Segmentation Fault 등의 오류가 발생한다.
이는 안전성을 위해 OS에서 자신 프로세스의 메모리에만 접근하도록 강제하고 있기 때문이다.

따라서 한 프로그램에서 병렬성을 키우면서 공유되는 데이터를 사용하기 위해 메모리 공간을 공유하는 스레드를 이용하는 경우가 많다. 하지만 이것은 하나의 프로그램에서만 의미가 있고,
서로 다른 프로그램(프로세스)의 데이터를 공유하려면 다른 프로세스의 메모리에 접근해야 한다.
이 때 IPC를 사용한다.

  • Process는 완전히 독립된 실행 객체
  • 독립 = 다른 Process의 영향을 받지 않음을 의미
  • 그러나 독립되어 있어 서로 통신이 어려움
  • 이를 위해 Linux Kernel 에서는 IPC 제공
  • Process는 Kernel이 제공하는 IPC설비를 통해 프로세스 간 통신을 함

📌 커널 (Kernel)

운영체제도 SW이기 때문에 메모리에 올라가야만 사용이 가능하다.
그러나 메모리 공간의 제약으로 운영체제 中 항상 필요한 핵심적인 부분만 메모리에 올려놓고 나머지 부분은 필요할 때 메모리에 올려서 사용하는데, 이 때 운영체제 중 항상 메모리에 상주하는 핵심 부분을 커널이라고 한다.
HW와 응용프로그램 사이에서 인터페이스 제공 및 컴퓨터의 자원 관리 등의 기능을 수행한다.



# IPC 종류

#1. PIPE (익명 PIPE)

  • 익명의 PIPE를 통해서 동일한 부모 프로세스를 가진 자식 프로세스들 간의 단방향 통신 지원
  • FIFO 구조
  • 부모-자식 프로세스간 통신에 사용
  • 한쪽 방향으로만 통신이 가능한 파이프의 특징 때문에 Half-Duplex(반이중) 통신이라고 부르기도 함

📌 "Everything is a file"

  • 파이프도 파일이다. 파이프는 파일의 특수한 유형이다.

  • FD(File Descriptor)의 0~2에는 stdin/out/err 할당되어 있다.
  • pipe( ) 시스템 호출은 일반적으로 가장 낮은 숫자 2개의 FD를 사용
  • 2개 = Readable end & Writable end
  • 각 읽기/쓰기 엔드에 파이프가 연결되게 함
  • 부모 프로세스에서 fork( )하여 자식 프로세스를 생성하는데,
  • 이 때 자식은 부모의 FD를 이어받아 자식에도 읽기/쓰기 엔드가 할당됨.
  • 읽기/쓰기 中 필요한 것만 사용.

  • 파이프에 대한 추가 설명

https://twpower.github.io/133-difference-between-redirect-and-pipe


#2. Named PIPE

  • 이름을 가진 PIPE를 통해서 프로세스들 간에 양방향 통신 지원
  • 동시에 양방향은 X, 2개의 파이프 이용해야 함. Full-Duplex(전이중) 통신 방식.
  • 서로 다른 프로세스들이 PIPE이름만 알면 통신이 가능 (이름이 있는 파일을 사용)
  • FIFO 구조

📌 익명 파이프와 비교

  • 익명 파이프는 단방향 / Named 파이프는 양방향 가능!
  • 익명 파이프는 동일 PPID를 가진 프로세스끼리만 통신이 가능함
  • Named 파이프는 PIPE이름만 알면 통신 가능
  • 익명 파이프는 부모-자식 프로세스간 통신만 가능


#3. Message Queue

  • 파이프가 아닌 어디에서나 물건을 꺼낼 수 있는 컨베이어 벨트와 유사
  • 커널에서 관리하며 메모리를 사용한 PIPE
  • 구조체 기반으로 통신 (msgtype)
  • 메시지 큐에 쓸 데이터에 번호를 붙임으로써 여러 개의 프로세스가 동시에 데이터를 쉽게 다룰 수 있음
  • FIFO 구조

#4. Shared Memory

  • PIPE와 Message Queue는 통신을 이용해서 데이터를 주고 받는 것이고,
    Shared Memory는 데이터 자체를 공유하는 것.
  • 프로세스 간 메모리 영역을 공유해서 사용할 수 있도록 허용
  • 프로세스가 공유 메모리 할당을 커널에 요청 -> 커널은 메모리 공간 할당
  • IPC 중에서 가장 빠른 방법

#5. Memory Map

  • Memory Map 처럼 메모리를 공유하는 점은 비슷
  • 차이점은 Memory Map의 경우 열린 파일을 메모리에 Mapping시켜서 공유함
  • 프로세스의 가상 메모리 주소 공간에 파일을 Mapping하고 이 주소에 직접 접근하는 것으로 파일 read/write를 대신함
  • OS에서 Paging 기법을 사용하여 파일의 내용을 관리
  • 파일로 대용량의 데이터를 공유할 때 사용
  • 대부분의 OS에서는 프로세스를 실행할 때 실행 파일의 각 Segment를 메모리에 Mapping하기 위해 사용

#6. Socket

  • 소켓 = 일반적으로 두 네트워크 프로그램 사이에서 데이터 입출력의 관문
  • TCP 연결 = Stream Socket
  • UDP 연결 = Datagram Socket
  • 다른 네트워크 뿐만 아니라 소켓을 생성한 두 프로세스가 같은 도메인에 있는 경우 프로세스간 통신 가능
  • 서버: bind, listen, accept 로 소켓 연결 준비
  • 클라이언트: connect로 연결 요청 후 send로 데이터 전송
  • 연결이 끝나면 close( )

#7. Semaphore

  • Semaphore는 데이터 전송 목적이 아님
  • 프로세스 간 사용되는 데이터를 동기화하고 보호하는데 목적을 둠
  • <과정>
    #1. Semaphore 생성
    #2. 임계 구역(Critical Section)* 잠금
    #3. 공유 자원 사용
    #4. 임계 구역 잠금 해제
    #5. Semaphore 제거

    📌 Critical Section (임계 구역)
    : 프로세스 간 공유 자원에 접근할 때 한 번에 하나의 프로세스만 이유하도록 다른 프로세스의 접근을 제한하는 영역

    👀 임계 구역 문제를 해결하기 위한 3가지 필요 조건

    1. 상호 배제 (Mutex: Mutual exclusion)
    : 한 프로세스가 임계 영역을 사용중이면 다른 프로세스는 접근 불가.

    2. 실행 (Process)
    : 임계 구역에서 실행중인 프로세스가 없을 때, 들어가려는 프로세스가 여러 개라면 현재 대기중인 프로세스만이 후보가 될 수 있고 어느 것이 들어갈지 결정해줘야 함.

    3. 한정 대기 (Bounded waiting)
    : 다른 프로세스의 기아(Starvation)를 방지하기 위해 한 번 임계 구역에 들어간 프로세스는 다음 번에 들어갈 때 제한을 두어야 함.

    ※ 임계구역 관련 내용은 방대해서 나중에 따로 올려야 할 것 같다.



# 요약표



Ref

https://namu.wiki/w/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EA%B0%84%20%ED%86%B5%EC%8B%A0
https://heeonii.tistory.com/13
https://minkwon4.tistory.com/295
https://12bme.tistory.com/287
https://ch4njun.tistory.com/121
https://nstgic3.tistory.com/entry/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%9D%B5%EB%AA%85-%ED%8C%8C%EC%9D%B4%ED%94%84anonymous-pipes
https://twpower.github.io/133-difference-between-redirect-and-pipe

profile
일모도원

0개의 댓글