簡體   English   中英

每個fread / fwrite有多少個隨機/順序訪問?

[英]How many random / sequential access per fread / fwrite?

關於C文件I / O,我有以下問題。

在物理級別(硬盤驅動器)上,假設每個fread(n_blocks, size, length,FILE fp)操作應該對第一頁(塊)進行一次隨機訪問,對下一個塊進行n-1次順序訪問是否有效?相同的緩沖區

我以為這是因為OS有這么多的流程,主要是確保他們中的一個也寫入或從每個之間的文件讀取fread本地程序,並通過這樣的假設硬盤驅動器被放置在另一個部門/筒。

這個假設可以嗎?

您可以假設您想要的任何東西,實際上這要復雜得多。

fread/fwrite通常會在進程內存中的內部緩沖區中進行讀寫操作。 當緩沖區已滿/為空時,它們會將讀/寫轉發給具有自己的緩存的操作系統 如果您正在讀取並且操作系統無法在高速緩存中找到文件的那部分,那么您的程序將等到實際從硬盤驅動器中獲取數據,這是一項昂貴的操作。 如果您正在寫,那么數據將被復制到OS緩存中並駐留在該緩存中,直到將其刷新到磁盤為止,這可能在程序關閉文件后很長時間才會發生。 然后,當今的硬盤驅動器又會擁有自己的緩存,操作系統甚至可能不知道。

不,這不對。 如果文件系統是零散的,則單個文件的塊可能會分散在整個硬盤上。

不,這不對。 您甚至無法假設fread會觸發物理I / O。 您的OS可以對I / O請求做很多事情,包括緩存結果,重新排序和合並(或拆分)讀取(甚至有時寫入)。

如果正在進行大量I / O,則您也不能指望獲得順序讀取,這取決於您(以及可能的I / O流庫)使用的緩沖區大小。 某些操作系統提供了“提示”您將在文件描述符(或mmap ed區域)上順序讀取的方法,這可能會有所幫助。

從應用程序程序員的角度來看,讀取塊的確切過程是不確定的。 一切都取決於磁盤調度程序,該磁盤調度程序同時組織來自多個進程的多個請求的訪問操作。 有多種算法可以解決此問題 ,但過於簡單的思考(1個隨機搜索,n個順序搜索)根本不現實。 最后,出於明確的原因,C標准和C ++標准都沒有定義這種東西。

正如許多人所解釋的,必須考慮緩存(可能在多個級別)。

也許您想知道如何從C代碼中加速或調整它。 這是高度特定於操作系統的。

在最新的Linux系統上,您可以使用readaheadmadvise (帶有mmap )和其他系統調用。

通常,您可以簡單地預先讀取一個文件(也許只使用cat yourfile > /dev/null ),然后您的程序將在Linux上運行得更快。

例如,嘗試在某個大文件上運行兩次wc單詞計數實用程序。 第二輪通常比第一輪快得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM