์ˆ˜์—…/os

[os] memory management

์š”๋Œœ๋‹ค 2022. 11. 26. 22:01

1) ์•„๋ž˜ ํ”„๋กœ๊ทธ๋žจ์˜ memory map์„ ๊ทธ๋ ค๋ผ. code, data, heap, stack segment์˜ ์‹œ์ž‘ ์ฃผ์†Œ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ๊ฐ ์„ธ๊ทธ๋จผํŠธ๋Š” ๋ช‡ ํŽ˜์ด์ง€๋ฅผ ์ฐจ์ง€ํ•˜๊ณ , ์ฃผ์š” ๊ธฐ๋Šฅ์˜ ์ฃผ์†Œ, ์ „์—ญ/์ง€์—ญ ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๋Š” ๋ฌด์—‡์ธ๊ฐ€?

 

week13/ex1.cpp
pid = 4697

๋‹ค์Œ์€ logical  ์ฃผ์†Œ๋ฅผ ์˜๋ฏธํ•˜๋ฏ€๋กœ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๋Š” ์œ„์น˜๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” Process Table์„ ์—ด์–ด Physical ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

result :

Code 08048000-08049000 &main
Read-Only Data 08049000-0804a000  
Data 0804a000-0804b000 &x, &y
Heap 0804b000-08075000, b7e22000-b7e23000 &y[9999], pk
C Library Code b7e23000-b7f4d000  
C Library Data b7f4d000-b7f50000  
Library Loader b7f58000-b7f74000  
Stack bfc5f000-bfc74000 &k, &pk

 

mainํ•จ์ˆ˜๋Š” code ์˜์—ญ์— ์กด์žฌํ•˜๊ณ , x์™€ y[10000]์€ ์ „์—ญ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•ด์ฃผ์–ด Data ์˜์—ญ์— ์œ„์น˜ํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋งค์šฐ ํฐ ์ „์—ญ๋ณ€์ˆ˜์™€ ๋™์ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋Š” heap์˜์—ญ, ์ง€์—ญ๋ณ€์ˆ˜๋Š” stack ์˜์—ญ์— ํ• ๋‹น๋œ๋‹ค.

 

2) ๋‹ค์Œ ํ”„๋กœ๊ทธ๋žจ์˜ memory map์„ ํ‘œ์‹œํ•ด๋ผ.

week13/ex2.c
cat /proc/pid/maps

Code 8048-8049 &main
Data 804a-804b &A
Heap 804b-8050 &A[4][1024]
Stack bf949-bf95e &i, &j

๊ธฐ๋ณธ์ ์œผ๋กœ Page์˜ ํฌ๊ธฐ๋Š” 4KB์ด๊ธฐ ๋•Œ๋ฌธ์— "/proc/pid/maps"์—์„œ 0x1000๋‹น ํ•œ Page๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์ž‘๊ณผ ๋ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์—์„œ ๋’ค 3์ž๋ฆฌ๋ฅผ ์ œํ•˜๋ฉด Page ๋ฒˆํ˜ธ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์€ Code(main) -> Data(์ „์—ญ๋ณ€์ˆ˜) -> Heap(์ „์—ญ๋ณ€์ˆ˜) -> Stack(์ง€์—ญ๋ณ€์ˆ˜) ์ˆœ์œผ๋กœ ์ ‘๊ทผํ•œ๋‹ค.

 

3) 2๋ฒˆ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ช‡ ํŽ˜์ด์ง€์˜ ๊ฒฐํ•จ์ด ๋ฐœ์ƒํ•˜๋‚˜ ? ์ฒ˜์Œ ์‹œ์Šคํ…œ์—” ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์˜ ํŽ˜์ด์ง€๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ตœ์ดˆ๋กœ main ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด Code ์˜์—ญ์˜ Page๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๊ฒƒ์ด๋‹ค(1๋ฒˆ). ๊ทธ ๋‹ค์Œ ์ „์—ญ๋ณ€์ˆ˜ &A๊ฐ€ ์œ„์น˜ํ•œ Data(1๋ฒˆ)์™€ Heap์˜ 804a๋ถ€ํ„ฐ 804f(5๋ฒˆ)๊นŒ์ง€์˜ 6 Page๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๊ฒƒ์ด๋‹ค ํ”„๋กœ๊ทธ๋žจ์ด Stack์— ์ ‘๊ทผํ•˜๋ฉด์„œ๋Š” bfc6f Page(i,j ์ €์žฅ ์œ„์น˜/ 1๋ฒˆ)๋ฅผ ์ฝ์–ด์˜จ๋‹ค. ๋”ฐ๋ผ์„œ ex2 ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ•œ Page Fault๋Š” 8๋ฒˆ์ด๋ฉฐ, printf ๋“ฑ์˜ C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ๊ณ ๋ คํ•œ๋‹ค๋ฉด ๋” ๋งŽ์€ Page Fault๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค.

 

 

