Apa kepintaran yang tepat dari pipa Unix

52

Saya telah mendengar kisah bagaimana Douglas Mcllroy datang dengan konsep dan bagaimana Ken Thompson menerapkannya dalam satu malam.

Sejauh yang saya mengerti, pipa adalah panggilan sistem yang berbagi sepotong memori antara dua proses di mana satu proses menulis dan lainnya membaca dari.

Sebagai seseorang yang tidak terbiasa dengan OS internal atau konsep, saya bertanya-tanya apa sebenarnya "jenius" dalam cerita? Apakah ini ide dua proses berbagi memori? Atau implementasinya? Atau keduanya?

PS: Saya tahu kegunaan pipa atau bagaimana menggunakannya di shell. Pertanyaannya adalah tentang konsep dan implementasi dari|

aoak
sumber
4
Saya kira di masa-masa awal itu, sangat radikal untuk sangat mendorong penerapan mekanisme untuk menyusun aplikasi. Untuk melakukannya, Anda harus memiliki konsepsi yang baik untuk memisahkan antarmuka dari implementasi, dan mewujudkan utilitas komposisi fungsional dalam pemrograman.
Chan-Ho Suh
4
Tidak hanya itu, sudah aplikasi, saat berjalan, memiliki pegangan input-standar dan pegangan keluaran-standar, dan API sistem operasi mirip Unix memiliki fungsi baca / tulis untuk diterapkan ke gagang ini. Penggunaan cerdas dari beberapa konsep ortogonal dan berkemampuan tinggi (pegangan, keluaran dan input dari mereka) tidak hanya mengarah ke pipa, tetapi juga ke soket, karakter-perangkat-interaksi, dan banyak hal lainnya. Jadi sekarang kita memiliki pegangan file (untuk tty yang menyediakan input keyboard dan output teks) mari kita membuat aplikasi sehingga satu aplikasi menjadi tty yang lain.
Warren P
6
@WarrenP Sebenarnya, Unix mendapat standar input dan standar-output karena yang pipe()syscall dan |Operator shell (ref: McIlroy ). Atau, seperti yang mungkin dikatakan Voltaire, " Jika [stdio] tidak ada, akan diperlukan untuk menemukan [itu]. " :-)
Ross Patterson
Tidak ada yang namanya pegangan file, dan pegangan masuk dan keluar sampai SETELAH pipa?
Warren P
4
@ WarrenP: Kedengarannya seperti apa yang dikatakan Patterson adalah ini: pertama ada file menangani. Kemudian orang-orang ini datang dengan gagasan bahwa setiap program menangani input dan output menangani secara default, yang kemudian memungkinkan program untuk rantai sepele. Ini dikenal sebagai input / output "standar".
Mooing Duck

Jawaban:

109

Sejauh yang saya mengerti, pipa adalah panggilan sistem yang berbagi sepotong memori antara dua proses di mana satu proses menulis dan lainnya membaca dari.

Sebenarnya, tidak ada memori bersama yang terlibat. Pembaca dan penulis TIDAK membagikan bagian apa pun dari ruang alamat mereka, dan mereka tidak menggunakan sinkronisasi eksplisit apa pun.

Proses membaca dan menulis membuat readdan writesistem memanggil persis seperti yang mereka lakukan jika mereka membaca dari / menulis ke file. ITULAH jenius ... inovasi: gagasan bahwa komunikasi proses dan file I / O (sederhana) dapat ditangani dengan cara yang sama ... dari perspektif pemrogram aplikasi dan pengguna.

Setelah pipa telah diatur, OS (bukan kode aplikasi, atau perpustakaan di ruang pengguna) menangani buffering dan koordinasi. Secara transparan.


Sebaliknya, sebelum penemuan konsep pipa, jika Anda perlu melakukan pemrosesan "pipeline", Anda biasanya akan memiliki satu keluaran aplikasi tulis ke file, dan kemudian ketika selesai, Anda akan menjalankan aplikasi kedua untuk membaca dari mengajukan.

Atau, jika Anda menginginkan saluran pipa yang benar, Anda dapat membuat kode kedua aplikasi untuk mengatur segmen memori bersama (nyata) dan menggunakan semaphores (atau sesuatu) untuk mengoordinasikan pembacaan / penulisan. Rumit ... dan akibatnya tidak sering dilakukan.

