| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- DFS
- Multimedia
- SQLD
- Optimization
- Linux
- computer vision
- BFS
- do it! 알고리즘 코딩테스트: c++편
- Machine Learning
- C++
- paper review
- Data Science
- Operating System
- ROS2
- Robocup@Home 2026
- Python
- Baekjoon
- deep learning
- cs231n
- file system
- Humble
- Process
- On-memory file system
- CNN
- System Call
- Gentoo2
- Seoul National University
- RNN
- CPP
- 밑바닥부터 시작하는 딥러닝2
- Today
- Total
newhaneul
[Operating System] Final Exam Class 1 Fall 2024 (Week 13-14: On-Memory File System) 본문
[Operating System] Final Exam Class 1 Fall 2024 (Week 13-14: On-Memory File System)
뉴하늘 2025. 12. 5. 17:19본 포스팅은 인하대학교 김기창 교수님의 [202502-EEC4406-001] Operating System을 수강하고 공부한 내용을 정리하기 위한 포스팅입니다.
Question:
Submit all relevant code, output result, and explanation about your code such as whether it is working or not and if not where it fails, etc. for the following problem.
아래 문제에 대해 모든 관련 코드, 결과 캡쳐, 코드에 대한 설명(작동하는지 여부, 비작동의 경우 어디에서 문제가 있는지 등등)을 제출하기 바랍니다.
Predict page fault addresses for the following program and confirm your prediction by displaying actual fault addresses. Indicate which actual fault address corresponds to which predicted address for all predicted addresses.
아래 프로그램에 대해 페이지폴트 주소들을 모두 예측하고 실제 폴트주소를 출력하여 자신의 예측을 확인하시오. 어떤 실제 폴트주소가 어떤 예측 폴트주소에 매칭하는지 모두 지적하시오.
char *x = “hello”;
int main(){
int y;
char *k;
for(y=0;y<10;y++){
k=malloc(1000);
strcpy(k, x);
}
}
Answer:
1. 프로그램 구조
char *x = “hello”;
int main(){
int y;
char *k;
for(y=0;y<10;y++){
k=malloc(1000);
strcpy(k, x);
}
}
- char *x = "hello": 전역 변수이므로 data 영역에 위치한다.
- malloc(1000): 1000 byte < 1 KB 만큼 heap 영역을 사용한다.
- int y, char *k: main() 안의 지역 변수이므로 stack 영역에 올라간다.
- int main() { ... }: 실행 코드는 code 영역에 위치한다.
페이지 크기는 4KB (0x1000)이며, 총 code/data/stack/heap 4개의 페이지에 접근한다.
2. Page Fault가 발생하는 순서
(1) code page
프로세스가 시작하면, CPU가 main()의 명령어를 가져와야 하므로 code page에 접근해야 한다. 만약 code page가 메모리에 없다면 첫 번째 page fault가 발생한다.
→ 한 개의 page fault가 발생한다.
(2) stack page
main()이 호출되면, 지역 변수 y, x를 할당하기 위해 stack에 공간을 만든다. 또한 for문에서 'y++'을 하면서 계속해서 스택을 사용한다. 이때 stack page에 접근할 때, 아직 stack page가 메모리에 없다면 두 번째 page fault가 발생한다.
→ 한 개의 page fault가 발생한다.
(3) data page
전역 변수 x는 data에 위치한다. 프로그램이 시작되면 전역 변수 초기화를 위해 data 영역에 한 번 접근되므로, 세 번째 page fault가 발생한다.
→ 한 개의 page fault가 발생한다.
(4) heap page
for문에서 malloc(1000)을 10번 호출한다. 이때 1,000 byte 는 1024 byte = 1KB 보다 작으므로 1,000byte x 10 = 10,000 byte는 대략 2.4 페이지를 사용한다. 따라서 3개의 heap page가 사용될 것이다. .
→ 세 개의 page fault가 발생한다.
3. Page Fault 주소 출력
test1.c

