Brian Kernighan giải thích trong video này, sự thu hút ban đầu của Bell Labs đối với các ngôn ngữ / chương trình nhỏ dựa trên các giới hạn về bộ nhớ
Một cỗ máy lớn sẽ là 64 k byte - K, không phải M hay G - và điều đó có nghĩa là bất kỳ chương trình riêng lẻ nào cũng không thể lớn, và do đó, có xu hướng tự nhiên là viết các chương trình nhỏ, và sau đó là cơ chế đường ống, về cơ bản chuyển hướng đầu ra, làm cho nó có thể liên kết một chương trình với một chương trình khác.
Nhưng tôi không hiểu làm thế nào điều này có thể hạn chế việc sử dụng bộ nhớ vì thực tế là dữ liệu phải được lưu trữ trong RAM để truyền giữa các chương trình.
Từ Wikipedia :
Trong hầu hết các hệ thống giống Unix, tất cả các quy trình của một đường ống được bắt đầu cùng một lúc [nhấn mạnh của tôi], với các luồng của chúng được kết nối phù hợp và được quản lý bởi bộ lập lịch cùng với tất cả các quy trình khác đang chạy trên máy. Một khía cạnh quan trọng của vấn đề này, đặt các ống Unix khác với các triển khai đường ống khác, là khái niệm về bộ đệm: ví dụ, một chương trình gửi có thể tạo ra 5000 byte mỗi giây và một chương trình nhận chỉ có thể chấp nhận 100 byte mỗi giây, nhưng không dữ liệu bị mất. Thay vào đó, đầu ra của chương trình gửi được giữ trong bộ đệm. Khi chương trình nhận đã sẵn sàng để đọc dữ liệu, thì chương trình tiếp theo trong đường ống sẽ đọc từ bộ đệm. Trong Linux, kích thước của bộ đệm là 65536 byte (64KB). Một bộ lọc bên thứ ba nguồn mở có tên bfr có sẵn để cung cấp bộ đệm lớn hơn nếu được yêu cầu.
Điều này làm tôi bối rối hơn nữa, vì điều này hoàn toàn đánh bại mục đích của các chương trình nhỏ (mặc dù chúng sẽ được mô đun hóa theo một quy mô nhất định).
Điều duy nhất tôi có thể nghĩ là một giải pháp cho câu hỏi đầu tiên của mình (giới hạn bộ nhớ bị phụ thuộc vào dữ liệu kích thước) là các tập dữ liệu lớn đơn giản là không được tính toán trước đó và các đường ống vấn đề thực sự có nghĩa là giải quyết dung lượng bộ nhớ theo yêu cầu của chính các chương trình. Nhưng được đưa ra văn bản in đậm trong trích dẫn Wikipedia, thậm chí điều này làm tôi bối rối: vì một chương trình không được thực hiện tại một thời điểm.
Tất cả điều này sẽ rất có ý nghĩa nếu các tệp tạm thời được sử dụng, nhưng tôi hiểu rằng các đường ống không ghi vào đĩa (trừ khi sử dụng trao đổi).
Thí dụ:
sed 'simplesubstitution' file | sort | uniq > file2
Rõ ràng với tôi rằng sed
đang đọc trong tệp và nhổ nó trên từng dòng một. Nhưng sort
, như BK nói trong video được liên kết, là một điểm dừng hoàn toàn, do đó, tất cả dữ liệu phải được đọc vào bộ nhớ (hoặc nó?), Sau đó, nó được chuyển sang uniq
, mà (theo tôi) sẽ là một chương trình -line-at-a-time. Nhưng giữa ống thứ nhất và thứ hai, tất cả dữ liệu phải nằm trong bộ nhớ, phải không?
unless swap is used
trao đổi luôn được sử dụng khi không có đủ RAM