Stephen C
sumber
34
"ITULAH jenius ... inovasi: gagasan bahwa komunikasi antar proses dan file I / O dapat ditangani dengan cara yang sama" - tepatnya ini. Ini memungkinkan Anda untuk memiliki komunikasi antarproses antar program yang tidak pernah dirancang untuk memilikinya, dan bahkan tidak (perlu) tahu apa yang terjadi.
Guntram Blohm mendukung Monica
6
Penting juga untuk dicatat bahwa alasan menggunakan file I / O untuk IPC terutama bermanfaat karena Unix dirancang untuk pemrosesan teks - streaming data teks dari program ke program, memungkinkan komposisi yang relatif tidak menimbulkan rasa sakit, yang pada gilirannya berarti seluruh sistem dapat dibangun dari relatif kecil, program-program kecil yang mengalirkan data dari satu ke yang lain dalam (mungkin) rantai panjang operasi sederhana. Pada dasarnya, itu berarti Anda memiliki relatif fleksibel bahasa untuk menangani pengolahan teks.
Luaan
1
Jadi "kecerdikan pipa Unix" adalah "kecerdikan Unix": semua i / o (termasuk komunikasi antarproses, file standar, dan objek objek sistem file lainnya) ditangani sebagai file.
Mark Hurd
Genius
14

Menurut pendapat saya, genius gagasan "pipa" adalah kesederhanaan penggunaan.

Anda tidak perlu membuat panggilan sistem apa pun, mengalokasikan memori, tidak ada yang rumit sama sekali. Di shell, Anda menggunakan karakter tunggal: |. Ini memberikan kekuatan luar biasa dalam kombinasi alat sederhana (atau kompleks) untuk tugas yang diberikan.

Ambil beberapa tugas sehari-hari umum seperti menyortir teks dengan rapi. Anda mungkin memiliki perintah yang mencantumkan sejumlah nama. (Sebagai contoh saya, saya akan menggunakan file yang berisi banyak nama, milik listofrandomnames.com.) Menggunakan pipa Anda dapat melakukan sesuatu seperti berikut:

$ 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

Ini hanya satu contoh; ada ribuan. Untuk beberapa tugas spesifik lainnya yang dibuat sangat mudah dengan menggunakan pipa, lihat bagian "The Unix Philosophy" di halaman ini .


Untuk menekankan jawaban ini, lihat slide 4 hingga 9 dari presentasi, "Mengapa Zsh Lebih Keren dari Shell Anda."


Saya sadar bahwa perintah di atas termasuk UUOC . Saya membiarkannya berdiri karena itu adalah penampung untuk perintah sewenang-wenang yang menghasilkan teks.

Wildcard
sumber
3
Catatan kecil mungil : sort -udapat melakukan pekerjaan sort | uniqlebih cepat.
Iwillnotexist Idonotexist
cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100Anda mungkin terbiasa dengan hal itu, tetapi saya tidak akan menyebutnya sederhana sama sekali. Terutama awkbagian itu.
Federico Poloni
The pipa sederhana. Saya memang berkata, "... kekuatan luar biasa dalam kombinasi alat sederhana (atau kompleks) untuk tugas yang diberikan."
Wildcard
5

Jadi saya mencoba melakukan sedikit riset tentang hal ini dengan mencari manual PDP-10 / TOPS-10 untuk mengetahui bagaimana keadaan seni sebelum pipa. Saya menemukan ini , tetapi TOPS-10 sangat sulit untuk google. Ada beberapa referensi bagus tentang penemuan pipa: sebuah wawancara dengan McIlroy , tentang sejarah dan dampak UNIX .

Anda harus memasukkan ini ke dalam konteks historis. Tidak banyak alat dan kenyamanan modern yang kita anggap remeh.

"Pada awalnya, Thompson bahkan tidak memprogram pada PDP itu sendiri, melainkan menggunakan set makro untuk assembler GEMAP pada mesin GE-635." (29) Sebuah pita kertas dihasilkan pada GE 635 dan kemudian diuji pada PDP-7 hingga, menurut Ritchie, "kernel Unix primitif, editor, assembler, shell sederhana (command interpreter), dan beberapa utilitas (seperti perintah Unix rm, cat, cp) selesai. titik, sistem operasi mandiri, program dapat ditulis dan diuji tanpa menggunakan pita kertas, dan pengembangan berlanjut pada PDP-7 itu sendiri. "

A PDP-7 terlihat seperti ini . Perhatikan kurangnya tampilan interaktif atau hard disk. "Sistem file" akan disimpan pada pita magnetik. Ada memori hingga 64kB untuk program dan data.

Dalam lingkungan itu, programmer cenderung menangani perangkat keras secara langsung, seperti dengan mengeluarkan perintah untuk memutar rekaman dan memproses karakter satu per satu yang dibaca langsung dari antarmuka pita. UNIX memberikan abstraksi atas hal ini, sehingga alih-alih "membaca dari teletype" dan "membaca dari pita" sebagai antarmuka terpisah, mereka digabungkan menjadi satu, dengan penambahan pipa penting "baca dari keluaran program lain tanpa menyimpan salinan sementara pada disk atau tape ".

