Pipa di Unix memiliki buffer, jadi meskipun proses sisi kanan (RSP) tidak mengonsumsi data apa pun, proses sisi kiri (LSP) dapat menghasilkan beberapa kilobyte sebelum memblokir.
Kemudian, jika buffer penuh, LSP akhirnya diblokir. Saat RSP membaca data, RSP membebaskan sebagian atau seluruh ruang buffer dan LSP melanjutkan operasi.
Jika alih-alih 2 proses Anda memiliki 3, situasinya kurang lebih sama:produsen yang lebih cepat diblokir oleh konsumen yang lebih lambat. Dan jelas, konsumen yang lebih cepat diblokir oleh produsen yang lebih lambat jika pipa kosong:pikirkan saja shell interaktif, menunggu produsen yang paling lambat:pengguna.
Misalnya perintah berikut:
$ yes | cat | more
Sejak more
memblokir saat layar penuh, hingga pengguna menekan tombol, cat
proses akan mengisi buffer dan kios keluarannya, lalu yes
proses akan mengisi buffer dan juga stall. Semuanya menunggu pengguna untuk melanjutkan, sebagaimana mestinya.
PS:Sebagai fakta yang menarik adalah:apa yang terjadi ketika more
proses berakhir? nah, sisi kanan pipa itu ditutup, jadi cat
proses akan mendapatkan SIGPIPE
sinyal (jika pernah menulis lagi di pipa, dan itu akan) dan akan mati. Hal yang sama akan terjadi pada yes
proses. Semua proses mati, sebagaimana mestinya.
A memiliki pipa ke B, dan B memiliki pipa ke C. Setiap pipa memiliki penyangga; B dan C memblokir jika mereka mencoba membaca, dan tidak ada input yang tersedia (akhir aliran dihitung sebagai input). Blok A dan B jika mereka memiliki output untuk ditulis, tetapi buffer pipa penuh.
Ketiga proses berjalan bersamaan, menggunakan CPU sebanyak mungkin. OS memblokirnya dalam panggilan sistem baca/tulis seperlunya jika masing-masing buffer pipa habis/penuh.
Jadi, mereka digerakkan oleh konsumen dan produsen, yaitu, kurs adalah min dari kurs konsumsi dan kurs produksi. Jika konsumen lebih cepat, performa didorong oleh produsen, dan vv.