โดยทั่วไปจะมีการบัฟเฟอร์สองระดับที่เกี่ยวข้อง:
- บัฟเฟอร์ภายใน
- บัฟเฟอร์ของระบบปฏิบัติการ
บัฟเฟอร์ภายในคือบัฟเฟอร์ที่สร้างขึ้นโดยรันไทม์ / ไลบรารี / ภาษาที่คุณกำลังเขียนโปรแกรมและมีขึ้นเพื่อเร่งความเร็วโดยหลีกเลี่ยงการเรียกใช้ระบบสำหรับการเขียนทุกครั้ง แต่เมื่อคุณเขียนลงในไฟล์อ็อบเจ็กต์คุณจะเขียนลงในบัฟเฟอร์และเมื่อใดก็ตามที่บัฟเฟอร์เต็มข้อมูลจะถูกเขียนไปยังไฟล์จริงโดยใช้การเรียกระบบ
แต่เนื่องจากบัฟเฟอร์ระบบปฏิบัติการนี้อาจจะไม่ได้หมายความว่าข้อมูลจะถูกเขียนไปยังดิสก์ อาจหมายความว่าข้อมูลถูกคัดลอกจากบัฟเฟอร์ที่รันไทม์ของคุณดูแลไปยังบัฟเฟอร์ที่ระบบปฏิบัติการดูแล
หากคุณเขียนบางอย่างและลงท้ายด้วยบัฟเฟอร์ (เท่านั้น) และไฟถูกตัดไปที่เครื่องของคุณข้อมูลนั้นจะไม่อยู่ในดิสก์เมื่อเครื่องปิด
ดังนั้นเพื่อช่วยในการที่คุณมีflush
และfsync
วิธีการในวัตถุที่เกี่ยวข้อง
ขั้นแรกflush
จะเขียนข้อมูลใด ๆ ที่แฝงอยู่ในบัฟเฟอร์โปรแกรมไปยังไฟล์จริง โดยทั่วไปหมายความว่าข้อมูลจะถูกคัดลอกจากบัฟเฟอร์โปรแกรมไปยังบัฟเฟอร์ของระบบปฏิบัติการ
โดยเฉพาะสิ่งนี้หมายความว่าหากกระบวนการอื่นเปิดไฟล์เดียวกันเพื่ออ่านมันจะสามารถเข้าถึงข้อมูลที่คุณเพิ่งล้างไปยังไฟล์ได้ อย่างไรก็ตามไม่ได้หมายความว่าจะถูกเก็บไว้ในดิสก์อย่างถาวร
ในการทำเช่นนั้นคุณต้องเรียกใช้os.fsync
วิธีการที่ทำให้แน่ใจว่าบัฟเฟอร์ของระบบปฏิบัติการทั้งหมดจะซิงโครไนซ์กับอุปกรณ์จัดเก็บข้อมูลที่พวกเขาใช้กล่าวคือวิธีการนั้นจะคัดลอกข้อมูลจากบัฟเฟอร์ของระบบปฏิบัติการไปยังดิสก์
โดยปกติคุณไม่จำเป็นต้องกังวลกับวิธีใดวิธีหนึ่ง แต่ถ้าคุณอยู่ในสถานการณ์ที่ความหวาดระแวงเกี่ยวกับสิ่งที่เกิดขึ้นจริงบนดิสก์เป็นสิ่งที่ดีคุณควรโทรทั้งสองครั้งตามคำแนะนำ
ภาคผนวกในปี 2561
โปรดทราบว่าดิสก์ที่มีกลไกแคชนั้นพบได้บ่อยกว่าในปี 2013 ดังนั้นในตอนนี้จึงมีระดับการแคชและบัฟเฟอร์ที่เกี่ยวข้องมากขึ้น ฉันคิดว่าบัฟเฟอร์เหล่านี้จะถูกจัดการโดยการโทรซิงค์ / ล้างเช่นกัน แต่ฉันไม่รู้จริงๆ
with file('blah') as fd: #dostuff
โครงสร้างฉันรู้ว่ามันรับประกันการปิดตัวอธิบายไฟล์ มันล้างหรือซิงค์ด้วย?