유닉스 파이프의 정확한 독창성은 무엇입니까


52

Douglas Mcllroy가 어떻게 그 개념을 생각 해냈고 Ken Thompson이 어떻게 하룻밤에 그것을 구현했는지에 대한 이야기를 들었습니다.

내가 이해하는 한 파이프는 하나의 프로세스가 쓰고 다른 프로세스가 읽는 두 프로세스간에 메모리를 공유하는 시스템 호출입니다.

OS 내부 또는 개념에 익숙하지 않은 사람으로서 이야기에서 "천재"가 정확히 무엇인지 궁금했습니다. 메모리를 공유하는 두 프로세스의 아이디어입니까? 아니면 구현입니까? 아니면 둘다?

추신 : 파이프의 유틸리티 또는 셸에서 파이프를 사용하는 방법을 알고 있습니다. 문제는 개념과 구현에 관한 것입니다.|


4
그 초기에는 애플리케이션을 구성하는 메커니즘을 구현하도록 강요하는 것이 상당히 급진적이었다고 생각합니다. 그러기 위해서는 인터페이스와 구현을 분리하는 개념이 잘 정립되어 있어야하며 프로그래밍에서 기능 구성의 유용성을 알아야합니다.
Chan Chan Ho

4
이미 실행중인 응용 프로그램에는 표준 입력 핸들과 표준 출력 핸들이 있었으며 Unix와 유사한 운영 체제 API에는 이러한 핸들에 적용 할 읽기 / 쓰기 기능이있었습니다. 직교적이고 능력이 뛰어난 몇 가지 개념 (핸들, 출력 및 입력)을 영리하게 사용하면 파이프뿐만 아니라 소켓, 문자-장치-상호 작용 및 수십 가지의 다른 요소로 연결됩니다. 이제 파일 핸들 (키보드 입력 및 텍스트 출력을 제공하는 tty 용)이 있으므로 응용 프로그램을 작성하여 한 응용 프로그램이 다른 응용 프로그램의 tty가되도록합니다.
워렌 P

6
@WarrenP 사실 유닉스 표준 입력과 표준 출력있어 때문에pipe() 콜 및 |쉘 연산자 (: REF 위권에 드는 맥 킬로을 ). 또는 Voltaire가 말했듯이 " [stdio]가 존재하지 않는다면 [it]을 발명해야합니다. ":-)
Ross Patterson

파이프 후까지 파일 핸들과 출입 핸들이 없었습니까?
워렌 P

4
@ WarrenP : Patterson이 말하는 것처럼 들립니다. 먼저 파일 핸들이있었습니다. 그런 다음이 사람들은 기본적으로 각 프로그램에 입력 핸들과 출력 핸들이 있다는 아이디어를 얻었습니다. 이를 "표준"입력 / 출력이라고합니다.
Mooing Duck

답변:


109

내가 이해하는 한 파이프는 하나의 프로세스가 쓰고 다른 프로세스가 읽는 두 프로세스간에 메모리를 공유하는 시스템 호출입니다.

실제로는 공유 메모리가 없습니다. 리더와 라이터는 주소 공간의 일부를 공유하지 않으며 명시적인 동기화를 사용하지 않습니다.

읽기 및 쓰기 프로세스는 파일을 읽거나 파일을 쓸 때 read동일한 방식 으로 write시스템 호출 을 수행합니다. 그것은 천재입니다 ... 혁신 : (간단한) 프로세스 간 통신과 파일 I / O가 같은 방식으로 응용 프로그램 프로그래머와 사용자의 관점에서 처리 될 수 있다는 개념입니다.

파이프가 설정되면 OS (응용 프로그램 코드 또는 사용자 공간의 라이브러리 아님)가 버퍼링 및 조정을 처리합니다. 투명하게.


반대로 파이프 개념을 발명하기 전에 "파이프 라인"처리를 수행해야하는 경우 일반적으로 파일에 하나의 응용 프로그램 쓰기 출력을 생성 한 다음 완료되면 두 번째 응용 프로그램을 실행하여 파일.

또는 진정한 파이프 라인을 원한다면 두 응용 프로그램을 모두 코딩하여 (실제) 공유 메모리 세그먼트를 설정하고 세마포어 (또는 무언가)를 사용하여 읽기 / 쓰기를 조정할 수 있습니다. 복잡하고 결과적으로 자주 수행되지 않습니다.


34
"이것은 천재입니다. 혁신 : 프로세스 간 통신과 파일 I / O를 같은 방식으로 처리 할 수 ​​있다는 개념"– 바로 이것입니다. 그것은 당신이 그것을 갖도록 설계되지 않은 프로그램들 사이에서 프로세스 간 통신을 할 수있게하며, 무슨 일이 일어나고 있는지조차 알 필요가 없습니다.
Guntram Blohm 님이

