๐ ๊ณต๋ถํ ๋ด์ฉ
๐ - multi-oom`์ memory leak์ ์ธก์ ํ๋ ํ ์คํธ์ธ๋ฐ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ธก์ ํ๋์ง ๊ถ๊ธํด์ ์ฐพ์๋ด :
์ฌ๊ท์ ์ผ๋ก ์์ํ๋ก์ธ์ค๋ฅผ forkํด์ ๋ ์ด์ fork ํ ์ ์์ ๋๊น์ง ์งํํ๊ณ ์ฒ์ forkํ ์ซ์๋ฅผ ์ ์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ 10๋ฒ ๋ฐ๋ณตํ๋ฉด์ ์ฒ์ forkํ ์์ ๋น๊ตํ๋ฉด์ ์ฒ์๊ณผ ๋ค๋ฅด๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ๋์๊ฐ ์๊ธด ๊ฒ์ด๋ฏ๋ก fail์ ๋ฐํํ๊ฒ ๋๋ค.
int
main (int argc UNUSED, char *argv[] UNUSED) {
msg ("begin");
int first_run_depth = make_children ();
CHECK (first_run_depth >= EXPECTED_DEPTH_TO_PASS, "Spawned at least %d children.", EXPECTED_DEPTH_TO_PASS);
for (int i = 0; i < EXPECTED_REPETITIONS; i++) {
int current_run_depth = make_children();
if (current_run_depth < first_run_depth) {
fail ("should have forked at least %d times, but %d times forked",
first_run_depth, current_run_depth);
}
}
msg ("success. Program forked %d iterations.", EXPECTED_REPETITIONS);
msg ("end");
}
multi-oom์ ํ
์คํธ ํ๋ฉด์ fdt๋ฅผ ์ด๊ธฐํ ์ํฌ ๋ palloc_get_page๋ฅผ ์ฌ์ฉํ๋๋ฐ
palloc.c๋ฅผ ๋ณด๋ get_page๋ palloc_get_multiple์์ FDT_PAGES๋ฅผ 1์ ๋ฃ์ด์ ์ฌ์ฉํ๋ ๊ฒ
/* Frees the page at PAGE. */
void
palloc_free_page (void *page) {
palloc_free_multiple (page, 1);
}
๊ทธ๋์ FDT_PAGES๋ฅผ 1๋ก ํ๋ ๊ฒ๊ณผ 2๋ก ํ๋ ๊ฒ์ ์ฐจ์ด๊ฐ ๊ถ๊ธํด์ ์ฐพ์๋ณด๋๊น
palloc_get_multiple(PAL_ZERO, FDT_PAGES);
palloc_get_page(cur->fdt);
PAGE๋ฅผ 2๋ก ํ ๊ฒฝ์ฐ์ fork๋ฅผ ํด์ kernel memory๋ฅผ ์ฑ์ฐ๋ ๊ฒ์ด 1๋ณด๋ค 2๊ฐ ๋ ๋นจ๋ผ์
์คํ์ ํ์ ๋, 1๋ก ํ๋ ๊ฒ๋ณด๋ค 2๋กํ๋๊ฒ ์กฐ๊ธ ๋ ์๊ฐ์ด ๋น ๋ฅด๋ค๋ ๊ฒ์ ์๊ฒ๋จ.
๐ญ ๋๋ ์ & ๋ฐฐ์ด ์
3์ฃผ์ฐจ๋ ๋ ์์ธํ๊ฒ
๐ฅ ๋ด์ผ ๊ณต๋ถํ ๋ด์ฉ
-gitbook
-Virtual Memory
๐๏ธ ํฌ์คํ
ใ ๋์ ์ต๊ด์ ๋ฐ๊พธ๋ ค ํ ๋ ์ฐ๋ฆฌ๊ฐ ์ฆ์ ์ค์ฒํ ์ ์๋ ํ๋์ ๋ฌด์์ผ๊น? ๋ฐ๋๋ก ํ๋ ๊ฒ์ด๋ค! ใ
-์ํฝํ ํ ์ค, ๋ํ๋ก, 1.27. 4
๋ถ๋ฉด์ฆ ํ์๊ฐ ์์ ๋ ๊ธฐ์กด์ ์๋ฃ๊ณ์์๋ ์ด์ ๊ธฐ์ ์ ๊ฐ๋ฅด์น๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ ์ฒ๋ฐฉ์ด์๋ค. ํ์ง๋ง ํ๋ญํด์ ํ์๋ค์๊ฒ "์ ๋ค๋ ค๊ณ ํ์ง๋ง์ธ์"๋ผ๊ณ ๋งํ๋ค. ๊ทธ๋ ๋ฌธ์ ์ ์ด์ ์ ๋ง์ถ์ง ์๋ ๋ฐฉ๋ฒ์ผ๋ก ํ์์ ๊ฐ๋ฐ๊ด๋ ์ ํด๋ฐฉ์์ผฐ๋ค.
์ํ๋ ์ผ์ด ์ด๋ฃจ์ด์ง์ง ์์ ๋ ์ฐ๋ฆฌ๋ ๊ฐ๋ฐ๊ด๋ ์ ํฉ์ธ์ธ๋ค. ๊ทธ๋์ ๊ฐ๋ฐ๊ด๋ ์ ๊ฒ์ผ๋ก๋ ์ฑ๊ณต์ ๋ํ ์์ง์ธ ๋ฏ ๋ณด์ด๋ ์ค์ ๋ก๋ ์ฅ์ ๋ฌผ์ด๋ค. ์ฑ๊ณตํ๊ณ ์ถ๋ค๋ฉด ์ฑ๊ณต์ ๋ํ ์์ง์ธ ๋ฏ ๋ณด์ด๋ ์ค์ ๋ก๋ ์ฅ์ ๋ฌผ์ด๋ค. ์ฑ๊ณตํ๊ณ ์ถ๋ค๋ฉด ์ฑ๊ณต์ ๋ํ '๊ฐ์ง ์์ง'๋ฅผ ๋ฒ๋ ค์ผ ํ๋ค. ์ฑ๊ณต์ ๋ํ ์ง์ง ์์ง๋ ์ญ์ค์ ์ผ๋ก ์ฑ๊ณต์ ์๊ฐํ์ง ์๋ ๊ฒ์ด๋ค. ์คํจ์ ๋ํ ๋๋ ค์๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. ์คํจํ๊ณ ์ถ์ง ์๋ค๋ฉด ์คํจ์ ๋ํ ์๊ฐ ์์ฒด๋ฅผ ๋ฒ๋ ค์ผ ํ๋ค.
์ฌ๊ธฐ์ ์ด์ ์ ํ๋ ์๊ฐ์ด ๋ ์ค๋ฅธ๋ค. ํ์๋ ์ต์ ์ ์ํฉ์ ๊ณ ๋ คํ๋ค๋ ๋ง๊ณผ ์ฑ๊ณตํ ์ฌ๋๋ค์ ๋ง์ด๋ค ์ ์คํจ๋ฅผ ๋จผ์ ์๊ฐํ๋๊ณ ์ด๊ฒ ๋ฌด์์ด ๋ค๋ฅธ์ง๊ฐ ๊ถ๊ธํ๋๋ฐ, ์ฌ๊ธฐ์ ์ต์ ์ ์ํฉ์ ๊ณ ๋ คํ๋ ๊ฒ๊ณผ ์คํจ๋ฅผ ์๊ฐํ๋ ๊ฒ์ ์์ฐํ ๋ค๋ฅด๋ค. ์คํจ์ ๋ํ ์๊ฐ ์์ฒด๋ฅผ ๋ฒ๋ฆฌ๊ณ ์ต์ ์ ์ํฉ์ ๊ณ ๋ คํ์ฌ ์ค๋น๋ฅผ ๋ ๋จ๋จํ ํ๋๊ฒ ๊ฒฐ๊ตญ ์ณ์ ๊ฒ ๊ฐ๋ค.
ใ ์ด๋ป๊ฒ ๋์์ค ์ ์๋ค๋ ๋ง์ธ๊ฐ? ๋ถํํ ์๋ก ๋ถ์ด์ ๋์ฑ ๋ฌด๊ฑฐ์์ง๋ ๊ฒ์. ์ญ๊ฒฝ์ ํฌํ๋นํ๋ ๊ฒ๋ณด๋ค ์์๊ฒ ์ด์ธ๋ฆฌ๋ ๊ฒ์ด ์ด๋ ์๋๊ฐ? ๊ทธ์ ์ง์๊ฐ ํ๋ค๋ฆด์๋ก, ๊ถ์ข์์ ๊ธ๋ฐฉ์ด๋ผ๋ ๋จ์ด์ง ๊ฒ ๊ฐ์์๋ก ์งํค๊ณ ์ธ์์ผ ํ๋ ๊ฒ์ด ๋ถ๋ช ํ๊ฑฐ๋, ์ด๋ช ์์์ ๋ฌผ๋ฌ์๋ ๊ฒ์ด ์ด์ฐ ์ฉ๋งนํ ์ผ์ธ๊ฐ! ใ
-์ธ๋ค์นด, ์ค์ด๋ํธ์ค, 80
์ํฐ ๋ฒ ํ ๊ฑฐ๋ ์ด์ฌํ์ ์ธ๋ฌผ์ ์ฑ์ฉํ๊ธฐ ์ํด ๋จ ํ๊ฐ์ง์ ๋ฐฉ๋ฒ์ ์ฐ๋๋ฐ ๊ทธ๊ฒ์ ์์ ์ ์์นจ ์์ฌ ์๋ฆฌ์ ํ๋ณด์๋ฅผ ์ด๋ํ๊ณ , ์๋น๋งค๋์ ์๊ฒ ๊ณ ์์ ์ผ๋ก ์์ฌ ์ฃผ๋ฌธ์ ์๋ง์ผ๋ก ๋ง๋ค๊ฒ ํ๋ค.
ํ๋ณด์๊ฐ ํ๋ฅผ ๋ด๊ฑฐ๋ ๋ฌด๋กํ๊ฒ ๋ฐ์ํ๋ฉฐ ์ฌ์ํ ์ผ๋ก ์ค์ํ ์๋ฆฌ๋ฅผ ๋ง์น๋๊ฐ? ์๋๋ฉด ์ฐ์ํ๊ณ ์ธ๋ จ๋ ํ๋๋ก ๋ถํธํจ์ ๋ค๋ฃจ๋๊ฐ?
์์ ์ญ๊ฒฝ๊ณผ ๋ถ๋ชํ์ ๋ ์๋ฌด๋ ์ง๋ ์๊ฒ ๋ฐ์ํ๋ ๊ฒ์ ๊ฒฐ์ฝ ์ฌ์ํ ๋ฅ๋ ฅ์ด ์๋๋ค. ๊ฑฐ๊ธฐ์ ๋ชจ๋ ์ญ๋์ด ๋๋ฌ๋๋ค.