스레드는 운영 체제에서 프로세서 시간을 부여하는 명령의 시퀀스입니다. 운영 체제에서 실행되는 모든 프로세스는 하나 이상의 스레드로 구성됩니다. 스레드가 두 개 이상 있는 프로세스를 다중 스레드라고 합니다.
여러 프로세서, 다중 코어 프로세서 또는 하이퍼스레딩 프로세스가 있는 컴퓨터는 여러 동시 스레드를 실행할 수 있습니다. 많은 스레드를 사용하는 병렬 처리는 프로그램 성능을 크게 향상시킬 수 있지만 많은 스레드를 추적하므로 디버깅이 더 어려워질 수도 있습니다.
완벽한 병렬 처리가 항상 가능한 것은 아닙니다. 경우에 따라 스레드를 동기화해야 합니다. 한 스레드가 다른 스레드의 결과를 기다려야 하거나 한 스레드가 다른 스레드에서 사용하는 리소스에 대한 단독 액세스가 필요할 수 있습니다. 동기화 문제는 다중 스레드 애플리케이션에서 버그의 일반적인 원인입니다. 경우에 따라 스레드는 절대 사용할 수 없는 리소스를 기다리게 될 수 있습니다. 이로 인해 교착 상태라는 조건이 발생합니다.
스레드 및 프로세스
스레드 및프로세스 는 컴퓨터 과학의 관련 개념입니다. 둘 다 특정 순서로 실행해야 하는 명령 시퀀스를 나타냅니다. 그러나 별도의 스레드 또는 프로세스의 지침은 병렬로 실행할 수 있습니다.
프로세스는 운영 체제에 존재하며 사용자가 프로그램 또는 애플리케이션으로 보는 것과 일치합니다. 반면에 스레드는 프로세스 내에 존재합니다. 이러한 이유로 스레드를 경량 프로세스라고도 합니다. 각 프로세스는 하나 이상의 스레드로 구성됩니다.
여러 프로세스가 있으면 컴퓨터가 한 번에 둘 이상의 작업을 수행할 수 있습니다. 여러 스레드가 있으면 프로세스를 분리하여 병렬로 작업을 수행할 수 있습니다. 다중 프로세서가 있는 컴퓨터에서 프로세스 또는 스레드는 다른 프로세서에서 실행할 수 있습니다. 이렇게 하면 진정한 병렬 처리가 가능합니다.
다중 스레드 앱을 디버깅하기 위한 도구
Visual Studio는 다중 스레드 앱을 디버깅하는 데 사용할 수 있는 다양한 도구를 제공합니다.
스레드의 경우 스레드를 디버깅하기 위한 기본 도구는 병렬 스택 창, 병렬 조사식 창, 원본 창의 스레드 표식, 스레드 창 및 디버그 위치 도구 모음입니다. 병렬 스택의 스레드 보기에 대한 자세한 내용은 스레드 보기를 사용하여 교착 상태 디버그를 참조하세요. 병렬 스택 및 병렬 조사식 창을 사용하는 방법을 알아보려면 다중 스레드 애플리케이션 디버깅 시작을 참조하세요. 시작 문서에서는 스레드 마커를 사용하는 방법을 보여 줍니다. 또한 연습: C++ AMP 애플리케이션 디버깅을 참조하세요.
비동기를 사용하는 .NET 코드의 경우 디버깅을 위한 기본 도구는 병렬 스택 창의 작업 보기입니다. 시작하려면 비동기 애플리케이션 디버그(.NET)를 참조하세요.
스레드의 경우 스레드를 디버깅하기 위한 기본 도구는 병렬 스택 창, 병렬 조사식 창, 원본 창의 스레드 표식, 스레드 창 및 디버그 위치 도구 모음입니다. 병렬 스택의 스레드 보기에 대한 자세한 내용은 병렬 스택 창에서 스레드 및 작업 보기를 참조하세요. 병렬 스택 및 병렬 조사식 창을 사용하는 방법을 알아보려면 다중 스레드 애플리케이션 디버깅 시작을 참조하세요. 시작 문서에서는 스레드 마커를 사용하는 방법을 보여 줍니다. 또한 연습: C++ AMP 애플리케이션 디버깅을 참조하세요.
비동기를 사용하는 .NET 코드의 경우 디버깅을 위한 기본 도구는 병렬 스택 창의 작업 보기입니다. 자세한 내용은 병렬 스택 창에서 스레드 및 작업 보기를 참조하세요.
GPU에서 스레드를 디버깅하는 경우 기본 도구는 GPU 스레드 창입니다. 방법: GPU 스레드 창 사용
프로세스의 경우 기본 도구는 프로세스에 연결 대화 상자, 프로세스 창 및 디버그 위치 도구 모음입니다.
또한 Visual Studio는 다중 스레드 애플리케이션을 디버그할 때 유용할 수 있는 강력한 중단점 및 추적점을 제공합니다. 중단점 조건 및 필터를 사용하여 개별 스레드에 중단점을 배치합니다. 추적점을 사용하면 중단 없이 프로그램 실행을 추적하여 교착 상태와 같은 문제를 연구할 수 있습니다. 자세한 내용은 중단점 작업 및 추적점을 참조하세요.
사용자 인터페이스가 있는 다중 스레드 애플리케이션 디버깅은 특히 어려울 수 있습니다. 두 번째 컴퓨터에서 애플리케이션을 실행하고 원격 디버깅을 사용하는 것이 좋습니다. 자세한 내용은 원격 디버깅을 참조하세요.
다음 표에서는 사용 가능한 정보와 이러한 각 위치에서 수행할 수 있는 작업을 보여 줍니다.
| 사용자 인터페이스 | 사용 가능한 정보 | 수행할 수 있는 작업 |
|---|---|---|
| 프로세스에 연결 대화 상자 | 연결할 수 있는 사용 가능한 프로세스: - 프로세스 이름(.exe) - 프로세스 ID 번호 - 메뉴 모음 제목 - 형식(관리형 v4.0; 관리되는 v2.0, v1.1, v1.0; x86; x64; IA64) - 사용자 이름(계정 이름) - 세션 번호 |
연결할 프로세스 선택 원격 컴퓨터 선택 원격 컴퓨터에 연결하기 위한 전송 유형 변경 |
| 프로세스 창 | 연결된 프로세스: - 프로세스 이름 - 프로세스 ID 번호 - .exe 처리하는 경로 - 메뉴 모음 제목 - 상태(중단. 실행 중) - 디버깅(네이티브, 관리형 등) - 전송 유형(기본값, 네이티브 인증 없음) - 전송 한정자(원격 컴퓨터) |
도구 -붙이다 -떼다 -끝내다 바로 가기 메뉴: -붙이다 -떼다 - 디버깅이 중지된 경우 분리 -끝내다 |
| 디버그 위치 도구 모음 | - 현재 프로세스 - 애플리케이션 일시 중단 - 애플리케이션 다시 시작 - 애플리케이션 일시 중단 및 종료 - 현재 스레드 - 현재 스레드 플래그 상태 설정/해제 - 플래그가 지정된 스레드만 표시 - 현재 프로세스만 표시 - 현재 스택 프레임 |
- 다른 프로세스로 전환 - 애플리케이션 일시 중단, 다시 시작 또는 종료 - 현재 프로세스에서 다른 스레드로 전환 - 현재 스레드에서 다른 스택 프레임으로 전환 - 현재 스레드 플래그 지정 또는 플래그 해제 - 플래그가 지정된 스레드만 표시 - 현재 프로세스만 표시 |
| 병렬 스택 창 | - 한 창에서 여러 스레드에 대한 스택을 호출합니다. - 각 스레드에 대한 활성 스택 프레임입니다. - 모든 메서드에 대한 호출자 및 호출자입니다. - 교착 상태 검색 |
- 지정된 스레드 필터링 - 외부 코드 스택 필터링 - 작업 보기로 전환 - 스레드 플래그 지정 또는 플래그 해제 -급상승 - 스택 프레임 복사 - 모든 스택을 이미지로 저장/내보내기 |
| 병렬 조사식 창 | - 특별히 주의하려는 스레드를 표시할 수 있는 플래그 열입니다. - 화살표가 선택한 프레임을 나타내는 프레임 열입니다. - 컴퓨터, 프로세스, 타일, 작업 및 스레드를 표시할 수 있는 구성 가능한 열입니다. |
- 스레드 플래그 지정 또는 플래그 해제 - 플래그가 지정된 스레드만 표시 - 프레임 전환 - 열 정렬 - 그룹 스레드 - 스레드 고정 또는 해동 - 병렬 조사식 창에서 데이터 내보내기 |
| 스레드 창 | 현재 프로세스의 스레드: - 스레드 ID - 관리 ID - 범주(주 스레드, 인터페이스 스레드, 원격 프로시저 호출 처리기 또는 작업자 스레드) - 스레드 이름 - 스레드가 만들어지는 위치 -우선권 - 선호도 마스크 - 일시 중단된 수 - 프로세스 이름 - 플래그 표시기 - 일시 중단된 표시기 |
도구 -검색 - 호출 스택 검색 - 내 코드만 플래그 지정 - 사용자 지정 모듈 선택 플래그 지정 - 그룹화 기준 -열 - 호출 스택 확장/축소 - 그룹 확장/축소 - 스레드 고정/해동 바로 가기 메뉴: - 원본에 스레드 표시 - 스레드로 전환 - 실행 중인 스레드 고정 - 고정 스레드 해동 - 추가 연구를 위해 스레드에 플래그 지정 - 스레드 플래그 해제 - 스레드 이름 바꾸기 - 스레드 표시 및 숨기기 기타 작업: - DataTip에서 스레드에 대한 호출 스택 보기 |
| 원본 창 | 왼쪽 여백의 스레드 표시기는 단일 또는 여러 스레드를 나타냅니다( 스레드 창에서 바로 가기 메뉴를 사용하여 기본적으로 꺼짐) | 바로 가기 메뉴: - 스레드로 전환 - 추가 연구를 위해 스레드에 플래그 지정 - 스레드 플래그 해제 |
| 작업 창 | - 작업 ID, 작업 상태(예약됨, 실행 중, 대기 중, 교착 상태) 및 작업에 할당된 스레드를 포함한 개체에 대한 Task 정보를 봅니다. - 호출 스택의 현재 위치입니다. - 생성 시 태스크에 전달된 대리자 |
- 현재 작업으로 전환 - 작업 플래그 지정 또는 플래그 해제 - 작업 고정 또는 해동 |
| GPU 스레드 창 | - 특별히 주의하려는 스레드를 표시할 수 있는 플래그 열입니다. - 노란색 화살표가 현재 스레드를 나타내는 현재 스레드 열입니다. - 동일한 위치에 있는 스레드 수를 표시하는 스레드 수 열입니다. - 각 스레드 그룹이 있는 코드 줄을 표시하는 줄 열입니다. - 각 스레드 그룹이 있는 명령 주소를 표시하는 주소 열입니다. - 주소 코드의 위치인 위치 열입니다. - 스레드가 활성 상태인지 아니면 차단되었는지를 보여주는 상태 열입니다. - 행의 스레드 에 대한 타일 인덱스를 표시하는 타일 열입니다. |
- 다른 스레드로 변경 - 특정 타일 및 스레드 표시 - 열 표시 또는 숨기기 - 열을 기준으로 정렬 - 그룹 스레드 - 스레드 고정 또는 해동 - 스레드 플래그 지정 또는 플래그 해제 - 플래그가 지정된 스레드만 표시 |