簡體   English   中英

如何使用C緩沖並向磁盤寫入低延遲輸入

[英]How to buffer and write to disk a low latency input with C

我需要編寫C代碼(不是C#或C ++)來從硬件分析器(通過100Mb TCP / IP網絡)獲取數據並將其寫入磁盤。

為什么我說“低延遲”,好吧,硬件分析器有一個9KB的內部緩沖區,這是2ms的數據存儲,之后它會遇到緩沖區溢出而丟失信息包。

我的應用程序能夠獲取此緩沖區而不會丟失任何數據包,但我注意到我無法以此速率將數據寫入磁盤。

我的代碼看起來像這樣:

int main (int argc, char * argv [] )
{
  pthread_t th_rx; /* Thread for receiving packets */

  outputfile = fopen ("output.log", "wb");

  link_open(); // open device link

  pthread_create ( &th_rx, NULL, read_packets, 0 );

  // running loop
  fclose (outputfile);
  pthread_exit(NULL);
  link_close(); // close device link 
  return 0; 
}

static thread_result read_packets (void *arg)
{
  char  rxbuf[40960];

  while (receiving)
  {
    bytes_received = read_packet(); //read packet from device buffer
    rxbuf = extract_data(bytes_received);
    fwrite (rxbuf, 1, bytes_received, outputfile); 
  }
  return thread_return;
}

我在這里需要的是如何做到這一點的想法。

  • 1:收到后不寫包,創建一個循環? 緩沖
  • 2:創建2個線程循環緩沖區?

有關如何改進我的代碼以及我可以做些什么以獲得穩定寫入的任何想法?

代碼示例將非常感激,因為我感到迷茫:(

謝謝

正如你猜對了,你應該做的第一件事就是,在你從設備上閱讀時不要寫入磁盤。

  • 創建循環/環形緩沖區(或僅緩沖區列表)以存儲從設備讀取的數據。 此操作足夠快,因此設備內存不會填滿。

    • 但是,如果設備讀取是非阻塞的,您可能希望o決定休眠,以便您的循環不會占用cpu。
  • 一個線程從設備讀取數據並放入緩沖區。

  • 在另一個線程中,繼續將緩沖區寫入磁盤。

正如你所說,hw分析儀只有2 ms 9 kb內存。 然后寫入HDD所需的速度是9*1024*500 = 4608000 b/s or 4.6 Mb/s 我相信測試計算機在HDD上的寫入速度至少為10 Mb / s。 因此,這里唯一的問題是寫入具有如此大部分數據的HDD,這可以給寫入足夠的時間。 例如,緩沖區可以是1秒或4.6 Mb。 存儲這樣的數據部分將比從hw設備收集1s數據更快,並且“寫線程”花費不超過500ms來完成其工作。 在實際程序中,這個時間可能會有所不同,但對於單核系統來說,它也必須足夠。
因此,您可以使用兩個乒乓 (一個填充來自hw的數據,一個存儲到HDD)緩沖區,具有兩個線程且沒有循環緩沖區。 因此,您可以使用生產者/消費者模型,這個模型描述得很好並且有很多例子。


您應該研究異步I / O. 但是Async-I / O API依賴於操作系統,您沒有指定您正在使用的操作系統。 你使用線程也沒有意義。 如果你想使用線程(而不是異步I / O),那么你就有一個線程正在讀取數據包而另一個線程應該寫入。 將它們放在一個線程中就沒有任何好處。

暫無
暫無

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

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