๋‚˜์œ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋”

์–ด๋Š ๋‚  ์šฐ์—ฐํžˆ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ๊ฐ€์ƒ ๋จธ์‹ ์—์„œ 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

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€