6
IPC에 파일 I / O를 사용하는 이유는 Unix가 텍스트 처리를 위해 설계 되었기 때문에 주로 유용 했습니다. 프로그램에서 프로그램으로 텍스트 데이터를 스트리밍하여 상대적으로 고통이없는 구성을 가능하게하여 전체 시스템을 구축 할 수있었습니다. 비교적 간단한 작은 프로그램으로, 아마도 긴 작업 체인에서 데이터를 서로 스트리밍 할 수 있습니다. 기본적으로 텍스트 처리를 처리하기 위해 비교적 유연한 언어 를 사용했습니다.
Luaan

1
따라서 "유닉스 파이프의 단일성"은 "유닉스의 단일성"입니다. 모든 I / O (프로세스 간 통신, 표준 파일 및 나머지 파일 시스템 객체 포함)는 파일로 처리됩니다.
Mark Hurd

천재의 또 다른 획은 유닉스가 모든 바이트가 계산 될 때 사람이 읽을 수있는 파일 구조를 옹호했다는 것입니다.
EvertW

14

제 생각에 "파이프"라는 아이디어의 천재는 사용의 단순성입니다.

시스템을 호출하거나 메모리를 할당 할 필요가 없으며 전혀 복잡하지 않습니다. 쉘에서는 단일 문자를 사용합니다 |. 이를 통해 주어진 작업에 간단한 (또는 복잡한) 도구를 결합하여 특별한 힘을 얻을 수 있습니다.

텍스트를 깔끔하게 정렬하는 것과 같은 일상적인 작업을 수행하십시오. 전체 이름을 나열하는 명령이있을 수 있습니다. (이 예제에서는 listofrandomnames.com에서 제공 한 여러 이름이 포함 된 파일을 사용하겠습니다.) 파이프를 사용하면 다음과 같은 작업을 수행 할 수 있습니다.

$ cat names.txt
Sally Weikel
Dana Penaflor
Christine Hook
Shaneka Flythe
Almeda Crook
Freddie Lindley
Hester Kersh
Wanda Ruse
Megan Mauzy
Samuel Mancha
Paris Phipps
Annika Accardo
Elena Nabors
Caroline Foti
Jude Nesby
Chase Gordy
Carmela Driggers
Marlin Ostendorf
Harrison Dauber
$ cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100
Accardo, Annika     Hook, Christine     Ostendorf, Marlin
Crook, Almeda       Kersh, Hester       Penaflor, Dana
Dauber, Harrison    Lindley, Freddie    Phipps, Paris
Driggers, Carmela   Mancha, Samuel      Ruse, Wanda
Flythe, Shaneka     Mauzy, Megan        Weikel, Sally
Foti, Caroline      Nabors, Elena
Gordy, Chase        Nesby, Jude

이것은 하나의 예일뿐입니다. 수천이 있습니다. 파이프를 사용하여 훨씬 쉽게 수행 할 수있는 몇 가지 다른 특정 작업은 이 페이지의 "유닉스 철학"섹션을 참조 하십시오 .


이 답변에 밑줄을 긋기 위해서는 프레젠테이션 의 슬라이드 4에서 9 까지 "Zsh가 쉘보다 더 차가운 이유" 를 참조하십시오 .


위의 명령에는 UUOC가 포함되어 있음을 알고 있습니다. 텍스트를 생성하는 임의의 명령에 대한 자리 표시 자이므로 서 두었습니다.


3
작은 작은 메모 : 더 빨리 sort -u일을 할 수 있습니다 sort | uniq.
Iwillnotexist Idonotexist 0시 18 분

cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100당신은 그것에 익숙 할지도 모르지만, 나는 그것을 간단하게 부르지 않을 것입니다. 특히 awk부분.
Federico Poloni

파이프는 간단합니다. "... 주어진 작업 에 간단한 (또는 복잡한) 도구를 결합한 놀라운 힘"이라고 말했습니다 .
와일드 카드

5

그래서 PDP-10 / TOPS-10 매뉴얼을 찾아서 파이프 이전의 최첨단 상태를 찾아서 약간의 연구를 시도했습니다. 내가 발견 있지만 TOPS-10 Google에 상당히 어렵다. : 파이프의 발명에 대한 몇 가지 좋은 참조가 있습니다 위권에 드는 맥 킬로와의 인터뷰 , 역사와 UNIX의 영향에 대한이 .

이것을 역사적 맥락에 두어야합니다. 우리가 당연한 현대 도구와 편의는 거의 없었습니다.

"처음에 Thompson은 PDP 자체를 프로그래밍하지 않았으며 대신 GE-635 시스템에서 GEMAP 어셈블러에 매크로 세트를 사용했습니다."(29) GE 635에서 종이 테이프가 생성 된 후 테스트되었습니다. Ritchie에 따르면 "PDP-7은 원시 원시 커널, 편집기, 어셈블러, 간단한 쉘 (명령 해석기) 및 몇 가지 유틸리티 (예 : Unix rm, cat, cp 명령)가 완료 될 때까지 "운영 체제 자체 지원, 종이 테이프를 사용하지 않고 프로그램을 작성하고 테스트 할 수 있으며 PDP-7 자체에 대한 개발이 계속되었습니다."

PDP-7은 다음과 같습니다 . 대화 형 디스플레이 또는 하드 디스크가 부족합니다. "파일 시스템"은 자기 테이프에 저장됩니다. 프로그램 및 데이터를위한 최대 64kB의 메모리가있었습니다.

