IPC(Inter-Process Communication): 프로세스간 데이터를 공유하기 위한 방법.

 

프로세스 내부 데이터 통신: 프로세스 내 스레드 간 통신→ 스레드는 전역변수나 파일을 이용하여 데이터를 공유

프로세스 간 데이터 통신: 같은 컴퓨터(동일 호스트)에 있는 프로세스간 통신→ 공용 파일 또는 운영체제가 제공하는 자원을 이용

네트워크를 이용한 데이터 통신: 여러 컴퓨터가 네트워크로 연결되어 있을 때 통신→ 소켓을 이용한 데이터 공유

 

 

방향성에 따른 분류

 

단방향 통신(simplex communication): 한쪽 방향으로만 데이터를 전송할 수 있는 구조. 대표적으로 파이프(PIPE) 기법이 있음.

양방향 통신(duplex communication): 데이터를 동시에 양쪽 방향으로 전송할 수 있는 구조. 대표적으로 소켓 통신이 있음.

반양방향 통신(half-duplex communication): 특정 시점에 한쪽 방향으로만 전송할 수 있는 구조.(동시전송불가) 대표적으로 메시지 큐, 공유 메모리가 있음.

 

동시성에 따른 분류

 

대기가 있는 통신: 동기화를 지원하는 통신 방식. 데이터를 받는 쪽은 데이터가 도착할 때까지 자동 대기 상태(블록킹, blocking)

대기가 없는 통신: 동기화를 지원하지 않는 통신 방식. 다른 작업을 하는 중에 데이터가 수신되면 처리(인터럽트 처리방식, 폴링 처리방식)

 

IPC 기법

 

시그널(signal): 운영체제는 프로세스를 관리하기 위한 시그널을 정의함. 시그널을 수신한 프로세스는 그에 맞는 행위를 수행함.

 

인터럽트(interrupt): 이벤트 발생에 따른 처리를 위한 방식. 프로세스가 동작 중 인터럽트가 발생하면 해당 기능을 수행.

공유 파일: 서로 다른 프로세스가 동일한 파일을 공유하여 사용하는 방식. 프로세스 처리 성능은 기록 장치의 읽기, 쓰기 속도에 영향을 받음.

 

예시

  • fd=open("file.txt", O_RDWR): 파일 열기, 파일 기술자(fd)를 리턴
  • write(fd,"TEST",5): 파일 쓰기
  • read(fd, buf, 5): 파일 읽기
  • close(fd): fd가 가리키는 파일을 닫음.

 

 

순차 파일(sequential file): 아무리 큰 파일이라도 파일 내 데이터는 개념적으로 한 줄로 저장.

파일 기술자(File Descriptor, fd): 열린 파일이나 다른 입출력 자원을 가리키는 정수 값.

역할: 프로그램이 파일, 소켓, 파이프 등 다양한 입출력 자원에 접근할 때, 운영체제는 각 자원에 고유한 파일 기술자를 할당함. → 프로그램은 이 파일 기술자를 사용하여 해당 자원에 데이터를 읽고 쓰거나 제어하는 등의 작업을 수행함.

특징

  • open()함수로 파일을 열면 파일 기술자 fd를 얻음
  • 파일 접근 권한 외에 현재 파일의 어느 위치를 읽고 있는지에 대한 정보 보관
  • 파일에서 파일 기술자는 단 하나
  • 처음 파일이 열리면 파일 기술자는 맨 앞에 위치함
  • 파일을 읽거나 쓰면 파일 기술자는 계속 전진함

 

파이프(PIPE): 한 프로세스의 출력을 다른 프로세스의 입력으로 연결해주는 역할. 데이터가 한 방향으로 흐르는 단방향 통신 채널을 제공함.

 

특징

  • 단방향 통신: 파이프는 한쪽 끝에서 데이터를 쓰고, 다른 쪽 끝에서 데이터를 읽는 단방향 통신을 지원함.
  • 부모-자식 관꼐 프로세스 간 통신: 부모 프로세스가 생성하고, fork() 시스템 호출을 통해 생성된 자식 프로세스와 통신하는데 사용됨.
  • 버퍼: 파이프는 내부적으로 버퍼를 가지고 있어 데이터를 임시로 저장함.
  • 동기화: 파이프는 읽기/쓰기 작업 시 동기화를 제공하여 데이터 손실이나 경쟁 상태를 방지함.

#include <stdio.h>
#include <unistd.h>

int main() {
    int pid, fd[2];
    char buf[5];

    if (pipe(fd) == -1) exit(-1);   // 파이프 생성
    pid = fork();                   // 자식 프로세스 생성

    if (pid < 0) exit(-1);          // fork 실패 시 종료
    else if (pid == 0) {            // 자식 프로세스
        close(fd[0]);               // 읽기 닫음 (자식은 쓰기만 함)
        write(fd[1], "Test", 5);    // "Test" 문자열 쓰기
        close(fd[1]);               // 쓰기 종료
    }
    else {                          // 부모 프로세스
        close(fd[1]);               // 쓰기 닫음 (부모는 읽기만 함)
        read(fd[0], buf, 5);        // 파이프로부터 읽기
        printf("%s\n", buf);        // 읽은 데이터 출력
        close(fd[0]);               // 읽기 종료
    }

    return 0;
}

 

 

메시지큐: 큐(queue) 방식으로 데이터를 접근.

 

