2025. 6. 15. 16:06ㆍ개발
Pintos 병렬 정렬 테스트에서의 Race Condition 분석 및 해결
원인 분석
Pintos에서 page-merge-mm 테스트는 여러 자식 프로세스가 병렬로 파일을 생성, 열기, 쓰기를 진행하며 정렬 작업을 수행하는 복합 테스트입니다. 실행 결과, 일부 자식 프로세스가 파일을 열지 못하거나 부모가 자식 프로세스를 기다리는(wait) 과정에서 문제가 발생했습니다.
문제 현상



자식 프로세스가 파일을 제대로 열지 못하고 조기 종료되거나, 부모가 자식 프로세스를 기다리는 과정에서 실패하며, race condition으로 인한 병렬 처리 중 문제가 랜덤하게 발생했습니다.
원인 추론
- 파일 시스템 동시 접근 문제: 여러 자식 프로세스가 동시에
filesys_open을 호출하며, 파일 시스템 락이 미흡하거나 동기화 처리가 부족하면 경쟁 상태(race condition)가 발생합니다. - VM 페이지 폴트 병목: 병렬 프로세스가 동시에 페이지 폴트를 일으키면서 페이지 폴트 핸들러가 처리하는 동안 다른 프로세스가 파일을 열지 못하는 경우가 발생합니다.
- 랜덤성 문제: 이 문제가 항상 발생하는 것이 아니라, 시스템 상태나 타이밍에 따라 통과할 때도 있고 실패할 때도 있어 디버깅이 더욱 복잡해집니다.
첫번 째 시도: 락 획득, 해제 로직 추가
보다 근본적인 해결을 위해 파일 시스템 접근 시 락의 획득(acquire)과 해제(release) 로직을 추가하여 동기화를 명확히 했습니다.



그래도 안돼유...... 왜. ㅏㄴ돼!!!!!!!!!
임시 해결법
임시적으로, load() 함수 내에 인위적인 지연(timer sleep)을 추가하여 파일 열기 시점을 분산했습니다.

결과 (일부 해결)
이렇게 처리하니 테스트가 통과되며 race condition이 임시로 회피되었습니다.


📌 시사점 및 학습 포인트
open 직전 timer_msleep의 효과
: open 직전에 1초정도 CPU를 쉬도록 함으로써 race condition을 인위적으로 피함
잘 되던 page-merge-seq는 실패
open, close, offset 관리 타이밍 변경으로 인해 데이터가 꼬였을 가능성
동기화 문제임을 정확히 확인
timer_msleep은 merge test가 실패한 원인이 동기화 문제였음을 확인한 임시방편일 뿐 올바른 파일 덮어쓰기, 동기화, VM 페이지 폴트 처리 등 근본 원인에 대한 트러블 슈팅 필요
장기적 해결 방안
정확한 락 구현: 파일 시스템 접근에 대한 락을 세밀하게 조정해 동시 접근을 적절히 제한하여 경쟁 상태를 근본적으로 해결해야 합니다.
동기화 메커니즘 점검: 파일 시스템 및 VM 핸들러의 동기화 로직을 강화하여 race condition이 발생하지 않도록 해야 합니다.
- Pintos의 VM 시스템과 파일 시스템의 상호작용에서 발생할 수 있는 race condition의 원인과 해결법 이해.
- 테스트 시 인위적 지연을 통해 문제를 확인하고, 이후 근본적 동기화 개선으로 이어가는 디버깅 전략을 경험.
- 커널 모드에서 락과 semaphore를 사용하는 동기화 메커니즘 구현 및 디버깅 기술을 실습.
- 병렬 처리가 포함된 테스트에서는 랜덤성이 추가돼 디버깅 난이도가 높아지므로, 반복적이고 체계적인 접근이 필요함을 깨닫게 됨.
추가적으로 공부할 내용
- Pintos 파일 시스템 락 구현과 동기화 이슈 해결법
- 페이지 폴트 핸들러의 동작 방식과 VM 페이지 관리 로직 점검
- 부모-자식 프로세스 간 supplemental page table 복제 방법과 이슈
결론
이번 디버깅 경험을 통해 Pintos의 병렬 환경에서 race condition이 발생하는 이유와 이를 해결하는 방법을 명확히 이해할 수 있었습니다. 임시 해결책을 통해 문제점을 식별하고, 장기적으로는 보다 견고한 동기화 방식을 구현하는 방향으로 학습과 개발을 진행하는 것이 중요합니다.
'개발' 카테고리의 다른 글
| 나만의 무기 2편 – 기획 아이디어 (3) | 2025.07.30 |
|---|---|
| 나만의 무기 1편: 개발 보다 더 어려운 기획 회의 (1) | 2025.07.30 |
| Pintos Project 3 — Memory‑Mapped Files 구현 흐름 (0) | 2025.06.14 |
| Pintos Project 3 — Stack Growth 구현 흐름 & page_fault 분석 (0) | 2025.06.13 |
| Pintos Project 3: Anonymous Page 구현 흐름 집중 해부 (1) | 2025.06.12 |