연습 1.4: 스레드 병목현상 해결

시작하기 전에 연습 1.3: 스레드 병목현상 식별을 완료해야 합니다.

코드에서 교착 상태를 찾기 위해 스레드 보기뿐만 아니라 프로파일링 모니터에서 UML2 순서 다이어그램(객체 상호 작용 및 스레드 상호 작용 보기)과 호출 스택 프로파일링 자원을 사용할 수 있습니다.

이 교착 상태를 해결하려면 먼저 문제점과 관련된 메소드 호출과 객체를 찾아야 합니다.

  1. 스레드 보기에서 "잠금 대기 중" 상태가 된 첫 번째 philo* 스레드를 찾으십시오. "잠금 대기 중" 세그먼트 위에 커서를 일시정지하십시오. 툴팁은 스레드가 대기 중인 잠금을 식별합니다(Fork.<id number>).
  2. 실행할 프로파일링 자원을 마우스 오른쪽 단추로 누르고 열기 도구 > UML2 객체 상호 작용을 선택하십시오. 객체 상호 작용을 표시하는 UML2 순서 다이어그램 보기가 열립니다.
  3. 순서 다이어그램에서 보기를 스크롤하여 Fork.<id number>를 찾은 후 두 번 눌러 선택하십시오.
  4. 아래로 스크롤하여 philo* 스레드 중 하나에서 Fork.<id number>까지의 가로 화살표를 찾으십시오. 이 화살표는 객체들 간의 상호 작용을 표시하며 두 객체 간의 첫 번째 상호 작용은 philo* 스레드가 Fork.<id number>를 확보했음을 나타냅니다. getName으로 표시된 화살표를 찾을 수 있습니다.
  5. getName을 두 번 누르십시오. 스레드 보기에서 getName을 호출할 때 전체 프로그램에서 발생한 상황을 표시하기 위해 세로 현재 시간 표시기가 이동합니다. 요청한 philo* 스레드가 "잠금 대기 중" 상태가 되지 않으므로 요청에 성공했음을 알 수 있습니다.
  6. 순서 다이어그램에서 Fork.<id number>를 다시 두 번 누르고 아래로 스크롤하여 다른 philo* 스레드에서 시작한 getName 요청을 찾으십시오.
  7. getName 인스턴스를 두 번 누르십시오. 현재 시간 표시기는 요청한 philo* 스레드가 Fork.<id number>를 확보하지 못하고 "잠금 대기 중" 상태가 된다는 것을 나타냅니다.

이러한 경우에는 다른 스레드가 보유하는 Fork 요청이 문제가 됩니다. "잠금 대기 중" 상태로 종료한 다른 스레드가 다른 인스턴스에서도 마찬가지인지 확인하십시오.

이제, 문제점의 원인이 되는 메소드를 찾아야 합니다.

  1. 실행할 프로파일링 자원을 마우스 오른쪽 단추로 누르고 열기 도구 > UML2 스레드 상호 작용을 선택하십시오. 스레드 상호 작용을 표시하는 UML2 순서 다이어그램 보기가 열립니다.
  2. 프로파일링 모니터에서 프로파일링 자원을 펼친 후 스레드 분석 항목과 호출 스택 항목을 펼치십시오.
  3. 스레드의 이름이 표시되는 스레드 보기에서 "잠금 대기 중" 상태가 된 첫 번째 philo* 스레드를 두 번 누르십시오. 스레드 상호 작용 보기는 해당 스레드에 대한 정보만 표시하도록 변경됩니다.
  4. 스레드에 대한 정보의 끝까지 아래로 스크롤하고 스레드가 실행한 마지막 메소드, 즉 run 메소드를 두 번 누르십시오. 프로파일링 모니터의 호출 스택에 실행 당시 스택의 모든 호출이 표시됩니다.
  5. 호출 스택에서 잠금을 유지하는 스레드는 Philosopher.java에서 Sleep 메소드를 호출하거나 잠금을 대기하고 그에 따라 아무 것도 수행하지 않습니다.
  6. 실행을 종료한 다른 스레드가 잠금을 대기 중인지 확인하십시오. Philosopher.javaSleep 메소드가 자주 호출 스택에 있을 수 있는데, 문제가 될 수 있습니다.

Sleep 메소드에 문제가 있다고 가정하고, 코드를 확인해 봅니다.

  1. 호출 스택에서 Sleep(int) void [Philosopher.java]의 인스턴스를 마우스 오른쪽 단추로 누르고 소스 열기를 선택하십시오. 소스가 편집기에서 Sleep 클래스의 위치에 열립니다.
  2. 코드를 검사하십시오. Sleep 메소드는 run 메소드 내에서 호출됩니다. "got left..." 메시지를 인쇄하는 trace에 대한 호출과 Sleep에 대한 호출이 있습니다. Sleep에 대한 호출을 주석 처리하면 교착 상태를 방지할 수 있습니다.
  3. Sleep을 주석 처리하십시오.
  4. 파일 > 저장을 선택하십시오.
프로그램을 다시 프로파일링하십시오.

교착 상태 없이 프로그램이 실행되고 다음과 같이 콘솔에 표시됩니다.

HeadWaiter reports all philosophers have finished dining normally

위와 같이 스레드 보기 및 다른 보기에 프로그램이 실행될 때 스레드에서 발생하는 상황이 표시됩니다. 프로그램에 대한 지식에 따라 분석을 수행하고 교착 상태를 해결하는 것은 사용자에게 달려 있습니다.

요약에 있는 내용을 검토하여 학습을 완료하십시오.

사용 약관 | 피드백
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.