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|
history
unix
process
pipelining
aoak
sumber
sumber
pipe()
syscall dan|
Operator shell (ref: McIlroy ). Atau, seperti yang mungkin dikatakan Voltaire, " Jika [stdio] tidak ada, akan diperlukan untuk menemukan [itu]. " :-)Jawaban:
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
read
danwrite
sistem 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.
sumber
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:
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.
sumber
sort -u
dapat melakukan pekerjaansort | uniq
lebih cepat.cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100
Anda mungkin terbiasa dengan hal itu, tetapi saya tidak akan menyebutnya sederhana sama sekali. Terutamaawk
bagian itu.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.
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.Bandingkan bagian pertama itu dengan
cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100
contoh. 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.sumber
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.
sumber