mkfifo - ดิสก์ I / O เกิดขึ้นจริงหรือไม่


10

ฉันมี 2 แอปพลิเคชัน:

  • ผู้ผลิต (อินสแตนซ์ N)
  • ผู้บริโภค (1 อินสแตนซ์)

ฉันกำลังเขียนออกกลางผลมาจากผู้ผลิตและผู้บริโภคแล้วอ่านไฟล์เหล่านี้จากดิสก์และผลิตสุดท้ายผล

ฉันต้องการลด I / O นี้ให้น้อยที่สุดโดย "สตรีมมิ่ง" ผลลัพธ์จากผู้ผลิตโดยตรงไปยังผู้บริโภค

ฉันมาข้ามท่อชื่อ (mkfifo) และเป็นตัวอย่างที่ตามมาที่นี่ สิ่งนี้ดูดี แต่สิ่งที่ฉันไม่สามารถระบุได้ว่าจะนำไปใช้จริงได้อย่างไร คิว FIFO เพิ่งถูกบัฟเฟอร์ผ่านไฟล์หรือไม่? ถ้าเป็นเช่นนั้นอาจจะไม่ช่วยฉัน ฉันต้องการเนื้อหาที่จะสตรีม "ผ่านหน่วยความจำ" ทั้งหมดโดยไม่ต้องใช้ดิสก์ บางทีนี่อาจเป็นไปไม่ได้ในกระบวนการต่างๆ

คำตอบ:


10

ไม่มีดิสก์ i / o (ยกเว้นบางทีเมื่อนำทางผ่านระบบไฟล์เพื่อเปิดไฟล์ Fifo)

จากหน้า man Linux Fifo (7) :

ไฟล์พิเศษ FIFO (ไพพ์ที่มีชื่อ) นั้นคล้ายกับไพพ์ยกเว้นว่ามันถูกเข้าถึงเป็นส่วนหนึ่งของระบบไฟล์ [... ] เมื่อกระบวนการแลกเปลี่ยนข้อมูลผ่าน FIFO เคอร์เนลจะส่งข้อมูลทั้งหมดภายในโดยไม่ต้องเขียนลงในระบบไฟล์ ดังนั้นไฟล์พิเศษ FIFO จึงไม่มีเนื้อหาในระบบไฟล์ รายการระบบไฟล์ทำหน้าที่เป็นเพียงจุดอ้างอิงเพื่อให้กระบวนการสามารถเข้าถึงไปป์โดยใช้ชื่อในระบบไฟล์


สมบูรณ์ ฉันอ่าน man page สำหรับ mkfifo แต่ไม่คิดว่าจะหาหน้าใน "fifo" - ขอบคุณ!
Jmoney38

3

ไม่สำคัญว่าผลลัพธ์ของคุณจะได้รับการสำรองข้อมูลจริงหรือไม่เพราะหากมีหน่วยความจำเพียงพอก็จะถูกแคชอยู่แล้วและไม่มีดิสก์ IO จริง ในทางกลับกันหากมีหน่วยความจำสำรองและมีหน่วยความจำไม่เพียงพอก็สามารถเปลี่ยนเป็นดิสก์ได้

ถ้าฉันต้องเดาฉันจะบอกว่าไปป์นั้นอิงตามหน่วยความจำจริง ๆ แต่สิ่งนี้ควรเปลี่ยนว่าข้อมูลที่อยู่ในคิวจะถูกเก็บไว้ระหว่างการรีบูตหรือไม่

สิ่งที่คุณควรระวังคือเมื่อคุณมีโปรดิวเซอร์หลายคนงานเขียนของคุณจำเป็นต้องมีอะตอมมิกเพื่อที่พวกเขาจะไม่ได้สอดแทรกในคิว ดูman 7 pipeรายละเอียดเกี่ยวกับวิธีตรวจสอบให้แน่ใจว่าการเขียนนั้นเป็นอะตอมมิก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.