시스템유형별/컨커런트
페이퍼요약 - 동시성의 멀티쓰레드 애플리케이션 테스팅에 대한 조사 by Abdelqawy
grapevine9700
2018. 5. 11. 06:30
반응형
제목: 동시성의 멀티쓰레드 애플리케이션 테스팅에 대한 조사(A SURVEY ON TESTING CONCURRENT AND MULTI-THREADED APPLICATIONS TOOLS AND METHODOLOGIES)
저자: Desoky Abdelqawy 외 2인, 이집트
문서유형: 학계 페이퍼(총 13페이지)
동시성을 가지는 멀티쓰레드 프로그램을 테스트할 수 있는 기법과 도구에 대한 문헌 조사 자료
동시성 버그(Concurrency bugs)
- 병렬 수행 애플리케이션(parallel applications)에서 나타나는 비결정적 동작(non-deterministic behaviour)은 버그 발견을 어렵게 하며, 버그가 발견되었다 하더라도 이를 재현(reproduce)하는 것 또한 어렵게 한다.
- 따라서 버그 수정 후에도 버그가 정말로 수정된 것인지 아니면 단순히 모습을 감춘 것인지 확신하기가 어렵다.
- 이런 동시성 버그의 예로 데이터 경쟁(data race), 데드락(deadlocks), 기아 현상(starvations), 저조한 애플리케이션 성능 등이 있다.
1. 데이터 경쟁 상황(Data race condition)
- 두 개(또는 그 이상의) 쓰레드가 공용 자원(a shared resource)에 접근(읽기 또는 쓰기)할 수 있고, 이 두 개의 쓰레드 중 적어도 하나가 쓰기(write) 접근일 때 발생하는 상황
- 프로그램이 특정 변수를 읽고(read) 이 변수의 내용에 기반하여 액션(action)을 취하는 상황에서 변수를 읽었지만 아직 액션은 취하기 전인 시점에 다른 쓰레드(또는 프로세스)가 끼어들어 해당 변수의 값을 바꾸어 버림. 이로 인해 곧 발생하려는 액션이 더 이상 적절하지 않게 된다.
- 이런 경쟁 상황이 실제 에러로 이어질지 여부는 프로그램 실행 동안의 쓰레드 인터리빙(interleaving)에 달려 있기 때문에 이는 불확정적 버그(undeterministic bug)이다. 또한 훼손된(또는 부정확한) 변수 데이터로 그 모습을 드러내기 때문에 재현이 어렵다.
2. 데드락(Deadlocks)
- 한 무리의 쓰레드 집합에서 각 쓰레드가 다른 쓰레드가 이미 점유한 자원을 얻기 위해 계속 기다림에 따라 이 쓰레드 집합이 영구히 멈추게 되는 상황
- 데드락은 때때로 경쟁 상황을 피하려는 의도를 가진 개발자가 동기화 프리미티브(synchronization primitives)를 부정확하게 사용하는 바람에 발생하게 된다.
3. 기아 현상(Starvation)
- 하나 또는 여러 개의 쓰레드가 실행(run)이 무한 지연되거나 또는 영구 중단된 상황
- 쓰레드가 다른 것을 막고 있거나 기다리고 있는 상황이 아님에도 불구하고 실행 스케쥴에 잡히지 못함
- 대개 스케쥴링 규칙 및 정책의 결과로 발생한다.
4. 라이브락(Livelocks)
- 쓰레드가 스케쥴에는 잡혔지만 상대방의 상태 변화에 지속적으로 반응하느라 더 이상 진전되지 못하는 상황
- 높은 CPU 사용율(High CPU utilization)을 보이지만 실질적으로 이루어지는 일이 없는 상황은 전형적인 라이브락 경고 신호로 여겨진다.
5. 동시성 타입-상태 버그(Concurrency type-state bugs)
- 한 쓰레드의 타입 상태 변경 오퍼레이션이 다른 쓰레드의 다른 오퍼레이션과 잘 동기화되지 못할 때 발생함
- 이 버그는 특정 타입 상태에서는 허용되지 않은 오퍼레이션이 오브젝트에 적용되는 결과를 낳는다(즉, 타입 상태 위반)
동시성의 애플리케이션 테스팅
- 동시성을 가지는 애플리케이션 테스팅에서는 정확성(correctness), 신뢰성(reliability), 성능(performance), 확장성(scalability)이 테스트 된다.
- 정확성 테스팅에서는 공용 자원(shared resource)에 대한 접근 순서(access order)를 검증하거나 또는 잠금(locking) 원칙을 검증한다(즉, 공용 변수에 대한 모든 접근에서 잠금 원칙이 준수되는지 확인).
동시성 버그(특히 데이터 경쟁 상황)를 발견 및 예방 할 수 있는 테스트 방법은 크게 아래와 같은 유형으로 구분된다.
- 타입 시스템 활용(race free typed technique): 타입 기반 시스템을 통해 경쟁 상황으로부터 자유로운 코드를 생성한다(경쟁 상황을 예방).
- 정적 분석 기법(static analysis technique): 프로그램 실행 없이 코드를 분석하여 버그를 식별. 예를 들면, 프로그램에서 공용 인스턴스 필드를 결정하기 위한 escape 분석, lock protection의 일관성을 판단하는 type 분석, 콘트롤 플로우에 민감한 프로시져간 분석(inter-procedural analysis) 등을 수행한다.
- 동적 분석 기법(dynamic analysis technique): 프로그램을 실제 실행하고 실행 발자취(footprint)를 검토하여 버그를 찾아냄. 동적 분석은 테스트 실행(run)에서 여러 다른 인터리빙이 야기되도록 노력한다(프로그램에 sleep 구문을 임의적으로 삽입하거나 또는 상태 모델 체커를 사용하여 모든 인터리빙을 체계적으로 탐색하는 방법을 사용)
- 모델 체킹 기법(model checking technique): 소프트웨어 추상화(abstraction)를 통해 유한 상태 동시성 시스템(a finite state concurrent system)의 정확성을 검증하는 방법. 모델 체커가 모든 가능한 변수에 대한 모든 가능한 실행 경로 탐색을 통해 바람직하지 않은 동작(즉, 데이터 경쟁, 데드락)이 발생할 수 있는지를 판단함
- 하이브리드 기법(hybrid technique): 테스팅 기법 각각이 장점과 한계점을 가지므로 최근에는 하나 이상의 기법을 조합하여 장점을 고루 받아들이고 활용하는 연구가 늘어남
반응형