์ด๋ ๋ ์ฐ์ฐํ ์ฌ์ฉ์๊ฐ ์์ ์ ๊ฐ์ ๋จธ์ ์์ RAM ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ๋ ค๊ณ ํ๋ ์ฝ๋๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ด ์ฝ๋๋ ์ ๊ณตํ์ง ์๊ณ (๊ฑฐ๊ธฐ์ "๋ฐ๋ณด"๊ฐ ์์) ๊ฐ์ฅ ํ์์ ์ธ ๊ฒ๋ง ๋จ๊ฒจ๋๊ฒ ์ต๋๋ค. ๊ทธ๋์ ๊ณ ์์ด๊ฐ ์คํ๋์ค์ ์์ด์!
#include <sys/time.h>
#include <string.h>
#include <iostream>
#define CNT 1024
#define SIZE (1024*1024)
int main() {
struct timeval start;
struct timeval end;
long millis;
double gbs;
char ** buffers;
buffers = new char*[CNT];
for (int i=0;i<CNT;i++) {
buffers[i] = new char[SIZE];
}
gettimeofday(&start, NULL);
for (int i=0;i<CNT;i++) {
memset(buffers[i], 0, SIZE);
}
gettimeofday(&end, NULL);
millis = (end.tv_sec - start.tv_sec) * 1000 +
(end.tv_usec - start.tv_usec) / 1000;
gbs = 1000.0 / millis;
std::cout << gbs << " GB/sn";
for (int i=0;i<CNT;i++) {
delete buffers[i];
}
delete buffers;
return 0;
}
๊ฐ๋จํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ ์ฌ๊ธฐ์ XNUMXGB๋ฅผ ์ฐ์ธ์. ๊ทธ๋ฆฌ๊ณ ์ด ํ ์คํธ๋ ๋ฌด์์ ๋ณด์ฌ์ฃผ๋์?
$ ./memtest
4.06504 GB / ์ด
์ฝ 4GB/s.
๋ฌด์?!?!
์ด๋ป๊ฒ?!?!?
์ด๊ฒ์ Core i7(์ต์ ์ ์๋์ง๋ง), DDR4์ ๋๋ค. ํ๋ก์ธ์๊ฐ ๊ฑฐ์ ๋ก๋๋์ง ์์์ต๋๋ค. ์?!?!
์ธ์ ๋ ๊ทธ๋ ๋ฏ์ด ๋๋ต์ ์ ๋ํ ํ๋ฒํฉ๋๋ค.
new ์ฐ์ฐ์(malloc ํจ์์ ๊ฐ์)๋ ์ค์ ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ์ง ์์ต๋๋ค. ์ด ํธ์ถ์ ํตํด ํ ๋น์๋ ๋ฉ๋ชจ๋ฆฌ ํ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ์์น ๋ชฉ๋ก์ ๋ณด๊ณ , ์๋ฌด๊ฒ๋ ์์ผ๋ฉด sbrk()๋ฅผ ํธ์ถํ์ฌ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๋ฅผ ๋๋ฆฐ ๋ค์ ์ ์์น์ ์ฃผ์์ ๋ํ ์ฐธ์กฐ๋ฅผ ํ๋ก๊ทธ๋จ์ ๋ฐํํฉ๋๋ค. ํ ๋น๋จ.
๋ฌธ์ ๋ ํ ๋น๋ ์์ญ์ด ์์ ํ ๊ฐ์์ด๋ผ๋ ์ ์ด๋ค. ์ค์ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง๋ ํ ๋น๋์ง ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ํ ๋น๋ ์ธ๊ทธ๋จผํธ์์ ๊ฐ ํ์ด์ง์ ๋ํ ์ฒซ ๋ฒ์งธ ์ก์ธ์ค๊ฐ ๋ฐ์ํ๋ฉด MMU๋ ํ์ด์ง ์ค๋ฅ๋ฅผ "์ดฌ์"ํ ํ ์ก์ธ์ค๋๋ ๊ฐ์ ํ์ด์ง์ ์ค์ ํ์ด์ง๊ฐ ํ ๋น๋ฉ๋๋ค.
๋ฐ๋ผ์ ์ค์ ๋ก ์ฐ๋ฆฌ๋ ๋ฒ์ค ๋ฐ RAM ๋ชจ๋์ ์ฑ๋ฅ์ ํ ์คํธํ๋ ๊ฒ์ด ์๋๋ผ ์ด์ ์ฒด์ ์ MMU ๋ฐ VMM ์ฑ๋ฅ์ ํ ์คํธํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ RAM์ ์ค์ ์ฑ๋ฅ์ ํ ์คํธํ๋ ค๋ฉด ํ ๋น๋ ์์ญ์ ํ ๋ฒ๋ง ์ด๊ธฐํํ๋ฉด ๋ฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
#include <sys/time.h>
#include <string.h>
#include <iostream>
#define CNT 1024
#define SIZE (1024*1024)
int main() {
struct timeval start;
struct timeval end;
long millis;
double gbs;
char ** buffers;
buffers = new char*[CNT];
for (int i=0;i<CNT;i++) {
// FIXED HERE!!!
buffers[i] = new char[SIZE](); // Add brackets, &$# !!!
}
gettimeofday(&start, NULL);
for (int i=0;i<CNT;i++) {
memset(buffers[i], 0, SIZE);
}
gettimeofday(&end, NULL);
millis = (end.tv_sec - start.tv_sec) * 1000 +
(end.tv_usec - start.tv_usec) / 1000;
gbs = 1000.0 / millis;
std::cout << gbs << " GB/sn";
for (int i=0;i<CNT;i++) {
delete buffers[i];
}
delete buffers;
return 0;
}
์ฆ, ํ ๋น๋ ๋ฒํผ๋ฅผ ๊ธฐ๋ณธ๊ฐ(char 0)์ผ๋ก ์ด๊ธฐํํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
์ฐ๋ฆฌ๋ ๋ค์์ ํ์ธํฉ๋๋ค.
$ ./memtest
28.5714 GB / ์ด
๋ ํ๋.
๊ตํ: ๋น ๋ฅด๊ฒ ์์
ํ๊ธฐ ์ํด ํฐ ๋ฒํผ๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ด๊ธฐํํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.
์ถ์ฒ : habr.com