특징

  • 큐는 행위에 따라 En-queue(큐에 데이터를 삽입)와 De-queue(큐에서 데이터를 추출)로 분류
  • 양방향, 비동기 방식
  • 부모-자식 간의 프로세스가 아니더라도 프로세스 간 메시지 송수신 가능함

 

공유 메모리: 운영체제에서 별도로 할당해준 공유 영역 활용하는 방식. 각 응용 프로그램을 해당 영역 포인터로 접근. (공유 메모리 확인 명령: ipcs/ 자원 생성: ipcmk/ 자원 삭제: ipcrm)

 

소켓: 여러 컴퓨터에 있는 프로세스끼리 통신하는 방법. 네트워크 소켓은 컴퓨터 네트워크를 공유하는 프로세스 간의 통신.

종류(socket()의 옵션)

  • PF_LOCAL: 같은 호스트 내 프로세스 간 통신
  • PF_INET: 인터넷을 통한 다른 호스트 통신(ipv4)
  • PE_INET6: 인터넷을 통한 다른 호스트 통신(ipv6)

 

 

임계구역(critical section): 둘 이상의 프로세스(또는 스레드)가 동시에 접근하면 안되는 공유자원(데이터, 메모리 등)을 접근하는 코드 영역.

 

해결법

1. 상호 배제(mutual exclusion): 한 프로세스가 임계 구역에 들어가면 다른 프로세스는 임계구역에 들어 갈 수 없음.

2.한정 대기(bounded waiting): 어떤 프로세스도 무한 대기(infinite postpone)하지 않아야 함.

3.진행의 융통성(progress flexibility): 한 프로세스가 다른 프로세스의 진행을 방해해서는 안됨.

 

데커 알고리즘

 

특징

  • 두 개의 프로세스가 임계구역에 동시에 진입하지 않도록 보장.
  • 최초의 소프트웨어 기반 상호 배제 알고리즘 중 하나.
  • 플래그와 turn 변수를 사용함.
  • 서로 양보하거나 대기하면서 임계구역 진입을 조절함.
flag[0] = true;         // 나 들어갈래!
while (flag[1]) {       // 상대도 들어가고 싶다면
    if (turn != 0) {    // 내 차례가 아니면
        flag[0] = false;
        while (turn != 0);  // 차례 올 때까지 대기
        flag[0] = true;
    }
}
// → 여기서 임계구역 진입
...
turn = 1;               // 상대 차례 줌
flag[0] = false;        // 나 이제 안 들어갈래

 

장점: 상호배제, 진행, 한정 대기 모두 만족함.

단점: 구현 복잡, CPU 명령어 수준에서 완벽히 구현하려면 까다로움.

 

피터슨 알고리즘

 

특징

  • 데커 알고리즘을 단순화한 형태.
  • 여전히 두 개의 프로세스만을 위한 알고리즘.
flag[0] = true;      // 나 들어갈래!
turn = 1;            // 상대에게 양보할게
while (flag[1] && turn == 1);  // 상대도 들어가고 싶고, 내 차례 아니면 기다려
// → 임계구역 진입
...
flag[0] = false;     // 나 이제 안 들어갈래

 

장점: 매우 간단, 상호 배제 조건 만족. 교착상태 없이 공정함.

 

세마포어(semaphore): 프로세스가 임계구역에 진입하기 전에 스위치를 사용 중으로 놓는 것.

  • 후에 도착하는 프로세스는 앞의 프로세스가 작업을 마칠 때까지 기다림.
  • 프로세스가 작업을 마치면 세마포어가 다음 프로세스에 임계구역을 사용하라는 동기화 신호를 보냄.

내부코드

  • Semaphore(n) : 전역 변수 RS를 n으로 초기화, RS에는 현재 사용 가능한 자원의 수 저장
  • P() : 잠금을 수행하는 코드로 RS가 0보다 크면(사용 가능한 자원이 있으면) 1만큼 감소시키고 임계구역에 진입, RS가 0보다 작으면(사용 가능한 자원이 없으면) 0보다 커질 때까지 기다림
  • V() : 잠금 해제와 동기화를 같이 수행하는 코드로, RS 값을 1 증가시키고 세마포어에서 기다리는 프로세스에게 임계구역에 진입해도 좋다는 wake_up 신호를 보냄

모니터(monitor): 공유 자원을 내부적으로 숨기고 공유 자원에 접근하기 위한 인터페이스만 제공해 자원을 보호하고 프로세스 간의 동기화를 시킴. (자원을 숨기고 인터페이스만 제공하는 시스템 호출과 같은 개념)

 

작동원리

  1. 임계구역으로 지정된 변수나 자원에 접근하려는 프로세스는 직접 P()나 V()를 사용하지 않고 모니터에 작업 요청
  2. 모니터는 요청받은 작업을 모니터 큐에 저장 후 순서대로 처리하고 결과만 해당 프로세스에 알려줌.

 

 

'2025-1 > 운영체제' 카테고리의 다른 글

06. 교착상태  (0) 2025.04.13
04. CPU 스케줄링  (0) 2025.04.12
03. 프로세스와 스레드  (0) 2025.03.22
02. 컴퓨터시스템 구조와 성능 향상  (0) 2025.03.22
01. 커널과 인터페이스  (0) 2025.03.12

+ Recent posts