각 주소들이 예측한대로 페이지를 공유하고 있거나 혹은 얼마나 많은 페이지를 보유하고 있는지 확인하기 위해 주어진 코드의 상단에 주소들을 출력하도록 구현하였습니다.

실행하고 결과를 확인해본 결과 정상적으로 예측한대로 페이지를 공유하고 있었습니다. 페이지 번호를 확인하였으니 정확한 페이지 번호를 계산하면 아래와 같습니다.
(1) code page
→ main()은 코드 페이지인 0x8048에 있습니다.
(2) stack page
→ 지역 변수인 &y, &k는 같은 스택 페이지인 0xbfff에 있습니다.
(3) data page
→ 전역 변수인 x는 데이터 페이지인 0x804a에 있습니다.
(4) heap page
→ malloc(1000)에 의한 k는 for문 동안 총 세 번의 페이지를 사용합니다. y = 0~4일 때 0x804b를 사용하고, y = 5~8일 때 0x804c, y = 9일 때 0x804d를 사용합니다.
Page Fault 주소 출력
arch/x86/mm/fault.c

...

page fault는 INTERRUPT 14번 이므로 ‘do_page_fault()’가 호출됨을 알 수 있습니다. 따라서 해당 함수에서 전역 변수인 ‘pfcnt’를 1씩 증가시키도록 구현합니다.
먼저 “arch/x86/mm/fault.c” 경로로 이동하여 전역 변수 ‘pfcnt’를 선언 및 초기화하고, ‘do_page_fault()’ 함수가 한 번 호출될 때마다 ++ 하도록 구현하였습니다.
test1.c

사용자 정의 파일은 위와 같이 구현하였습니다.


컴파일 및 재부팅 후 현재 커널 레벨을 조절하고 컴파일 및 재부팅 후 'dmesg > x;, vi x' 를 통해 실행 결과를 확인하였습니다.




4. 실행 결과 분석
(1) code page
- &main = 0x8048034
- 0x8048000 <= addr < 0x8049000
- → page number = 0x8048
(2) data page
- &x= 0x804a020
- 0x804a000 <= addr < 0x804afff
- → page number = 0x804a
(3) stack page
- &i, j, x = 0xbfdd
- 0xbfdd000 <= addr < 0xbfde000
- → page number = 0xbfdd
(4) heap page
- malloc(1000) = 0x804b / 0x804c / 0x804d
- 0x804b000 <= addr < 0x804bfff
- 0x804c000 <= addr < 0x804cfff
- 0x804d000 <= addr < 0x804dfff
- → page number = 0x804b / 0x804c / 0x804d
dmesg에 찍힌 Pafe Fault 주소와 매칭해보면 아래와 같다.
(1) 0x08048034
- code page
- main()이 들어있는 code page가 처음 실행될 때 발생한 page fault이다.
(2) 0x804a020
- data page
- 전역 변수인 x에 처음 접근될 때 data page가 처음 사용되어 발생한 page fault이다.
(3) 0xbfdd5fdb
- stack page
- 지역 변수 j, k가 들어 있는 stack page가 처음 실행될 때 발생한 page fault이다.
(4) 0x804b004 / 0x804c3b4 / 0x804d374
- heap page
- malloc(1000)이 10회 반복되면서 세 개의 heap page를 사용하여 발생한 page fault이다.
- 0x804b004: y = 0~4 일 때 사용
- 0x804c3b4: y = 5~8 일 때 사용
- 0x804d374: y = 9 일 때 사용
(5) 0xb7e*****, 0xb7f*****
- "/lib/ld-2.6.1.so", "glibc"과 같은 공유 라이브러리 페이지에서 발생한 page fault이다.
- 이는 #include 를 통한 library 파일의 영역을 include 하면서 발생된 page fault 로 해석된다.
(6) 0x8049f20 / 0x8049f6c
- main()을 초기화 하는 과정에서 발생하는 page fault로 해석된다.