파이프라인(유닉스)

Pipeline (Unix)
텍스트 터미널에서 실행되는 세 가지 프로그램 프로세스 파이프라인

Unix와 유사컴퓨터 운영 체제에서 파이프라인은 메시지 전달을 사용하는 프로세스 간 통신 메커니즘입니다.파이프라인은 각 프로세스(stdout)의 출력 텍스트가 입력(stdin)으로 다음 프로세스로 직접 전달되도록 표준 스트림에 의해 연결된 일련의 프로세스입니다.첫 번째 프로세스가 아직 실행 중이기 때문에 두 번째 프로세스가 시작되고 동시에 실행됩니다.파이프라인의 개념은 Unix의 개발 기간 동안 Unix의 조상인 Bell Labs에서 Douglas McIlroy가 주도하여 툴박스 [1][2]철학을 형성하였습니다.물리적 파이프라인에 비유하여 명명됩니다.이들 파이프라인의 주요 특징은 '내부 숨김'이다(Ritchie & Thompson, 1974년).이것에 의해, 시스템의 명확성과 심플함이 향상됩니다.

이 문서는 익명 파이프에 관한 것입니다.이 파이프에서는, 1개의 프로세스에 의해서 기입된 데이터가 operating system에 의해서 버퍼링 되어 다음 프로세스에 의해서 읽혀질 때까지, 이 단방향 채널은 프로세스가 완료하면 없어집니다.이것은 이름이 지정된 파이프와 다릅니다.이 파이프에서는 메시지를 파일로 하여 이름이 지정된 파이프와 주고받으며 프로세스가 완료된 후에도 유지됩니다.어나니머스 파이프의 표준 셸 구문은 여러 명령어를 세로 막대(일반 Unix 용어로는 "pipes")로 구분하여 나열하는 것입니다.

command1 command2 command3

예를 들어, 현재 디렉토리의 파일을 일람표시하는 경우)ls)는 문자열 "key"(http)를 포함하는 ls 출력 만 유지하고 결과를 스크롤 페이지(작은 페이지)로 표시합니다.사용자는 단말기의 명령줄에 다음 명령을 입력합니다.

ls -l grep 키 작음

명령어ls -l프로세스로서 실행되며 출력(stdout)은 프로세스의 입력(stdin)에 파이핑됩니다.grep key; 및 프로세스도 마찬가지입니다.less 프로세스는 이전 프로세스에서 입력을 받아 표준 스트림을 통해 다음 프로세스의 출력을 생성합니다.각각 는 오퍼레이팅시스템에 실장되어 있는 프로세스통신 메커니즘(파이프)에 의해 왼쪽 명령어의 표준 출력과 오른쪽 명령어의 표준 입력을 연결하도록 셸에 지시합니다.파이프는 단방향이며 데이터는 왼쪽에서 오른쪽으로 파이프라인을 통과합니다.

다음은 URL에 의해 나타나는 웹 리소스대해 일종의 철자 검사를 구현하는 파이프라인의 예입니다. 이 파이프라인의 기능에 대한 설명은 다음과 같습니다.

