ความเฉลียวฉลาดที่แน่นอนของ Unix pipe คืออะไร


52

ฉันได้ยินเรื่องราวของดักลาสแมครอยรอยที่มาพร้อมกับแนวคิดและวิธีที่เคน ธ อมป์สันใช้มันในคืนเดียว

เท่าที่ฉันเข้าใจไปป์คือการเรียกของระบบซึ่งใช้หน่วยความจำร่วมกันระหว่างสองโพรเซสโดยที่โพรเซสหนึ่งเขียนและอ่านอย่างอื่น

ในฐานะคนที่ไม่คุ้นเคยกับระบบปฏิบัติการภายในหรือแนวคิดฉันสงสัยว่า "อัจฉริยะ" ในเรื่องนี้คืออะไร? มันเป็นความคิดของสองกระบวนการที่ใช้หน่วยความจำร่วมกันหรือไม่? หรือเป็นการนำไปปฏิบัติ หรือทั้งคู่?

PS: ฉันตระหนักถึงประโยชน์ของท่อหรือวิธีการใช้ในเปลือก คำถามเกี่ยวกับแนวคิดและการดำเนินการของ|


4
ฉันเดาว่าในช่วงแรก ๆ มันค่อนข้างรุนแรงที่จะผลักดันอย่างมากสำหรับการนำกลไกไปใช้ในการเขียนแอปพลิเคชัน ในการทำเช่นนั้นคุณจะต้องมีความคิดที่ดีในการแยกส่วนต่อประสานระหว่างการใช้งานและตระหนักถึงประโยชน์ขององค์ประกอบการทำงานในการเขียนโปรแกรม
Chan-Ho Suh

4
ไม่เพียงแค่นั้นแอปพลิเคชั่นที่กำลังทำงานอยู่มีตัวจัดการอินพุตมาตรฐานและหมายเลขอ้างอิงเอาต์พุตมาตรฐานและ API ระบบปฏิบัติการ Unix ที่มีลักษณะคล้าย Unix นั้นมีฟังก์ชั่นอ่าน / เขียนเพื่อใช้กับที่จับเหล่านี้ การใช้แนวคิดมุมฉากและความสามารถสูง (มือจับเอาต์พุตและอินพุตจากพวกมัน) อย่างชาญฉลาดทำให้ไม่เพียง แต่กับท่อเท่านั้น แต่ยังรวมถึงซ็อกเก็ตการสื่อสารระหว่างอุปกรณ์กับตัวละครและอีกหลายสิ่ง ดังนั้นตอนนี้เรามีการจัดการไฟล์ (สำหรับ tty ซึ่งให้การป้อนข้อมูลด้วยแป้นพิมพ์และการส่งข้อความ) ลองเขียนแอปพลิเคชันเพื่อให้แอปหนึ่งกลายเป็น tty ของอีกอัน
Warren P

6
@WarrenP จริง, Unix มีมาตรฐานการป้อนข้อมูลและมาตรฐานการส่งออกเพราะpipe() syscall และ|ผู้ประกอบการเชลล์ (Ref: McIlroy ) หรืออย่างที่ Voltaire อาจกล่าวไว้ว่า " ถ้า [stdio] ไม่มีตัวตนมันก็จำเป็นที่จะต้องสร้าง [มัน] " :-)
Ross Patterson

ไม่มีสิ่งใดที่เป็นตัวจัดการไฟล์และตัวจัดการเข้าและออกจนท่อหลังจาก?
Warren P

4
@WarrenP: ดูเหมือนว่า Patterson กำลังพูดถึงสิ่งนี้: อันดับแรกมีการจัดการไฟล์ จากนั้นคนเหล่านี้เกิดความคิดขึ้นว่าแต่ละโปรแกรมจะมีตัวจัดการอินพุตและตัวจัดการเอาต์พุตตามค่าเริ่มต้นซึ่งอนุญาตให้โปรแกรมเชื่อมโยงกันเล็กน้อย สิ่งเหล่านี้กลายเป็นที่รู้จักในฐานะ "มาตรฐาน" อินพุต / เอาต์พุต
Mooing Duck

คำตอบ:


109

เท่าที่ฉันเข้าใจไปป์คือการเรียกของระบบซึ่งใช้หน่วยความจำร่วมกันระหว่างสองโพรเซสโดยที่โพรเซสหนึ่งเขียนและอ่านอย่างอื่น

ที่จริงแล้วไม่มีการแชร์หน่วยความจำที่เกี่ยวข้อง ผู้อ่านและนักเขียนไม่ได้แบ่งปันส่วนใดส่วนหนึ่งของพื้นที่ที่อยู่ของพวกเขาและพวกเขาไม่ได้ใช้การประสานที่ชัดเจน

