베어_
TechBear
베어_
전체 방문자
오늘
어제
  • 분류 전체보기 (336)
    • Spring (33)
      • 개념 (13)
      • Security (5)
      • 실습 (1)
      • 토비 스프링 (11)
    • JPA (6)
    • 프로젝트 기록 (24)
    • DB (13)
    • JAVA (18)
    • 알고리즘 (50)
      • 유형정리 (8)
      • Baekjoon (21)
      • LeetCode (18)
    • 디자인패턴 (0)
    • 개발서적 (79)
      • Effective Java (78)
      • 객체지향의 사실과 오해 (1)
    • 독후감 (4)
    • 보안 (2)
    • 운영체제(OS) (53)
      • 공룡책 (53)
    • 컴퓨터 네트워크 (28)
      • 컴퓨터 네트워크 하향식 접근 (23)
    • 자료구조 (1)
    • DevOps (2)
    • 앱 개발 (20)
      • 안드로이드 스튜디오 (20)

블로그 메뉴

    공지사항

    인기 글

    태그

    • 백준
    • dfs
    • BFS
    • C++
    • 자바
    • 자바8
    • 스프링시큐리티
    • 스프링
    • 이펙티브자바
    • java
    • 코드업
    • 데이터베이스
    • leetcode
    • 스레드
    • 함수형인터페이스
    • Spring
    • 운영체제
    • 알고리즘
    • 토비스프링
    • jpa

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    베어_

    TechBear

    [운영체제] 파이프
    운영체제(OS)/공룡책

    [운영체제] 파이프

    2021. 3. 29. 13:24

    [파이프]

    파이프는 두 프로세스가 통신할 수 있는 통로이다.

     

    [일반 파이프]

    일반 파이프는 생산자-소비자 형태로 두 프로세스 간의 통신을 허용한다.

    생산자는 파이프희 한 종단(쓰기 종단)에 쓰고, 소비자는 다른 종단(읽기 종단)에서 읽는다. 결과적으로 일반 파이프는 한쪽으로만 데이터를 전송할 수 있는 단방향 통신이다.

     

    UNIX 시스템에서는 일반 파이프는 pipe(int fd[]) 함수를 사용하여 구축된다.

    cf ) fd[0]은 읽기 종단, fd[1]은 쓰기 종단으로 동작한다.

    자식, 부모 모두 처음에 자신들이 사용하지 않는 파이프의 종단을 닫아야 한다.

     

    파이프를 생성한 후에는 read()와 write() 시스템 콜을 사용하여 접근할 수 있다.

    일반 파이프는 파이프를 생성한 프로세스 이외에는 접근을 할 수 없기 때문에 통상 부모 프로세스가 파이프를 생성하고 fork()로 생성한 자식 프로세스와 통신하기 위해 사용한다.

     

    Windows 시스템의 일반 파이프는 익명 파이프라고 불리며 UNIX의 일반 파이프와 유사하게 동작한다.

    파이프의 읽기와 쓰기는 보통 Read-File()과 WriteFile()을 사용하여 이루어진다. 파이프는 CreatePipe()함수로서 4개의 매개변수를 전달 받는다. (책 159p참고)

     


    [지명 파이프]

    일반 파이프는 프로세스들이 통신을 마치고 종료하면 일반 파이프는 없어지게 되고 부모-자식 관계여야만 하는 등 제약 조건들이 많다. 

     

    반대로 지명 파이프는 양방향 통신이 가능하며, 부모-자식 관계도 필요로 하지 않는다(동일한 기계 내에는 존재해야 한다.) 일단 지명 파이프가 구축되면 여러 프로세스들이 이를 사용하여 통신할 수 있다.

     

    UNIX에서 지명 파이프는 FIFO라고 불린다. mkfifo() 시스템 콜을 이용하여 파이프를 생성하고 open(),  read(), write(), close() 시스템 콜로 조작한다.

     

    Windows에서는 CreateNamePipe()함수를 사용하여 생성되고 클라이언트는 ConnectNamedPipe()함수를 사용하여 지명 파이프에 연결할 수 있다. 지명 파이프를 통한 통신을 위해 ReadFile()과 WriteFile()함수를 사용할 수 있다.

     

     

     

     

      '운영체제(OS)/공룡책' 카테고리의 다른 글
      • [운영체제] 원격 프로시저 호출(RPC)
      • [운영체제] 소켓
      • [운영체제] Mach 메세지 전달
      • [운영체제] POSIX 공유 메모리
      베어_
      베어_
      Today I learned | 문제를 해결하는 개발자

      티스토리툴바