4) page fault๋ฅผ ํ‘œ์‹œํ•˜๋Š” "mm/map.c"์— sys_show_pfcnt()๋ฅผ ์ •์˜ํ•˜์—ฌ page fault๋ฅผ ๊ตฌํ•˜์ž

arch/x86/kernel/syscall_table_32.S

์‹œ์Šคํ…œ์ฝœ 31๋ฒˆ์— ์„ ์–ธํ•ด์ฃผ์—ˆ๋‹ค.

mm/mmap.c

page fault๊ฐ€ ๋ช‡ ๋ฒˆ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์ถœ๋ ฅํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.

 

/arch/x86/mm/fault.c

do_page_fault ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ํšŒ์ˆ˜๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ , ์„ ์–ธ๋ ๋•Œ๋งˆ๋‹ค +1ํ•ด์ฃผ์—ˆ๋‹ค.

 

 

 

week13/ex4.c

๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๊ธฐ ์ „ ํ›„์— syscall์„ ํ•ด์ฃผ์—ˆ๋‹ค.

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

720848-720843 = 5

syscall ์‚ฌ์ด์˜ ๋ฐ˜๋ณต๋ฌธ์—์„œ ์ด 5๋ฒˆ์˜ Page Fault๊ฐ€ ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฐœ์ƒํ–ˆ๋‹ค. ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด A[0]๊ฐ€ ์œ„์น˜ํ•œ 804a Page๋ฅผ ์ œ์™ธํ•˜๋ฉด A[4][1024]๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” 804f๊นŒ์ง€์˜ 5๋ฒˆ์˜ Page Fault๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๊ฐ€ ์ž˜ ๋‚˜์™”๋‹ค.

์—ฌ๊ธฐ์— main๋ฌธ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” page fault 1๋ฒˆ, ์ „์—ญ๋ณ€์ˆ˜๊ฐ€ ์œ„์น˜ํ•œ Data page fault 1๋ฒˆ, ์ง€์—ญ๋ณ€์ˆ˜ i,j์— ์˜ํ•œ page fault 1๋ฒˆ => 8๋ฒˆ!

 

4-1)

 

ํŽ˜์ด์ง€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ์ •ํ™•ํ•œ ์ฃผ์†Œ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ex3.c๋ฅผ ๋งŒ๋“ค๊ณ  arch/mm/fault.c:do_page_fault()์— ๋‹ค์Œ ์ฝ”๋“œ(์ดํƒค๋ฆญ์ฒด)๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. ex3๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ปค๋„์€ ex3์— ์˜ํ•ด ์ƒ์„ฑ๋œ ํŽ˜์ด์ง€ ์žฅ์•  ์ฃผ์†Œ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ hw3)์—์„œ ํŽ˜์ด์ง€ ์˜ค๋ฅ˜ ์ฃผ์†Œ๋ฅผ ๊ฒ€ํ† ํ•˜์—ฌ ๋‹ต๋ณ€์„ ๋‹ค์‹œ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

 

week13/ex4_1.c
arch/x86/mm/fault.c:do_page_fault()
./ex4_1 &

do_page_fault ํ•จ์ˆ˜์— ํ˜„์žฌ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ด๋ฆ„์ด "ex4_1"์ด๋ฉด Page Fault ์ฃผ์†Œ๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ์ปค๋„ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์ž‘๋˜๋ฉด Code(804a) Page๋ฅผ ๋จผ์ € ์ฝ๊ณ , libc ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ €์žฅ๋œ ํŽ˜์ด์ง€๋ฅผ ์ฝ๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  Heap ์˜์—ญ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฐ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์˜ ์ฝ”๋“œ์— ๋น„ํ•ด ๋งŽ์€ Page Fault๊ฐ€ ์ƒ์„ฑ๋œ ์ด์œ ๋Š” mainํ•จ์ˆ˜๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์–ด ํ˜ธ์ถœ๋˜๊ธฐ๊นŒ์ง€์˜ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์ด ํฌํ•จ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