กระบวนการอ่านและการเขียนกำลังดำเนินอยู่readและwriteระบบจะเรียกอย่างถูกต้องหากพวกเขากำลังอ่านจาก / เขียนไปยังไฟล์ นั่นคืออัจฉริยะ ... นวัตกรรม: แนวคิดที่ว่าการสื่อสารระหว่างกระบวนการ (ง่าย) และไฟล์ I / O สามารถจัดการได้ในลักษณะเดียวกัน ... จากมุมมองของโปรแกรมเมอร์แอปพลิเคชันและผู้ใช้

เมื่อตั้งค่าไปป์แล้วระบบปฏิบัติการ (ไม่ใช่รหัสแอปพลิเคชันหรือไลบรารีในพื้นที่ผู้ใช้) จะดูแลการบัฟเฟอร์และการประสานงาน โปร่งใส


ในทางตรงกันข้ามก่อนการคิดค้นแนวคิดไปป์ถ้าคุณต้องการทำการประมวลผล "ไปป์ไลน์" โดยทั่วไปคุณจะมีแอปพลิเคชันหนึ่งเขียนเอาต์พุตไปยังไฟล์และเมื่อเสร็จแล้วคุณจะเรียกใช้แอปพลิเคชันที่สองเพื่ออ่านจาก ไฟล์.

หรือถ้าคุณต้องการไพพ์ไลน์จริงคุณสามารถโค้ดทั้งสองแอปพลิเคชันเพื่อตั้งค่าเซ็กเมนต์หน่วยความจำที่ใช้ร่วมกัน (ของจริง) และใช้เซมาฟอร์ (หรือบางอย่าง) เพื่อประสานงานการอ่าน / เขียน ซับซ้อน ... และไม่บ่อยนัก


34
"นั่นคืออัจฉริยะ ... นวัตกรรม: แนวคิดที่ว่าการสื่อสารระหว่างกระบวนการและไฟล์ I / O สามารถจัดการได้ในลักษณะเดียวกัน" - ตรงนี้ ช่วยให้คุณมีการสื่อสารระหว่างกระบวนการระหว่างโปรแกรมที่ไม่เคยออกแบบมาให้มีและไม่จำเป็นต้องรู้สิ่งที่เกิดขึ้น
Guntram Blohm

6
นอกจากนี้ยังมีประโยชน์ที่จะต้องทราบว่าเหตุผลที่ใช้ไฟล์ I / O สำหรับ IPC นั้นมีประโยชน์เป็นหลักเพราะ Unix ได้รับการออกแบบสำหรับการประมวลผลข้อความ - การสตรีมข้อมูลข้อความจากโปรแกรมหนึ่งไปยังอีกโปรแกรมหนึ่ง โปรแกรมขนาดเล็กที่ค่อนข้างเรียบง่ายซึ่งสตรีมข้อมูลจากที่หนึ่งไปยังอีกที่หนึ่งใน (อาจ) โซ่ยาวของการดำเนินการอย่างง่าย โดยทั่วไปหมายถึงคุณมีภาษาที่ค่อนข้างยืดหยุ่นในการจัดการกับการประมวลผลข้อความ
Luaan

1
ดังนั้น "ความเฉลียวฉลาดของ Unix pipe" จึงเป็น "ความเฉลียวฉลาดของ Unix": i / o ทั้งหมด (รวมถึงการสื่อสารระหว่างกระบวนการ, ไฟล์มาตรฐานและส่วนที่เหลือของวัตถุระบบไฟล์) ถูกจัดการเป็นไฟล์
Mark Hurd

อัจฉริยะอีกจังหวะคือ UNIX สนับสนุนโครงสร้างไฟล์ที่มนุษย์สามารถอ่านได้ในเวลาที่ทุก ๆ ไบต์นับ
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

นี่เป็นเพียงตัวอย่างเดียว มีหลายพัน สำหรับงานเฉพาะอื่น ๆ ที่ทำให้การใช้งานท่อง่ายขึ้นอย่างน่าทึ่งดูหัวข้อ "The Unix Philosophy" ในหน้านี้


หากต้องการเน้นคำตอบนี้ให้ดูสไลด์ที่ 4 ถึง 9 ของงานนำเสนอ "ทำไม Zsh ถึงเย็นกว่าเชลล์คุณ"


ผมทราบว่าคำสั่งดังกล่าวรวมถึงUUOC ฉันปล่อยให้มันยืนเพราะมันเป็นตัวยึดสำหรับคำสั่งโดยพลการที่สร้างข้อความ


3
โน้ตจิ๋วจิ๋ว : sort -uสามารถทำงานsort | uniqได้เร็วขึ้น
Iwillnotexist Idonotexist

cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100คุณอาจคุ้นเคยกับมัน แต่ฉันจะไม่เรียกมันว่าง่ายเลย โดยเฉพาะawkส่วนที่
Federico Poloni

ท่อมีความเรียบง่าย ฉันพูดว่า "... พลังพิเศษในการผสมผสานเครื่องมือที่เรียบง่าย(หรือซับซ้อน)กับงานที่กำหนด"
สัญลักษณ์แทน

5

ดังนั้นฉันจึงพยายามค้นคว้าเกี่ยวกับเรื่องนี้โดยค้นหาคู่มือ PDP-10 / TOPS-10 เพื่อค้นหาว่าศิลปะมีอะไรก่อนท่อ ฉันพบสิ่งนี้แต่ TOPS-10 นั้นยากที่จะเป็น google อย่างมาก : มีการอ้างอิงไม่กี่ที่ดีในการประดิษฐ์ของท่อที่มีการให้สัมภาษณ์กับ McIlroy , เกี่ยวกับประวัติและผลกระทบของยูนิกซ์

คุณต้องใส่สิ่งนี้ลงในบริบททางประวัติศาสตร์ มีเครื่องมือและสิ่งอำนวยความสะดวกที่ทันสมัยเพียงไม่กี่ที่เรามีให้

"ในตอนแรก ธ อมป์สันไม่ได้เขียนโปรแกรมบน PDP เอง แต่ใช้ชุดแมโครสำหรับแอสเซมเบลอร์ GEMAP บนเครื่อง GE-635" (29) เทปกระดาษถูกสร้างบน GE 635 และทดสอบบน PDP-7 จนกระทั่งตาม Ritchie, "เคอร์เนล Unix ดั้งเดิม, ตัวแก้ไข, แอสเซมเบลอร์, เชลล์แบบง่าย (ตัวแปลคำสั่ง), และยูทิลิตี้บางอย่าง (เช่น Unix rm, cat, คำสั่ง cp) เสร็จสมบูรณ์ ชี้ให้เห็นว่าระบบปฏิบัติการนั้นให้การสนับสนุนตัวเองสามารถเขียนและทดสอบโปรแกรมได้โดยไม่ต้องหันไปใช้เทปกระดาษ

PDP-7 มีลักษณะเช่นนี้ โปรดสังเกตว่าการขาดการแสดงผลแบบโต้ตอบหรือฮาร์ดดิสก์ "ระบบไฟล์" จะถูกเก็บไว้ในเทปแม่เหล็ก มีหน่วยความจำสูงสุด 64kB สำหรับโปรแกรมและข้อมูล

ในสภาพแวดล้อมนั้นโปรแกรมเมอร์มักจะจัดการกับฮาร์ดแวร์โดยตรงเช่นโดยการออกคำสั่งเพื่อหมุนเทปและประมวลผลอักขระหนึ่งตัวต่อครั้งที่อ่านโดยตรงจากอินเตอร์เฟสเทป UNIX จัดทำ abstractions เหนือสิ่งนี้ดังนั้นแทนที่จะเป็น "read from teletype" และ "read from tape" ซึ่งเป็นส่วนต่อประสานที่แยกจากกันพวกเขารวมกันเป็นหนึ่งด้วยการเพิ่มไปยังส่วนสำคัญของ "อ่านจากเอาต์พุตของโปรแกรมอื่นโดยไม่เก็บสำเนาชั่วคราวบนดิสก์ หรือเทป "

นี่คือ McIlroy grepในการประดิษฐ์ของ ฉันคิดว่านี่เป็นงานที่ดีในการสรุปจำนวนงานที่ต้องการในสภาพแวดล้อม pre-UNIX

"Grep ถูกคิดค้นขึ้นมาสำหรับฉันฉันกำลังทำโปรแกรมอ่านออกเสียงข้อความผ่านเครื่องสังเคราะห์เสียงเมื่อฉันคิดค้นกฎการออกเสียงฉันจะตรวจสอบพจนานุกรมของเว็บสเตอร์สำหรับคำที่พวกเขาอาจล้มเหลวตัวอย่างเช่นคุณรับมือกับ digraph อย่างไร ui 'ซึ่งออกเสียงได้หลายวิธี:' fruit ',' guile ',' guilty ',' anguish ',' intuit ',' beguine 'ฉันจะแบ่งพจนานุกรมเป็นชิ้น ๆ ที่พอดีกับบัฟเฟอร์ที่ จำกัด ของ ed และใช้ คำสั่งระดับโลกเพื่อเลือกรายการฉันจะลดรายการนี้ลงด้วยการสแกนซ้ำกับเอ็ดเพื่อดูว่ากฎที่เสนอแต่ละข้อทำงานอย่างไร "

