mkfifo - Đĩa I / O có thực sự xảy ra không?


10

Tôi có 2 ứng dụng:

  • Nhà sản xuất (N dụ)
  • Người tiêu dùng (1 ví dụ)

Tôi hiện đang viết kết quả trung gian từ các nhà sản xuất, và sau đó người tiêu dùng đọc các tệp này từ đĩa và tạo ra kết quả cuối cùng .

Tôi muốn giảm thiểu I / O này bằng cách "truyền phát" các đầu ra từ nhà sản xuất trực tiếp đến người tiêu dùng.

Tôi đã đi qua các ống có tên (mkfifo) và một ví dụ tiếp theo ở đây . Điều này có vẻ tuyệt vời, nhưng những gì tôi không thể xác định là làm thế nào điều này thực sự được thực hiện? Là hàng đợi FIFO chỉ được đệm thông qua một tập tin? Nếu vậy, điều đó có lẽ sẽ không giúp tôi. Tôi muốn nội dung truyền phát hoàn toàn "qua bộ nhớ" mà không cần sử dụng đĩa. Có lẽ điều này là không thể trên các quy trình?

Câu trả lời:


10

Không có đĩa i / o (có lẽ ngoại trừ khi điều hướng qua hệ thống tệp để mở tệp fifo.)

Từ trang man fifo (7) của Linux :

Một tập tin đặc biệt của FIFO (một ống có tên) tương tự như một đường ống, ngoại trừ việc nó được truy cập như một phần của hệ thống tập tin. [...] Khi các quy trình đang trao đổi dữ liệu thông qua FIFO, kernel sẽ chuyển tất cả dữ liệu bên trong mà không ghi nó vào hệ thống tập tin. Do đó, tệp đặc biệt FIFO không có nội dung trên hệ thống tệp; mục hệ thống tập tin chỉ đóng vai trò là điểm tham chiếu để các quy trình có thể truy cập vào đường ống bằng cách sử dụng tên trong hệ thống tập tin.


Hoàn hảo. Tôi đã đọc trang man cho mkfifo, nhưng tôi không nghĩ sẽ tìm một trang trên "fifo" - Cảm ơn bạn!
Jmoney38

3

Nó không thực sự quan trọng cho dù kết quả của bạn có thực sự được hỗ trợ đĩa hay không, bởi vì nếu có đủ bộ nhớ thì nó sẽ được lưu vào bộ nhớ cache và không có IO thực tế nào được thực hiện. Ngược lại, nếu nó được hỗ trợ bộ nhớ và không đủ bộ nhớ thì nó có thể được hoán đổi sang đĩa.

Nếu tôi đoán, tôi sẽ nói rằng đường ống thực sự dựa trên bộ nhớ, nhưng sau đó, điều này chỉ nên thay đổi liệu dữ liệu xếp hàng có được bảo tồn giữa các lần khởi động lại hay không.

Điều bạn nên quan tâm là vì bạn có nhiều nhà sản xuất nên bài viết của bạn cần phải là nguyên tử để chúng không bị xen kẽ trong hàng đợi. Xem man 7 pipeđể biết chi tiết về cách đảm bảo rằng một văn bản là nguyên tử.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.