[英]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 ++標准都沒有定義這種東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.