我的os背景不強,有人可以提供一些示例(如果可能,請在Go中),爲什麼使用緩衝區很重要?使用緩衝區進行讀取和讀取操作示例Go
-1
A
回答
6
假設你正在談論IO:
假設你有一個var fin *os.File
和文件包裹在一個緩衝區,var instrm *bufio.Reader
。現在想象你正在寫某種解析器,每次讀入輸入的一個字符(可以說字節)。包bufio實現緩衝I/O。
如果你打電話myParser.Parse(fin)
你會打電話給.Read
4,194,304次讀取每個字節,這將使系統調用4,194,304次,這將導致4,194,304 context switches。 context switches是控制從用戶空間程序傳輸到OS並且是最慢(非IO)操作之一。在操作系統不合並/預取IO請求的情況下,您的IO設備一次也尋找並讀取一個字節的可能性也很大,但大多數操作系統的IO elevator預取和device-side buffers現在可以防止這種情況發生(但它總是更好大批量連續閱讀)。
如果您撥打myParser.Parse(instrm)
,默認bufio.Reader
緩衝區爲4K,則將導致1,024個上下文切換(每個系統調用讀取4K而不是1個字節)。由於每個系統調用都有一定的開銷,這意味着花更少的時間用於進行系統調用,並且有更多的時間讓程序運行。同樣值得指出的是,以這種方式運行(沒有額外的上下文切換)通常會增加CPU instruction緩存命中率,因爲更多時間將用於branching within a smaller region of memory。
緩衝區在網絡IO等領域更爲重要,因爲它將允許您發送最大數量的數據包,而不是發送小型數據包。
只是不要忘記刷新你的寫入緩衝區。
相關問題
- 1. 讀取緩衝區C++
- 2. Java - 緩衝區讀取
- 3. 未讀取uart緩衝區
- 4. boost asio讀取緩衝區
- 5. 從緩衝區讀取C
- 6. 按行讀取緩衝區行內容
- 7. HDFS緩衝寫入/讀取操作
- 8. Bash讀取行緩衝區溢出
- 9. JAVA:使用RXTX從串行寫入和讀取緩衝區
- 10. 行緩衝讀取在Perl
- 11. QML:讀取由計算着色器操作的緩衝區
- 12. 什麼是緩衝區?什麼是緩衝讀取和寫入?
- 13. 讀取TCP緩衝
- 14. Java緩衝讀取器讀取
- 15. InputStream讀取緩衝區被分成兩個緩衝區
- 16. 讀取和寫入二進制文件的緩衝區
- 17. 如何清除`TargetDatatLine`讀取緩衝區
- 18. 如何從paquet讀取緩衝區(tftp)
- 19. 從插座讀取緩衝區
- 20. 從NetworkStream中讀取損壞緩衝區
- 21. NodeJS從緩衝區讀取ASCII碼
- 22. 緩衝區被覆蓋,可以讀取
- 23. C recv()不在緩衝區中讀取
- 24. 讀取當前幀緩衝區
- 25. 讀取緩衝區中的* .wav文件
- 26. 讀取刪除的記錄緩衝區
- 27. 寫入/讀取協議緩衝區
- 28. python文件讀取緩衝區邊界
- 29. 從QTcpSocket讀取時的空緩衝區
- 30. 讀取/ proc時刷新流緩衝區
這個問題有點微不足道,所以答案可能有點不明確:用戶緩衝加快速度。如果完成無緩衝的話,有些事情是「效率低下」或「做對的痛苦」。見例如打包bufio的例子。 – Volker
謝謝@Volker。這是真的,我的問題是不確定的。但我從好奇心問這個問題,而不是真正的需要。我想學習新東西:) –
@Sławosz:堆棧溢出問答格式適用於具有簡短事實答案的特定問題。例如:我正在順序閱讀一個大文件。我應該還是不應該讓Buffier I/O,爲什麼?你正在要求一個關於緩衝的論文。這要求太高了。 – peterSO