❶ 什麼是FIFO緩存隊列
FIFO是英文First In First Out 的縮寫,是一種先進先出的數據緩存器,他與普通存儲器的區別是沒有外部讀寫地址線,這樣使用起來非常簡單,但缺點就是只能順序寫入數據,順序的讀出數據,其數據地址由內部讀寫指針自動加1完成,不能像普通存儲器那樣可以由地址線決定讀取或寫入某個指定的地址。 FIFO一般用於不同時鍾域之間的數據傳輸,比如FIFO的一端時AD數據採集,另一端時計算機的PCI匯流排,假設其AD採集的速率為16位 100K SPS,那麼每秒的數據量為100K×16bit=1.6Mbps,而PCI匯流排的速度為33MHz,匯流排寬度32bit,其最大傳輸速率為1056Mbps,在兩個不同的時鍾域間就可以採用FIFO來作為數據緩沖。另外對於不同寬度的數據介面也可以用FIFO,例如單片機位8位數據輸出,而DSP可能是16位數據輸入,在單片機與DSP連接時就可以使用FIFO來達到數據匹配的目的。 3.FIFO的一些重要參數 FIFO的寬度:也就是英文資料里常看到的THE WIDTH,它只的是FIFO一次讀寫操作的數據位,就像MCU有8位和16位,ARM 32位等等,FIFO的寬度在單片成品IC中是固定的,也有可選擇的,如果用FPGA自己實現一個FIFO,其數據位,也就是寬度是可以自己定義的。 FIFO的深度:THE DEEPTH,它指的是FIFO可以存儲多少個N位的數據(如果寬度為N)。如一個8位的FIFO,若深度為8,它可以存儲8個8位的數據,深度為12 ,就可以存儲12個8位的數據,FIFO的深度可大可小,個人認為FIFO深度的計算並無一個固定的公式。在FIFO實際工作中,其數據的滿/空標志可以控制數據的繼續寫入或讀出。在一個具體的應用中也不可能由一些參數算數精確的所需FIFO深度為多少,這在寫速度大於讀速度的理想狀態下是可行的,但在實際中用到的FIFO深度往往要大於計算值。一般來說根據電路的具體情況,在兼顧系統性能和FIFO成本的情況下估算一個大概的寬度和深度就可以了。而對於寫速度慢於讀速度的應用,FIFO的深度要根據讀出的數據結構和讀出數據的由那些具體的要求來確定。 滿標志:FIFO已滿或將要滿時由FIFO的狀態電路送出的一個信號,以阻止FIFO的寫操作繼續向FIFO中寫數據而造成溢出(overflow)。 空標志:FIFO已空或將要空時由FIFO的狀態電路送出的一個信號,以阻止FIFO的讀操作繼續從FIFO中讀出數據而造成無效數據的讀出(underflow)。 讀時鍾:讀操作所遵循的時鍾,在每個時鍾沿來臨時讀數據。 寫時鍾:寫操作所遵循的時鍾,在每個時鍾沿來臨時寫數據。 讀指針:指向下一個讀出地址。讀完後自動加1。 寫指針:指向下一個要寫入的地址的,寫完自動加1。 讀寫指針其實就是讀寫的地址,只不過這個地址不能任意選擇,而是連續的。 4.FIFO的分類 根均FIFO工作的時鍾域,可以將FIFO分為同步FIFO和非同步FIFO。同步FIFO是指讀時鍾和寫時鍾為同一個時鍾。在時鍾沿來臨時同時發生讀寫操作。非同步FIFO是指讀寫時鍾不一致,讀寫時鍾是互相獨立的。 5.FIFO設計的難點 FIFO設計的難點在於怎樣判斷FIFO的空/滿狀態。為了保證數據正確的寫入或讀出,而不發生益處或讀空的狀態出現,必須保證FIFO在滿的情況下,不能進行寫操作。在空的狀態下不能進行讀操作。怎樣判斷FIFO的滿/空就成了FIFO設計的核心問題。由於同步FIFO幾乎很少用到,這里只描述非同步FIFO的空/滿標志產生問題。 補充: 在用到觸發器的設計中,不可避免的會遇到亞穩態的問題(關於亞穩態這里不作介紹,可查看相關資料)。在涉及到觸發器的電路中,亞穩態無法徹底消除,只能想辦法將其發生的概率將到最低。其中的一個方法就是使用格雷碼。格雷碼在相鄰的兩個碼元之間只由一位變換(二進制碼在很多情況下是很多碼元在同時變化)。這就會避免計數器與時鍾同步的時候發生亞穩態現象。但是格雷碼有個缺點就是只能定義2^n的深度,而不能像二進制碼那樣隨意的定義FIFO的深度,因為格雷碼必須循環一個2^n,否則就不能保證兩個相鄰碼元之間相差一位的條件,因此也就不是真正的各雷碼了。第二就是使用冗餘的觸發器,假設一個觸發器發生亞穩態的概率為P,那麼兩個及聯的觸發器發生亞穩態的概率就為P的平方。但這回導致延時的增加。亞穩態的發生會使得FIFO出現錯誤,讀/寫時鍾采樣的地址指針會與真實的值之間不同,這就導致寫入或讀出的地址錯誤。由於考慮延時的作用,空/滿標志的產生並不一定出現在FIFO真的空/滿時才出現。可能FIFO還未空/滿時就出現了空/滿標志。這並沒有什麼不好,只要保證FIFO不出現overflow or underflow 就OK了。 很多關於FIFO的文章其實討論的都是空/滿標志的不同演算法問題。 在Vijay A. Nebhrajani的《非同步FIFO結構》一文中,作者提出了兩個關於FIFO空/滿標志的演算法。 第一個演算法:構造一個指針寬度為N+1,深度為2^N位元組的FIFO(為便方比較將格雷碼指針轉換為二進制指針)。當指針的二進制碼中最高位不一致而其它N位都相等時,FIFO為滿(在Clifford E. Cummings的文章中以格雷碼表示是前兩位均不相同,而後兩位LSB相同為滿,這與換成二進製表示的MSB不同其他相同為滿是一樣的)。當指針完全相等時,FIFO為空。這也許不容易看出,舉個例子說明一下:一個深度為8位元組的FIFO怎樣工作(使用已轉換為二進制的指針)。FIFO_WIDTH=8, 補充: FIFO_DEPTH= 2^N = 8,N = 3,指針寬度為N+1=4。起初rd_ptr_bin和wr_ptr_bin均為「0000」。此時FIFO中寫入8個位元組的數據。wr_ptr_bin =「1000」,rd_ptr_bin=「0000」。當然,這就是滿條件。現在,假設執行了8次的讀操作,使得rd_ptr_bin =「1000」,這就是空條件。另外的8次寫操作將使wr_ptr_bin 等於「0000」,但rd_ptr_bin 仍然等於「1000」,因此FIFO為滿條件。 顯然起始指針無需為「0000」。假設它為「0100」,並且FIFO為空,那麼8個位元組會使wr_ptr_bin =「1100」,, rd_ptr_bin 仍然為「0100」。這又說明FIFO為滿。若寫指針的高兩位MSB大於讀指針的高兩位MSB則FIFO為「幾乎空」。 在Vijay A. Nebhrajani的《非同步FIFO結構》第三部分的文章中也提到了一種方法,那就是方向標志與門限。設定了FIFO容量的75%作為上限,設定FIFO容量的25%為下限。當方向標志超過門限便輸出滿/空標志,這與Clifford E. Cummings的文章中提到的STYLE #2可謂是異曲同工。他們都屬於保守的空滿判斷。其實這時輸出空滿標志FIFO並不一定真的空/滿。 說到此,我們已經清楚地看到,FIFO設計最關鍵的就是產生空/滿標志的演算法的不同產生了不同的FIFO。
❷ 硬碟緩存有什麼作用
硬碟的緩存主要起三種作用:
1預讀取
當硬碟受到CPU指令控制開始讀取數據時,硬碟上的控制晶元會控制磁頭把正在讀取的簇的下一個或者幾個簇中的數據讀到緩存中(由於硬碟上數據存儲時是比較連續的,所以讀取命中率較高),當需要讀取下一個或者幾個簇中的數據的時候,硬碟則不需要再次讀取數據,直接把緩存中的數據傳輸到內存中就可以了,由於緩存的速度遠遠高於磁頭讀寫的速度,所以能夠達到明顯改善性能的目的。
對寫入動作進行緩存
2是對寫入動作進行緩存。當硬碟接到寫入數據的指令之後,並不會馬上將數據寫入到碟片上,而是先暫時存儲在緩存里,然後發送一個「數據已寫入」的信號給系統,這時系統就會認為數據已經寫入,並繼續執行下面的工作,而硬碟則在空閑(不進行讀取或寫入的時候)時再將緩存中的數據寫入到碟片上。雖然對於寫入數據的性能有一定提升,但也不可避免地帶來了安全隱患——如果數據還在緩存里的時候突然掉電,那麼這些數據就會丟失。對於這個問題,硬碟廠商們自然也有解決辦法:掉電時,磁頭會藉助慣性將緩存中的數據寫入零磁軌以外的暫存區域,等到下次啟動時再將這些數據寫入目的地。
臨時存儲最近訪問過的數據
3是臨時存儲最近訪問過的數據。有時候,某些數據是會經常需要訪問的,硬碟內部的緩存會將讀取比較頻繁的一些數據存儲在緩存中,再次讀取時就可以直接從緩存中直接傳輸。緩存就像是一台計算機的內存一樣,在硬碟讀寫數據時,負責數據的存儲、寄放等功能。這樣一來,不僅可以大大減少數據讀寫的時間以提高硬碟的使用效率。同時利用緩存還可以讓硬碟減少頻繁的讀寫,讓硬碟更加安靜,更加省電。更大的硬碟緩存,你將讀取游戲時更快,拷貝文件時候更快,在系統啟動中更為領先……
❸ 什麼是數據緩沖區
這個嘛!簡單點說就是像一條只能同時通過200輛車的路,但現在來了250輛車但這條路只能過200輛那該怎麼辦呢!那你一定會說把那多出的50輛車先放在一邊等200輛車過了在過對不。「數據緩沖區」就是這樣的道理他將處理不過來的切並不重要的數據先放到一個地方等重要的數據處理完了,再來處理這些數據。以便提高處理數據的處理速度和資源的利用率!
可能答得並不是很好@_@但大體也差不多!!!希望能對你所幫助!!!
❹ 編寫一個環形緩沖circularbuffer
private FileOutputStream fos = null;
public void wit(String s, File f) throws IOException{
if(fos==null){
fos = new FileOutputStream(f);
}
byte[] b = s.getBytes();
fos.write(b, 0, b.length);
fos.flush();
}
wit裡面要傳的s是要寫入的字元串,f是要寫如那個文件的文件對象
第二個方法的問題你能不能再詳細點 沒明白
❺ 數據緩沖器和數據緩存器的區別
這位知道朋友你好!關於緩沖器與緩存器的區別回答如下,請參考:緩存是硬碟控制器上的一塊內存晶元,具有極快的存取速度,它是硬碟內部存儲和外界介面之間的緩沖器。由於硬碟的內部數據傳輸速度和外界介面傳輸速度不同,緩存在其中起到一個緩沖的作用。緩存的大小與速度是直接關繫到硬碟的傳輸速度的重要因素,能夠大幅度地提高硬碟整體性能。當硬碟存取零碎數據時需要不斷地在硬碟與內存之間交換數據,如果有大緩存,則可以將那些零碎數據暫存在緩存中,減小外系統的負荷,也提高了數據的傳輸速度。
緩沖器的特點是:系統自動地在內存區為每一個正在使用的文件開辟一個緩沖
區。從磁碟向內存讀入數據時,則一次從磁碟文件將一些數據輸入到內存緩沖區(充滿緩
沖區),然後再從緩沖區逐個地將數據送給接收變數;向磁碟文件輸出數據時,先將數據
送到內存中的緩沖區,裝滿緩沖區後才一起送到磁碟去。用緩沖區可以一次讀入一批數據,
或輸出一批數據,而不是執行一次輸入或輸出函數就去訪問一次磁碟,這樣做的目的是減
少對磁碟的實際讀寫次數,因為每一次讀寫都要移動磁頭並
尋找磁軌扇區,花費一定的時
間。緩沖區的大小由各個具體的C
版本確定,一般為512
位元組。
❻ 緩沖區是什麼
指由多個以不同速度或優先順序運行的硬體或程序進程共享的數據存儲區,在其中暫時保存數據。緩沖區使進程之間的相互等待變少了。先結束的進程可以把結果放入緩沖區內,進行下面的工作,而後做完的進程可以從緩沖區內取出原來的數據繼續工作。緩沖區的作用是:在高速和低速設備之間起一個速度平滑作用;暫時存儲數據;經常訪問的數據可以放進緩沖區,減少對慢速設備的訪問以提高系統的效率。
❼ 計算機裡面的緩沖和緩存是什麼意思
緩沖器相當於一個寄存器,暫時保存數據。緩沖區是內存中存放數據的地方。在程序試圖將數據放到機器內存中的某一個位 置的時候,因為沒有足夠的空間就會發生緩沖區溢出。而人為的溢出則是有一定企圖的,攻擊者寫一個超過緩沖區長度的字元串,然後植入到緩沖區,而再向一個有 限空間的緩沖區中植入超長的字元串可能會出現兩個結果,一是過長的字元串覆蓋了相鄰的存儲單元,引起程序運行失敗,嚴重的可導致系統崩潰;另有一個結果就 是利用這種漏洞可以執行任意指令,甚至可以取得系統root特級許可權。大多造成緩沖區溢出的原因是程序中沒有仔細檢查用戶輸入參數而造成的。
緩沖區是程序運行的時候機器內存中的一個連續塊,它保存了給定類型的數據,隨著動態分配變數會出現問題。大多時為了不佔用太多的內存,一個有動態分配變數 的程序在程序運行時才決定給它們分配多少內存。這樣想下去的話,如果說要給程序在動態分配緩沖區放入超長的數據,它就會溢出了。一個緩沖區溢出程序使用這 個溢出的數據將匯編語言代碼放到機器的內存里,通常是產生root許可權的地方,這就不是什麼好現象了。僅僅就單個的緩沖區溢出惹眼,它並不是最大的問題根 本所在。但如果溢出送到能夠以root許可權運行命令的區域,一旦運行這些命令,那可就等於把機器拱手相讓了。
緩存:它事實上相當於一個臨時倉庫。每次打開一個網頁,IE會自動創建一份該網頁文字和圖像的緩存文件(一個臨時副本)。當再次打開該頁時,IE會檢查網 站伺服器上該頁的變化。如果頁面變化了,IE從網路上重新下載新的網頁。如果該頁面沒有變化,IE就從內存或硬碟上使用緩存中的臨時復本來顯示它。
IE會在緩存中保留網頁到硬碟,直到各自的緩存占滿空間;IE則根據網頁的時間和空間來向下取捨。這樣設計的目的是為了更快地裝載頁面。
緩存不僅可以用來加快網頁載入速度,而且當需要查看以前看過的網頁時,還可以無需驅動「小貓」,只需單擊IE上的「文件→離線工作」菜單命令,然後單擊工具欄上的「歷史」按鈕,即可方便地進行瀏覽。
既然IE緩存有這個妙處,那自然應該共享它了。除了直接復制緩存文件的方法外,還有大搬家—更改IE緩存的保存路徑法: 首先打開IE瀏覽器,單擊「工具→Internet選項」菜單命令,打開「Internet選項」對話框。在「常規」選項卡中單擊「Internet臨時 文件」部分的「設置」按鈕,打開「設置」對話框,單擊「移動文件夾」按鈕,在打開的「瀏覽文件夾」對話框里定位到另一個分區下的某個路徑,然後單擊「確定 」按鈕即可
❽ 數據緩沖區的緩沖區的分類
緩沖分為兩類,完全緩沖和行緩沖。對於完全緩沖來說,緩沖區滿時,緩沖區會被清空。此時緩沖區中的內容也會發往目的地。這種類型的緩沖通常出現在文件輸入中。緩沖區的大小取決於系統。但512和4096位元組的緩沖區大小比較常見,對於行緩沖來說,遇到一個換行字元時,緩沖區中的內容就會被清空。鍵盤輸入是標準的行緩沖。因此按下回車,緩沖就會被清空。
❾ 環形緩沖區為什麼是lock-free的
回答這個問題之前,首先解釋一下,什麼叫lock-free?lock-free就是絕對無鎖。那麼為什麼在環形緩沖區中不需要上鎖呢?下面我將從三個方面來解釋這個問題,首先先解釋什麼是環形緩沖區,然後再來了解lock-free的三個必要前提,最後才解釋在環形緩沖區絕對無鎖的原因。
環形緩沖區的本質
所謂的環形緩沖區,其實就是使用一個環形的緩沖區域作為數據循環結構。可以插入數據、刪除數據,通過改變了隊列中的首尾來達到空間的分配和釋放。
lock-free的三個前提
這其中有三個前提,一是cpu支持內存柵欄,二是數據的地址必須是四對齊的,三是必須是一個生產者對應一個消費者。這三個必要前提缺一不可,否則就沒有辦法實現lock-free了。
以上就是我對這個問題的簡單解釋。因個人經驗有限,所以其中有問題的地方,也歡迎大家指出。