[OS] 04. IPC(Inter-Process Communication)

nick·2024년 3월 21일

OS

목록 보기
4/4

1. Inter-Process Communication

✅ 2가지 유형의 프로세스

  • 각 process마다 address space가 존재하고 기본적으로 다른 프로세스의 address space에 접근하지 못함 (IPC 매커니즘을 통해서만 가능)
  1. Independent Process
    • 독립 프로세스는 다른 프로세스의 실행에 영향을 받지 않음
  2. Cooperating Process
    • 협력 프로세스는 다른 프로세스에 영향을 주거나 받을 수 있다

✅ IPC란?

  • 프로세스가 서로 통신하고 작업을 동기화할 수 있도록 하는 메커니즘

  • 이런 커뮤니케이션을 프로세스 간의 협력 방법으로 볼 수 있다.

  • sharing data를 통해 서로 통신할 수 있음

2. Signal

  • hardware가 신호를 탐지하면 해당 handler가 처리하듯이 software 적으로도 외부에서 signal을 날리면 이 signal에 대한 handler 처리하는 방식을 구현해보자!

  • 즉, 특정 이벤트를 알려주기 위한 프로세스 간의 커뮤니케이션 방식이다

  • A process -> B process에게 signal을 보낼 수 있음

    • 각 signal을 처리하는 handler가 존재함
  • software interrupt라고 볼 수 있음

3. Pipes

  • 두 개의 process가 마치 pipe가 연결된 것처럼 작동되게 하는 것
  • IPC 매커니즘 중 하나 = 프로세스 간의 통신하는 방법 중 하나

✅ 구분

- unidirectional pipe (단방향)

  • data가 한 방향으로만 흐르는 pipe

- bidirectional pipe (양방향)

  • half-duplex : 양쪽으로 흐를 수는 있지만, 동시에 양쪽으로 흐를 순 없다 (특정 시점에서는 항상 단방향으로 흐른다)
  • full-duplex : 동시에 양쪽으로 흐를 수 있다

✅ pipe 종류 2가지

1. ordinary pipe

  • child - parent 프로세스 관계에서만 pipe 열 수 있음
  • unidirectional하다
  • parent에서 write하면 child에서 읽을 수 있는 구조
  • 우리는 이 ordinary pipe만 알아볼거임

2. named pipe

  • child - parent 프로세스가 아니더라도 가능한 파이프
  • bidirectional하다

✅ Ordinary pipe 활용 예시

File descriptor

  • OS에게 file을 주고 우린 file descriptor만 받아와서 이 값만 가지고 file을 처리한다
int fd = open("my_file", "r");
write(fd, "this data", strlen(buffer));
int sockfd = socket(AF_INET, SOCK_STREAM, ...);
close(sockfd);
  • int fd : file이나 기타 IO 리소스에 접근하는데 사용되는 고유한 식별자. 즉, my_file 열고 그 내용을 fd가 보유
  • 어떻게 int 값이 file의 내용을 가지고 있냐?
    • OS가 알아서 처리해주고 그 식별자(숫자)를 할당해주는 것 -> 이런걸 OS가 추상화 해준다라고 이해하면 된다
  • 만약 parent를 fork하면 file descriptor도 그대로 child에게 복사된다
IntegerName<unistd.h>
0Standard inputSTDIN_FILENO
1Standard outputSTOUT_FILENO
2Standard errorSTDERR_FILENO

Ordinary Pipe in Linux

  • pipefd[0] : read 용
  • pipefd[1] : write 용
  • pipefd[1]을 통해 write하면 pipefd[0]을 통해 read 할 수 있다
    • 중간에서 OS가 write한 내용을 buffering 해준다
    • 실제 파일에 쓰고, 그걸 읽는게 아니라 buffer를 통해 읽고 쓰는 것
  • 이렇게 Ordinary pipe를 통해 하나의 process에서는 write하고 이걸 다른 process에서 read가 가능해진다

self quiz 링크
https://overjoyed-goldfish-618.notion.site/f81e3c203cff4bfcb5841da8e9bfbc02?pvs=4

profile
티스토리로 이전 : https://andantej99.tistory.com/

0개의 댓글