curl " https://en.wikipedia.org/wiki/Pipeline_(Unix) " sed 's / [^a - zA - Z ] / / g " tr " a - Z " " a - z \ n " sort - u comm - 23 - < ( / usr / share / share / words )적음
  1. curl 웹 페이지의 HTML 콘텐츠를 가져옵니다(사용할 수 있습니다).wget를 참조해 주세요).
  2. sed 는 (웹 페이지 내용에서) 공백이나 문자가 아닌 모든 문자를 공백으로 바꿉니다.(새로운 행은 유지됩니다).
  3. tr 는 모든 대문자를 소문자로 변경하고 텍스트 행의 공백을 줄바꿈으로 변환합니다(각 '워드'는 다른 행에 있습니다).
  4. grep 에는 알파벳 소문자가 적어도1개 포함되어 있는 행만 포함됩니다(공백한 행은 제외됩니다.
  5. sort '단어' 목록을 알파벳 순서로 정렬합니다.-u스위치가 중복을 삭제합니다.
  6. comm 두 파일 간의 공통 행을 찾습니다.-23는 두 번째 파일에 고유한 행과 두 개의 파일에 공통되는 행을 억제하고 이름이 지정된 첫 번째 파일에 있는 행만 유지합니다.-파일 이름 대신 원인comm(이 경우 파이프라인에서) 표준 입력을 사용합니다. sort /usr/share/dict/words의 내용을 분류하다words알파벳 순으로 철하다comm예기, 및<( ... )(프로세스 치환을 통해) 임시 파일에 결과를 출력합니다.comm읽기. 결과는 /usr/share/dict/words에 없는 단어(행) 목록입니다.
  7. less 를 사용하면 사용자는 결과를 페이지 표시할 수 있습니다.

명령줄 인터페이스의 파이프라인

널리 사용되는 모든 Unix 쉘에는 파이프라인 작성을 위한 특별한 구문 구조가 있습니다.모든 용도에서는 명령어를 ASCII 수직 막대 문자로 구분하여 순서대로 씁니다. (이 때문에, 「파이프 문자」라고 불리는 경우가 있습니다.셸은 프로세스를 시작하고 표준 스트림 간에 필요한 연결(일부 버퍼 스토리지 포함)을 준비합니다.

오류 스트림

기본적으로는 파이프라인 내 프로세스의 표준 오류 스트림("stderr")은 파이프를 통해 전달되지 않고 병합되어 콘솔로 전송됩니다.그러나 많은 셸에는 이 동작을 변경하기 위한 추가 구문이 있습니다.를 들어 csh 쉘에서는 &대신 에, 표준 에러 스트림도 표준 출력과 Marge 되어 다음 프로세스에 공급되는 것을 나타냅니다.또한 Bash 은 표준 오류를 병합할 수 있습니다. &버전 4.0 이후[3] 또는 사용2>&1다른 파일로 리다이렉트 할 수도 있습니다.

파이프밀

가장 일반적으로 사용되는 단순한 파이프라인에서 셸은 파이프를 통해 일련의 하위 프로세스를 연결하고 각 하위 프로세스 내에서 외부 명령을 실행합니다.따라서 셸 자체는 파이프라인을 통과하는 데이터를 직접 처리하지 않습니다.

단, 셸이 직접 가공을 수행할 수 있습니다.이후로, 이른바 제분소 또는 파이프밀을 사용합니다).while명령어는 첫 번째 명령어의 결과를 "밀링"하기 위해 사용됩니다.이 구조는 일반적으로 다음과 같습니다.

명령어를 읽는 동안 -r var1 var2...#  행을 var1, var2  # 해석된 변수를 사용하여 처리한다(이것은 서브셸일 있습니다.var1, var2 등은 루프가 종료된 후 #사용할 수 없습니다.zsh 최신 버전Korn 셸 등 일부 셸은 완료된 서브셸에서 파이프 # 연산자왼쪽에 명령어처리합니다).

루프 본체에 다음과 같은 명령어가 포함되어 있는 경우 이러한 파이프밀이 의도한 대로 작동하지 않을 수 있습니다.cat그리고.ssh에서 읽은 내용stdin: 루프의 첫 번째 반복에서는 이러한 프로그램(드레인이라고 부름)이 나머지 출력을 읽습니다.[4]command그러면 루프가 종료됩니다(드레인 내용에 따라 결과가 달라집니다).이 동작을 회피하는 방법에는 몇 가지가 있습니다.첫째, 일부 드레인에서는 판독을 비활성화하는 옵션이 지원됩니다.stdin(예:ssh -n) 또는 드레인에서 입력을 읽을 필요가 없는 경우stdin도움이 되는 일을 하면 줄 수 있다< /dev/null입력으로.

파이프의 모든 컴포넌트가 병렬로 실행되므로 셸은 일반적으로 내용을 처리하기 위해 하위 프로세스(하위 셸)를 포크하므로 외부 셸 환경에 변수 변경을 전파할 수 없습니다.이 문제를 해결하려면 대신 "파이프밀"을 명령어 대체가 포함된 문서에서 공급하면 됩니다. 이 문서는 파이프라인의 실행이 완료될 때까지 기다린 후 내용을 밀링합니다.또는 병행 실행을 위해 명명된 파이프 또는 프로세스 치환을 사용할 수 있다.GNU bash에는lastpipe옵션을 사용하여 마지막 파이프 [5]구성요소에 대한 포킹을 비활성화합니다.

프로그래밍 방식으로 파이프라인 생성

파이프라인은 프로그램 제어 하에 생성할 수 있습니다.유닉스pipe() 시스템 콜은 운영시스템에 새로운 어나니머스 파이프 오브젝트를 구축하도록 요구합니다.그 결과 파이프의 읽기 전용 끝과 쓰기 전용 끝이라는 두 개의 새로운 파일 기술자가 프로세스에서 열립니다.파이프 끝은 탐색 기능이 없다는 점을 제외하고 일반 익명 파일 설명자로 보입니다.

교착 상태를 방지하고 병렬 처리를 이용하기 위해 하나 또는 여러 개의 새로운 파이프를 가진 Unix 프로세스는 일반적으로 호출합니다.fork()새로운 프로세스를 만듭니다.그런 다음 각 공정은 데이터를 생성하거나 소비하기 전에 사용하지 않을 파이프의 끝을 닫습니다.또는 프로세스가 스레드를 생성하고 파이프를 사용하여 스레드 간에 통신할 수 있습니다.

명명된 파이프를 생성할 수도 있습니다.mkfifo()또는mknod()프로그램 호출 시 입력 또는 출력 파일로 표시됩니다.멀티패스 파이프를 생성할 수 있으며 표준 에러 리다이렉트 또는 와 조합할 때 특히 효과적입니다.tee.

실행

대부분의 Unix 유사 시스템에서는 파이프라인의 모든 프로세스가 동시에 시작되고 스트림이 적절히 연결되어 기계에서 실행되는 다른 모든 프로세스와 함께 스케줄러에 의해 관리됩니다.다른 파이프 실장과는 다른 Unix 파이프를 설정하는 중요한 측면은 버퍼링 개념입니다.예를 들어, 송신 프로그램은 초당 5000 바이트를 생성할 수 있으며 수신 프로그램은 초당 100 바이트만 수신할 수 있지만 데이터는 손실되지 않습니다.대신에, 송신 프로그램의 출력은 버퍼에 보관 유지됩니다.수신 프로그램이 데이터를 읽을 준비가 되면 파이프라인의 다음 프로그램이 버퍼에서 읽힙니다.버퍼가 가득 차면, 송신 프로그램은 수신기에 의해서 버퍼로부터 적어도 몇개의 데이터가 삭제될 때까지 정지(차단)된다.Linux의 경우 버퍼 크기는 65,536바이트(64KiB)입니다.필요에 따라 더 큰 버퍼를 제공하기 위해 bfr이라는 오픈소스 서드파티 필터를 사용할 수 있습니다.

네트워크 파이프

넷캣이나 소캣 등의 툴은 파이프를 TCP/IP 소켓에 연결할 수 있습니다.

역사

파이프라인 개념은 Douglas McIlroy[6] 의해 발명되었으며 버전 3 [7]Unixman 페이지에 처음 설명되어 있습니다.McIlroy는 대부분의 시간 명령 셸이 한 프로그램에서 다른 프로그램으로 입력으로 출력 파일을 전달한다는 것을 알게 되었습니다.

의 아이디어는 1973년에 실행되었는데, 이때 켄 톰슨은 다음과 같이 덧붙였다.pipe()버전 3 Unix의 셸 및 여러 유틸리티에 대한 시스템 호출 및 파이프 연결."다음 날," 맥일로이는 "모든 사람들이 배관공사의 흥분에 동참하면서 잊을 수 없는 한 줄타기꾼들의 흥분을 목격했다."고 계속했다.매킬로이는 또한 톰슨에 대한 공로를 인정한다. 버전 [8][7]4에서는 파이프 구문에 대한 설명이 대폭 간소화되었습니다.

Unix 파이프는 독립적으로 개발되었지만 1960년대에 Ken Lochner가 Dartmouth Time Sharing [10]System을 위해 개발한 '통신 파일'과 관련이 있으며, 그 이전에도 존재했습니다.

Tony Hoare의 통신 순차 프로세스(CSP)에서는 McIlroy의 파이프가 더욱 [11]개발되었습니다.

파이프라인 컨셉을 사용하여 반복 명령어를 함께 연결시키는 AppleAutomator 아이콘에 있는 로봇은 원래 Unix 컨셉에 경의를 표하기 위해 파이프를 들고 있습니다.

기타 운영 체제

Unix의 기능은 VM/CMS MVS 상의 MS-DOSCMS 파이프라인 패키지 등 다른 운영체제에 의해 차용되어 최종적으로 소프트웨어 엔지니어링의 파이프필터 설계 패턴으로 지정되게 되었습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Mahoney, Michael S. "The Unix Oral History Project: Release.0, The Beginning". McIlroy: It was one of the only places where I very nearly exerted managerial control over Unix, was pushing for those things, yes.
  2. ^ "Archived copy". cm.bell-labs.com. Archived from the original on 8 May 1999. Retrieved 22 May 2022.{{cite web}}: CS1 maint: 제목으로 아카이브된 복사(링크)
  3. ^ "Bash release notes". tiswww.case.edu. Retrieved 2017-06-14.
  4. ^ "Shell Loop Interaction with SSH". 6 March 2012. Archived from the original on 6 March 2012.
  5. ^ John1024. "How can I store the "find" command results as an array in Bash". Stack Overflow.
  6. ^ "The Creation of the UNIX Operating System". Bell Labs. Archived from the original on September 14, 2004.
  7. ^ a b McIlroy, M. D. (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (Technical report). CSTR. Bell Labs. 139.
  8. ^ https://www.linfo.org/pipe.html 파이프: Linux Information Project(LINFO)의 개요
  9. ^ https://www.cs.rit.edu/~swm/history/DTS.doc[베어 URL DOX/DOCX 파일]
  10. ^ "Archived copy". cm.bell-labs.com. Archived from the original on 20 February 1999. Retrieved 22 May 2022.{{cite web}}: CS1 maint: 제목으로 아카이브된 복사(링크)
  11. ^ https:https://swtch.com/~rsc/bell/bell 과 CSP 스레드 (Russ Cox)

외부 링크