4-2) 2๋ฒˆ๊ณผ ๊ฐ™์ด ex4 ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค. ์™œ pfcnt๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š”๊ฐ€?

week13/ex4_2.c
result

pcnt = 723887 - 723863 = 24๊ฐœ๋กœ ์ฆ๊ฐ€ํ•œ๋‹ค.

์ฆ๊ฐ€ํ•œ ์ด์œ ๋Š” printf ํ˜ธ์ถœ์—์„œ ์ถ”๊ฐ€์ ์ธ Page Fault๊ฐ€ ์ผ์–ด๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

5) ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์˜ vma ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ•˜๊ณ , vma ๋ชฉ๋ก์„ ํ‘œ์‹œํ•˜๋Š” ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์—ฌ "/proc/pid/maps"์™€ ๊ฐ™์€์ง€ ํ™•์ธํ•ด๋ผ.

arch/x86/kernel/syscall_table_32.S

32๋ฒˆ์— vma_list๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์‹œ์Šคํ…œ์ฝœ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•ด์ฃผ์—ˆ๋‹ค.

 

mm/mmap.c

VMA List๋Š” Linked List ํ˜•ํƒœ๋กœ ๊ตฌํ˜„๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— temp = temp->vm_next๋กœ ๋‹ค์Œ ๊ฐ’์„ ์ง€์ •ํ•˜๋ฉฐ NULL์ด ๋  ๋•Œ๊นŒ์ง€ ์ด๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค. vm_file ๊ฐ’์ด NULL์ผ ๊ฒฝ์šฐ์—๋Š” name์„ ์ถœ๋ ฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

 "/proc/pid/maps"์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

 

6) sys_show_pfcnt()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ex1 ๋ฐ ex2์— ์ด์–ด ์‹คํ–‰ํ•  ๋•Œ ํŽ˜์ด์ง€ ์žฅ์•  ์ˆ˜๋ฅผ ๊ณ„์‚ฐ, ๋˜ํ•œ ๊ฐ ์ฝ”๋“œ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ๋น„๊ตํ•˜๊ณ (gettime of day() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ) ์„œ๋กœ ๋‹ค๋ฅธ ์ด์œ ๋ฅผ ์„ค๋ช…

 

 

week13/6_2.c

 

result

 

Program page fault elapsed time
ex6_1 1357266-1291727(65539) 3.776
ex6_2 1431917-1357803(74114) 4.00

 

ex6_1๊ณผ ex6_2์˜ ์ฐจ์ด์ ์€ A[i][j]์™€ A[j][i]์ด๋‹ค. ex02์—์„œ ๋” ๋งŽ์€ Page Fault๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ, ex01์€ A์— ๋ฉ”๋ชจ๋ฆฌ ์ ์žฌ๋œ ์ˆœ์„œ๋Œ€๋กœ ์ ‘๊ทผํ•œ ๋ฐ˜๋ฉด ex02๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ ‘๊ทผํ•˜์ง€ ์•Š์•˜๊ธฐ(์ฐธ์กฐ์˜ ์ง€์—ญ์„ฑ์„ ๋งŒ์กฑํ•˜์ง€ ์•Š์•˜๊ธฐ) ๋•Œ๋ฌธ์— LRU ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•ด ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ Page๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋‚ด๋ ค๊ฐ„ Page๋ฅผ ์ƒˆ๋กœ ์ฝ์–ด์˜ค๋Š” ์ž‘์—…์ด ๋ฐ˜๋ณต๋˜์–ด ๋” ๋งŽ์€ Page Fault๊ฐ€ ์ผ์–ด๋‚ฌ๋‹ค.

Page Fault ๊ณผ์ •์€ ๋ฐœ์ƒํ•œ ํšŒ์ˆ˜๋งŒํผ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋ฏ€๋กœ ex02์ด ex01๋ณด๋‹ค ๋А๋ฆฌ๊ฒŒ ์‹คํ–‰์„ ๋๋งˆ์ณค๋‹ค.