본문 바로가기
컴퓨터공학기초 개념/운영체제

19. 프로세스 - IPC 기법(파일, 파이프)

by devraphy 2021. 4. 22.

- IPC 기법을 온전히 이해하기 위해서는 코드를 기반한 이해가 가장 적합하다. 

- 이를 위해서는 C언어 기반의 지식을 알고 있어야 하고, 실제로 IPC 기법을 구현한 코드를 이해하기는 그 복잡성으로 인해 쉽지않다. 

- 그러므로 이번 포스팅에서는 각 IPC 기법의 특징과 개념을 이해하는 것에 중점을 두자.  

 

1. File 사용 기법

  • shared.txt와 같은 파일에 현재 커널 영역의 상태 정보를 기입한다.
  • 통신이 필요한 프로세스의 상태정보를 알기위해 shared.txt 파일을 읽고 확인하다. 
  • 이 과정을 반복한다. 

 

a) File 사용기법을 잘 사용하지 않는 이유

  • 프로세스에서 통신이 필요할 때마다 매번 shared.txt 파일을 읽어야 한다. 
  • 프로세스의 커널 영역의 상태정보가 변할 때마다 해당 파일을 update 해야한다. 
  • 그러므로 시간이 오래 걸린다. 

 


2. 파이프 기법

  • fork() 메소드를 이용해 자식 프로세스를 만들었을 때, 부모와 자식 프로세스 간의 통신을 위해 사용하는 기법
  • 단방향 통신이 특징이다. 

 

a) fork() 메소드란?

  • 시스템 콜의 한 종류
  • 어떤 프로세스를 복제하여 자식 프로세스를 만드는 기능 

 

 

b) 파이프 통신의 예시

 

 

c) 파이프 코드 예제를 통한 이해

char * msg = "Hello Child Process!";
int main()
{
    char buf[255]; 
    // 아래에서 부모 프로세스에서 입력된 msg의 값이 buf라는 문자열에 넘어간다. 
    
    int fd[2], pid, nbytes; 
    // fd라는 배열의 크기를 반드시 2(= fd[0], fd[1])로 지정해야 한다. 
    
    if (pipe(fd) < 0) // pipe(fd)로 파이프를 생성한다. 
        exit(1);
    
    pid = fork(); // 부모 프로세스를 기반으로 자식 프로세스 생성 
    
    if (pid > 0) { // pid = process id
    // 부모 프로세스는 pid가 0보다 크고, 자식프로세스의 pid는 0이다.
    
        write(fd[1], msg, MSGSIZE);  
        // write라는 시스템 콜을 이용한다.
        // 부모 프로세스에서는 코드(=msg)를 작성(write)만 할 수 있다.
        // 반드시 fd[1] 배열에 작성해야 한다. 
        
        exit(0);
    }
    
    else { // 자식 프로세스의 경우 = 자식프로세스의 pid는 0이기 때문
        
        nbytes = read(fd[0], buf, MSGSIZE);
        // read 라는 시스템 콜을 사용한다. 
        // 자식 프로세스에서는 부모 프로세스에 있는 코드를 읽기(read)만 가능하다.
        // 반드시 fd[0]을 호출해야 부모 프로세스에서 작성된 코드를 읽을 수 있다. 
        // 부모 프로세스에서 fd[1]에 담긴 내용(= msg)을 자식 프로세스의 fd[0]에 buf를 통해 읽을 수 있다. 
        // 자식 프로세스가 부모 프로세스의 코드를 읽는 이 시점에서 통신이 구현되는 것이다. 
        
        printf("%d %s\n", nbytes, buf);
        exit(0);
    }
    return 0;
 }
        
    

 

 

d) 파이프 기법 요약

  • 부모 프로세스는 fd[1]과 write()라는 시스템 콜을 이용하여 프로세스 내부의 코드를 작성할 수 있다. 
  • 자식 프로세스는 fd[0]과 read()라는 시스템 콜을 이용하여 부모 프로세스의 코드를 읽어올 수 있다.
  • 자식 프로세스에서 부모 프로세스의 코드르 읽어오는 그 지점이 통신이 이루어지는 시점이다. 
  • 파이프 기법이 단방향 통신인 이유는 부모 프로세스는 작성(write)만, 자식 프로세스는 읽기(read)만 할 수 있기 때문이다. 
  • 부모 프로세스에서 자식 프로세스로 전달되는 내용 또는 데이터는 커널영역 어딘가에 존재한다. 

댓글