發表文章

目前顯示的是 六月 25, 2012的文章

C語言巨集定義技巧

轉載自:http://miaozl.spaces.live.com/?_c11_blogpart_blogpart=blogview&_c=blogpart&_c02_owner=1&partqs=amonth%3d2%26ayear%3d2007
C語言巨集定義技巧
1,防止一個頭檔被重複包含 
#ifndef COMDEF_H

#define COMDEF_H

//頭檔內容

#endif 
2,重新定義一些類型,防止由於各種平臺和編譯器的不同,而產生的類型位元組數差異,方便移植。 
typedef unsigned char boolean; /* Boolean value type. */

typedef unsigned long int uint32; /* Unsigned 32 bit value */

typedef unsigned short uint16; /* Unsigned 16 bit value */

typedef unsigned char uint8; /* Unsigned 8 bit value */



typedef signed long int int32; /* Signed 32 bit value */

typedef signed short int16; /* Signed 16 bit value */

typedef signed char int8; /* Signed 8 bit value */
//下面的不建議使用

typedef unsigned char byte; /* Unsigned 8 bit value type. */

typedef unsigned short word; /* Unsinged 16 bit value type. */

typedef unsigned long dword; /* Unsigned 32 bit value type. */

typedef unsigned char uint1; /* Unsigned 8 bit value type. */

typedef unsigned short uint2; /* Unsigned 16 bit value type. */

typedef unsigned long uint4; /* Unsigned 3…

什麼是Zero-Copy?

圖片
from:http://stenlyho.blogspot.tw/2008/08/zero-copy.html 什麼是Zero-Copy?
想要了解這個名詞是指什麼意思的話,讓我們從一個簡單的範例開始,這個範例是server讀取一個檔案,然後把檔案資料經由socket將資料傳送給client。
簡化範例程式如下:

read(file, tmp_buf, len);
write(socket, tmp_buf, len);

Figure 1的圖說明了,這兩行程式實際的運作流程。(1)當執行read函式後,進入Kernel的syscall read(),檔案資料會經由DMA傳到Kernel管的Buffer,然後再由CPU將檔案資料搬到user buffer(tmp_buf)裏。
(2)執行write後,Kernel的syscall write(),再用CPU去把user buffer的資料搬到socket buffer裏,資料進到socket buffer後,會再經由DMA的方式將資料送出去給client。

問題分析:
從整個流程你應該會發現有一堆資料是重覆的,如果能把這些部份改掉,那就可以減少記憶體的消耗並增加效能。
以硬體的角度來看,其實是可以做到直接跳過記憶體的資料暫存的,直接把檔案資料傳到網路去,這樣子的功能是最直接最有效率的,但並不是所有的硬體都支援這種方式。

那我們是否可以減少user buffer這個部份呢?答案是肯定的,我們必需使用mmap來取代read的功能。
簡化範例程式如下:

tmp_buf = mmap(file, len);
write(socket, tmp_buf, len);

Figure 2的圖說明了,這兩行程式實際的運作流程。(1)mmap執行後,如同read system call會將檔案資料經由DMA複製一份到kernel buffer,但不同的地方是,read()會需要把kernel buffer複製到user buffer,mmap()並不會,mmap的user buffer跟kernel buffer是同一個位置,所以mmap可以減少一次CPU copy。
(2)write()執行,把kernel buffer經由CPU複製到socket buffer,然後再經由DMA複製到client去。

問題分析:
但是使用mmap來改善並不是不需要付出代價的,當你使用…