Berikut adalah McIlroy pada penemuan grep. Saya pikir ini melakukan pekerjaan yang baik untuk merangkum jumlah pekerjaan yang diperlukan dalam lingkungan pra-UNIX.

"Grep diciptakan untukku. Aku sedang membuat sebuah program untuk membaca teks dengan keras melalui synthesizer suara. Ketika aku menemukan aturan fonetik, aku akan memeriksa kamus Webster untuk kata-kata yang mungkin gagal. Misalnya, bagaimana kamu mengatasi digraf? ' ui ', yang diucapkan dengan berbagai cara:' buah ',' tipu muslihat ',' bersalah ',' kesedihan ',' intuisi ',' beguine '? Saya akan memecah kamus menjadi beberapa bagian yang sesuai dengan buffer terbatas dan penggunaan ed perintah global untuk memilih daftar. Saya akan memotong daftar ini dengan memindai berulang kali dengan ed untuk melihat bagaimana setiap aturan yang diusulkan bekerja. "

"Prosesnya membosankan, dan sangat boros, karena kamus harus dipisah (orang tidak mampu meninggalkan salinan salinan on line). Kemudian ed menyalin setiap bagian ke / tmp, memindai dua kali untuk menyelesaikan perintah g, dan akhirnya membuangnya, yang juga butuh waktu. "

"Suatu sore saya bertanya kepada Ken Thompson apakah dia bisa mengeluarkan pengenal ekspresi reguler dari editor dan membuat program satu-pass untuk melakukannya. Dia berkata ya. Pagi berikutnya saya menemukan catatan di surat saya yang mengumumkan sebuah program bernama grep. Itu berfungsi seperti pesona. Ketika ditanya apa arti nama lucu itu, Ken mengatakan itu jelas. Itu singkatan dari perintah editor yang disimulasikan, g / re / p (cetak ekspresi reguler global). "

Bandingkan bagian pertama itu dengan cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100contoh. Jika opsi Anda adalah "membangun baris perintah" versus "menulis program khusus untuk tujuan tersebut, dengan tangan, di assembler", maka ada baiknya membangun baris perintah. Bahkan jika dibutuhkan beberapa jam membaca manual (kertas) untuk melakukannya. Anda kemudian dapat menuliskannya untuk referensi di masa mendatang.

pjc50
sumber
1

Jenius Pipa adalah bahwa ia menggabungkan tiga ide penting.

Pertama, pipa adalah implementasi praktis dari 'co-routines', sebuah istilah yang diciptakan oleh Conway pada tahun 1958 yang menjanjikan tetapi melihat sedikit penggunaan praktis sebelum Pipes.

Kedua, dengan mengimplementasikan pipa dalam bahasa shell, Thompson et al menciptakan 'bahasa lem' yang sebenarnya.

Dua poin ini memungkinkan komponen perangkat lunak yang dapat digunakan kembali dikembangkan secara efisien dalam bahasa tingkat rendah yang dioptimalkan, dan kemudian direkatkan bersama untuk membentuk fungsionalitas yang jauh lebih besar dan lebih kompleks. Mereka menyebutnya 'Programming in the Large'.

Ketiga, menerapkan pipa menggunakan panggilan sistem yang sama yang digunakan untuk akses file memungkinkan program ditulis dengan antarmuka universal. Ini memungkinkan solusi yang benar-benar universal untuk masalah perangkat lunak, yang dapat digunakan secara interaktif, menggunakan data dari file, dan sebagai bagian dari sistem perangkat lunak yang lebih besar, semua tanpa perubahan tunggal pada komponen perangkat lunak. Tanpa kompilasi, tidak ada konfigurasi, hanya beberapa perintah shell sederhana.

Jika Anda ingin mempelajari kurva pembelajaran, perangkat lunak UNIX sama bermanfaatnya hari ini seperti 40 tahun yang lalu. Kami terus-menerus menciptakan kembali hal-hal yang telah mereka ketahui dan membangun solusi untuknya. Dan terobosan kuncinya adalah Pipa sederhana. Satu-satunya inovasi nyata setelah itu adalah penciptaan internet di tahun 80-an. Secara dramatis, UNIX merusak implementasinya dengan membuat API terpisah. Kami masih menderita konsekuensinya ... Oh, ya, ada sesuatu dengan tampilan video dan tikus yang menjadi populer di akhir 80-an. Tapi itu untuk WIMP.

EvertW
sumber