"กระบวนการนั้นน่าเบื่อและสิ้นเปลืองอย่างมากเนื่องจากพจนานุกรมจะต้องแยก (หนึ่งไม่สามารถที่จะปล่อยสำเนาแยกบนบรรทัด) จากนั้นก็คัดลอกแต่ละส่วนลงใน / tmp สแกนสองครั้งเพื่อให้บรรลุคำสั่ง g และในที่สุดก็โยนมันทิ้งซึ่งใช้เวลาเช่นกัน "

"บ่ายวันหนึ่งฉันถาม Ken Thompson ว่าเขาสามารถยกตัวจำแนกการแสดงออกปกติออกมาจากโปรแกรมแก้ไขและสร้างโปรแกรม One-Pass ขึ้นมาเขาตอบว่าใช่เช้าวันรุ่งขึ้นฉันพบข้อความในจดหมายของฉันที่ประกาศโปรแกรม grep มันใช้งานได้อย่างมีเสน่ห์เมื่อถามว่าชื่อตลกหมายถึงอะไรเคนพูดอย่างชัดเจนมันยืนสำหรับคำสั่งบรรณาธิการว่ามันจำลอง g / re / p (พิมพ์นิพจน์ทั่วไปทั่วโลก) "

เปรียบเทียบส่วนแรกของสิ่งนั้นกับcat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100ตัวอย่าง หากตัวเลือกของคุณคือ "สร้างบรรทัดคำสั่ง" กับ "เขียนโปรแกรมเฉพาะสำหรับวัตถุประสงค์ด้วยมือในแอสเซมเบลอร์" ถ้าเช่นนั้นมันก็คุ้มค่าที่จะสร้างบรรทัดคำสั่ง แม้ว่ามันจะใช้เวลาสองสามชั่วโมงในการอ่านคู่มือ (กระดาษ) เพื่อทำมัน จากนั้นคุณสามารถจดบันทึกไว้เพื่อใช้อ้างอิงในอนาคต


1

อัจฉริยะของท่อคือการรวมสามแนวคิดที่สำคัญ

ประการแรกท่อเป็นการใช้งานจริงของ 'co-routines' ซึ่งเป็นคำที่ประกาศใช้โดย Conway ในปี 1958 ซึ่งมีแนวโน้ม แต่เห็นการใช้งานจริงเพียงเล็กน้อยต่อท่อ

ประการที่สองโดยการใช้ท่อในภาษาของเชลล์ ธ อมป์สันเอตอัลคิดค้น 'ภาษากาว' ตัวแรก

จุดสองจุดเหล่านี้ช่วยให้สามารถพัฒนาส่วนประกอบซอฟต์แวร์ที่นำมาใช้ซ้ำได้อย่างมีประสิทธิภาพในภาษาระดับต่ำและได้รับการปรับให้เหมาะสมที่สุด พวกเขาเรียกสิ่งนี้ว่า 'Programming in the Large'

ประการที่สามการติดตั้งไปป์โดยใช้การเรียกระบบเดียวกันกับที่ใช้สำหรับการเข้าถึงไฟล์ที่อนุญาตให้โปรแกรมเขียนด้วยอินเตอร์เฟซสากล สิ่งนี้ได้รับการอนุญาตสำหรับการแก้ปัญหาที่เป็นสากลอย่างแท้จริงในการแก้ไขปัญหาซอฟต์แวร์ซึ่งสามารถใช้งานแบบโต้ตอบได้โดยใช้ข้อมูลจากไฟล์และเป็นส่วนหนึ่งของระบบซอฟต์แวร์ที่มีขนาดใหญ่ขึ้นโดยไม่ต้องเปลี่ยนส่วนประกอบซอฟต์แวร์เพียงครั้งเดียว ไม่มีการคอมไพล์ไม่มีการตั้งค่าเพียงคำสั่งเชลล์ง่ายๆ

หากคุณสนใจในช่วงการเรียนรู้ซอฟต์แวร์ UNIX นั้นมีประโยชน์เช่นเดียวกับเมื่อ 40 ปีที่แล้ว เรากำลังคิดค้นสิ่งใหม่ ๆ อยู่ตลอดเวลาที่พวกเขารู้และสร้างโซลูชันสำหรับ และการพัฒนาที่สำคัญคือท่อง่าย นวัตกรรมที่แท้จริงเพียงอย่างเดียวหลังจากนั้นคือการสร้างอินเทอร์เน็ตในยุค 80 UNIX ไม่สามารถทำงานได้อย่างสมบูรณ์โดยสร้าง API แยกต่างหาก เรายังคงได้รับผลกระทบ ... โอ้ใช่มีบางอย่างที่มีการแสดงวิดีโอและเมาส์ที่เป็นที่นิยมในช่วงปลายยุค 80 แต่สำหรับ WIMPs

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.