找個時間可以來try try看
說不定這個已經是舊文不再適用也說不定 :P
==========================================
在Linux下面如果要把記憶體區塊由 A 拷貝到 B,我們除了可以使用memcpy來完成以外,還可以透過mmap來開啟檔案/proc/self/mem,來完成拷貝記憶體區塊的目的。
舉個例子來說,如果我們要把記憶體區塊由A拷貝到B共 chunksize 個bytes,可以透過如下的寫法
memcpy(B, A, chunksize);
透過mmap來做的話,可以藉由以下的寫法
int self;
self = open("/proc/self/mem", O_RDONLY);
B = mmap(B, chunksize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, self, (off_t)A);
也就是透過Linux提供給每個Process的記憶體裝置檔案 mem,來完成記憶體的拷貝動作。
不過,雖然我們可以有這兩種方法可以選擇,可是遇到要拷貝記憶體時,卻不免會遇到要選擇何種方式來實做的問題,因此該網頁的作者寫了一個小程式來測試這兩種方式的優缺點,首先在Linux上每個記憶體的Page大小為512bytes,因此測試時就是利用 512 bytes為 單位來逐漸增加測試的記憶體區塊大小。每個階段都有一個固定的記憶體區塊大小,與兩個內容不同的記憶體區塊作為拷貝時的來源端,每一個循環都會先拷貝一個 來源端到目的的記憶體區塊中,再比較內容,若相同,則拷貝另一個來源端的資料到目的的記憶體區塊中,再比較內容,如此重複10000次(表示共拷貝了20000次到目的記憶體區塊中),藉此來比較memcpy與mmap在執行記憶體區塊拷貝時的效率。
如下表
< 筆者電腦配備: PII 350,64MB RAM>
| memcpy | mmap |
512 | 0.14 | 0.23 |
1024 | 0.26 | 0.35 |
2048 | 0.51 | 0.59 |
4096 | 1.00 | 1.06 |
8192 | 2.56 | 2.10 |
16384 | 5.67 | 4.55 |
32768 | 11.71 | 8.96 |
65536 | 23.63 | 17.75 |
| | |
我們不難發現當記憶體區塊為512、1024、2048、4096時,memcpy都勝過mmap。不過當拷貝的記憶體區塊越來越大時,mmap明顯表現的相當有效率,像最後測試的記憶體區塊大小為65536 bytes,mmap相較於memcpy所花的時間少了約6秒鐘。
由此我們可以了解到,如果在Linux上我們所撰寫的系統需要使用較大的記憶體區塊拷貝時,透過mmap來作或許是一個不錯的選擇。
沒有留言:
張貼留言