이 환경에서 프로그래머는 테이프를 회전시키고 테이프 인터페이스에서 직접 읽는 문자를 한 번에 하나씩 처리하는 명령을 실행하는 등 하드웨어를 직접 처리하는 경향이있었습니다. 유닉스는 이것에 대한 추상화를 제공하여 별도의 인터페이스 인 "텔레타이프에서 읽기"와 "테이프에서 읽기"가 아니라 하나의 인터페이스로 결합되었습니다. 디스크에 임시 사본을 저장하지 않고 다른 프로그램의 출력에서 ​​읽기가 중요합니다. 또는 테이프 ".

다음은의 발명에 관한 McIlroy입니다 grep. 이것이 유닉스 이전 환경에서 필요한 작업량을 요약하는 좋은 일이라고 생각합니다.

"Grep은 저를 위해 발명되었습니다. 저는 음성 합성기를 통해 텍스트를 소리내어 읽는 프로그램을 만들고있었습니다. 음성 규칙을 고안했을 때 Webster의 사전에 실패 할 수있는 단어가 있는지 확인하겠습니다. 예를 들어, ' '과일', '길리', '유죄', '언어', '이누이트', '베 구인'등 여러 가지 방식으로 발음되는 ui '? 나는 사전을 ed의 제한된 버퍼에 맞는 조각으로 나누고 사용합니다. "목록을 선택하는 전역 명령입니다. 제안 된 각 규칙의 작동 방식을 확인하기 위해 ed를 반복적으로 검색하여이 목록을 정리합니다."

"사전을 분리해야했기 때문에 프로세스가 지루하고 끔찍하게 낭비되었습니다 (분할 사본을 온라인으로 남겨 둘 수 없었습니다). 그런 다음 ed는 각 부분을 / tmp에 복사하고 g 명령을 수행하기 위해 두 번 스캔했습니다. 마지막으로 그것을 버렸습니다. 시간도 걸립니다. "

"어느 날 오후, 나는 Ken Thompson에게 편집자로부터 정규식 인식기를 들어 올릴 수 있는지 원 패스 프로그램을 만들 수 있는지 물었다. 그는 대답했다. 다음날 아침, 내 메일에서 grep이라는 프로그램을 알리는 메모를 발견했다. "그는 재밌는 이름이 무엇을 의미하는지 물었을 때 Ken은 그 이름이 분명하다고 말했다. g / re / p (글로벌 정규 표현식 인쇄)라는 시뮬레이션 명령 편집기를지지했다."

그 첫 부분을 cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100예제 와 비교하십시오 . 옵션이 "명령 줄 작성"대 "어셈블러에서 직접 목적에 맞게 프로그램 작성"이면 명령 줄을 작성하는 것이 좋습니다. (종이) 설명서를 읽는 데 몇 시간이 걸리더라도 마찬가지입니다. 나중에 참조 할 수 있도록 기록해 두십시오.


1

파이프의 천재는 세 가지 중요한 아이디어를 결합한다는 것입니다.

첫째, 파이프는 1958 년 Conway가 만들어 낸 용어 인 '코 루틴'을 실제로 구현 한 것으로 파이프 전에는 거의 사용되지 않는 유망한 용어입니다.

둘째, Thompson은 쉘 언어로 파이프를 구현함으로써 최초의 실제 '접착 어'를 발명했습니다.

이 두 지점을 통해 재사용 가능한 소프트웨어 구성 요소를 최적화 된 저수준 언어로 효율적으로 개발 한 다음 서로 결합하여 훨씬 더 크고 복잡한 기능을 형성 할 수 있습니다. 그들은 이것을 '대규모 프로그래밍'이라고 불렀습니다.

셋째, 파일 액세스에 사용 된 것과 동일한 시스템 호출을 사용하여 파이프를 구현하면 프로그램을 범용 인터페이스로 작성할 수있었습니다. 따라서 소프트웨어 구성 요소를 한 번만 변경하지 않고도 파일의 데이터를 사용하거나 더 큰 소프트웨어 시스템의 일부로 대화식으로 사용할 수있는 소프트웨어 문제에 대한 진정한 범용 솔루션이 가능했습니다. 컴파일, 구성, 간단한 몇 가지 쉘 명령 만 필요합니다.

학습 곡선을 살펴 보려면 UNIX 소프트웨어가 40 년 전과 마찬가지로 오늘날에도 유용합니다. 우리는 그들이 이미 알고 있고 솔루션을 구축 한 것들을 끊임없이 재창조하고 있습니다. 핵심 혁신은 간단한 파이프였습니다. 그 이후 유일한 진정한 혁신은 80 년대 인터넷의 창조였습니다. 놀랍게도 UNIX는 별도의 API를 작성하여 구현을 중단했습니다. 우리는 여전히 결과를 겪고 있습니다. 오, 그래요. 비디오 디스플레이와 마우스에 80 년대 후반에 인기를 얻은 무언가가있었습니다. 그러나 그것은 WIMP를위한 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.