스레드의 개념과 동작 원리를 이해한다. MFC 스레드의 두 종류인 작업자 스레드와 UI 스레드 사용법을 익힌다.

Slides:



Advertisements
Similar presentations
CH5 디버그를 해보자 디버그 디버거 : 실행중인 응용 프로그램을 지정한 장소에서 정지하고, 그 시 점에서 변수, 메모리, 콜 스택의 내용을 참조하는것이 가능 Build -> Start Debug -> Go.
Advertisements

Chapter 02. C언어 기반의 C++ 박 종 혁 교수 UCS Lab SeoulTech Tel:
변비 재활전문센터 재활 간호사 김은화.
03장 영상처리를 위한 Visual C++ 디지털 영상 파일 포맷 MFC 응용 프로그램 마법사를 이용한 MFC 프로젝트 작성
윈도우 운영체제와 윈도우 응용 프로그램의 특징을 이해한다.
2장 닷넷 프레임워크.
제1장 윈도우 프로그래밍 1.1 윈도우 프로그래밍의 개념 1.2 윈도우 프로그램의 기본 구조
발표자 : 권만준 지능자동화연구실/충북대학교 2004년 05월 04일 화요일
Visual C++ Programming Document/View Architecture 3
6장. 멀티스레드 멀티스레드 프로그래밍의 필요성을 이해하고 기본 개념을 익힌다.
Chapter 09. 소켓 입출력 모델(I).
Q & A (사실상 혼인·이혼) Q. 사실상 혼인·이혼 관계를 어떻게 처리해야 하나요?   사실 혼인·이혼은 부부 모두 동의 여부를 확인하고, 자녀, 이·통·반장으로부터 「사실(이)혼 확인서」를 징구해야 합니다. 만약 어느 한쪽이 동의하지 않는 경우는.
D. 지뢰찾기 분석 설계 예제.
고급 컴퓨터 프로그래밍 팀명:지식인 팀원:홍광수 원대연 이소정.
데이터 관리의 모든 것 데이터 최적화하기 데이터 정렬하기 자동 필터와 고급 필터
Windows CE 메모리 아키텍처 및 관리 서진호
MFC 발전 과정과 주요 특징을 개괄적으로 이해한다.
Chapter 4 Multi-Threaded Socket
윤 홍 란 MFC 기초 윤 홍 란
Visual C++ Programming Tree Control/MultiThread
2강. JAVA 프로그래밍이란?-II & 변수 JAVA 프로그램 환경설정과 실행 방법 변수란?
태양계 시뮬레이션 팀 명: 복학생 강유진 박지혜.
구조체 struct 구조체와 함수 구조체의 배열, sizeof 연산자 열거형 enum 형 정의 typedef
Visual C++ Programming Tree Control/MultiThread
MultiThread.
Chapter 11. Raw 소켓.
문 성 원 3D Game Programming QuadTree Culling 문 성 원 KoreaIT 전문학교 게임학과.
최용술 장 Thread 최용술
제 14 장 파티클 시스템.
Visual C++ Programming Output and File
Visual C++ Programming MultiThread
운영체제 허상복 컴퓨터시스템 연구실
Software Engineering Project
Visual C++ Programming Common Controls
Chapter 12. 직렬 통신과 무선 프로토콜.
아두이노 프로그래밍 2일차 – Part4 아날로그 키패드 활용하기 강사: 김영준 목원대학교 겸임교수.
프로그래밍2 및 실습 C언어 기반의 C++ 2.
스택(Stack) 김진수
제 4주 2014년 1학기 강원대학교 컴퓨터학부 담당교수: 정충교
모듈 초기화 module_init(hello_init); module_exit(hello_exit);
날짜: 팀명: TEAM-SIX 발표자: 이기영
Rhapsody + MFC 개발 가이드.
멀티스레드 Chapter 05. * 학습목표 멀티스레드의 필요성을 이해하고 기본 개념을 익힘.
Chapter 09. 소켓 입출력 모델(I).
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
03. 안드로이드를 위한 Java 문법 제목. 03. 안드로이드를 위한 Java 문법 제목.
데이터베이스실험실 석사 2학기 조정희 TCP/IP Socket Programming… 제 19장 윈도우 기반의 쓰레드 동기화 데이터베이스실험실 석사 2학기 조정희
[CPA340] Algorithms and Practice Youn-Hee Han
프로그래밍 원리 Chapter 04 자료 처리와 연산자 신한대학교 IT융합공학부 박 호 균.
4장 - PHP의 표현식과 흐름 제어-.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Lab 8 Guide: 멀티스레딩 예제 2 * Critical Section을 이용한 멀티스레딩 동기화 (교재 15장, 쪽)
1.비디오 메모리 잠그기 2.화면에 픽셀찍기 학습목표
제8장 쓰레드 프로그래밍.
마음의 성전이 더 아름다운 조촌교회.
나의 포트폴리오 영동대학교 2014.
1.비 사업용(자가용 및 관용) 차 종 적 용 상 의 구 분 승합 자동차 (버스) 1 종
자바 5.0 프로그래밍.
기술 진화와 진보.
Windows 프로그래밍 환경 및 MFC의 구조
C# 10장. 참조형.
2013년도 상반기 고객만족도 조사 결과 보고서
2013년도 하반기 고객만족도 조사 결과 보고서
2015년 2학년 1반.
01. ‘한글뷰어’ 설치 전 준비사항.
엔코더 프로그램 설명 // 쓰레드를 사용하기 때문에 변수와 핸들을 전역변수로 지정 HANDLE hDevice;
교육 내용 OMRON SYSMAC Gateway(SGW) 설치 INDEX 제어 프로그램 설치
DirectX 9 Ch1. Direct3D 초기화.
MFC 응용 프로그램 구조 두 개의 윈도우로 구성된 일반적인 MFC 프로그램 프레임 윈도우
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 02. C언어 기반의 C++ 2.
Presentation transcript:

스레드의 개념과 동작 원리를 이해한다. MFC 스레드의 두 종류인 작업자 스레드와 UI 스레드 사용법을 익힌다. 다양한 스레드 동기화 기법을 이해하고 적용한다.

개요 멀티태스킹과 멀티스레딩 멀티스레딩의 중요성 멀티태스킹 멀티스레딩 응용 프로그램이 직접 스레드 생성과 파괴를 관리 하나의 CPU가 여러 개의 프로세스를 교대로 수행 멀티스레딩 하나의 CPU가 여러 개의 스레드를 교대로 수행 멀티스레딩의 중요성 응용 프로그램이 직접 스레드 생성과 파괴를 관리 스레드 사용 여부에 따라 응용 프로그램의 성능 차이가 생기므로 중요한 프로그래밍 요소임

프로세스와 스레드 (1/4) 프로세스 프로세스 구성 요소 실행 중인 프로그램 가상 주소 공간 - 32비트 윈도우의 경우 4기가 바이트 가상 주소 공간에 로드된 실행 파일과 DLL(코드+리소스+데이터) 프로세스를 위해 운영체제가 할당한 각종 리소스(파일, 파이프, ...) 프로세스 커널 객체 하나 이상의 스레드

프로세스와 스레드 (2/4) 프로세스 구성 요소 (cont'd) 프로세스의 가상 주소 공간 코드, 리소스, 데이터 스레드 1 스레드 2 윈도우 운영체제 프로세스 커널 객체 파일, 파이프, ...

프로세스와 스레드 (3/4) 스레드 스레드 구성 요소 프로세스의 가상 주소 공간에 존재하는 실행 흐름 운영 체제는 각 스레드에게 일정한 CPU 시간을 교대로 할당함으로써 여러 개의 스레드가 병렬적으로 실행되는 효과를 만들어 냄 스레드 구성 요소 스택 커널 모드와 사용자 모드에서 실행하기 위한 두 개의 스택 스레드 커널 객체 CPU 레지스터 값, ...

프로세스와 스레드 (4/4) 프로세스와 스레드 구성 요소 프로세스의 가상 주소 공간 코드, 리소스, 전역 데이터 스택 (스레드 1) 힙(Heap) 환경 변수 (스레드 2) 윈도우 운영체제 프로세스 커널 객체 스레드 ...

CPU 스케줄링 (1/5) CPU 스케줄링 윈도우의 CPU 스케줄링 스레드의 우선순위 결정 요소 우선순위(Priority)에 기반한 CPU 스케줄링 기법을 사용 우선순위가 높은 스레드에게 우선적으로 CPU 시간 할당 스레드의 우선순위 결정 요소 프로세스 우선순위: 우선순위 클래스(Priority Class) 스레드 우선순위: 우선순위 레벨(Priority Level)

CPU 스케줄링 (2/5) 우선순위 클래스 우선순위 클래스 종류 프로세스 속성 하나의 프로세스가 생성한 스레드는 모두 동일한 우선순위 클래스를 가짐 우선순위 클래스 종류 REALTIME_PRIORITY_CLASS(실시간) HIGH_PRIORITY_CLASS(높음) ABOVE_NORMAL_PRIORITY_CLASS(보통 초과; 윈도우2000/XP) NORMAL_PRIORITY_CLASS(보통) BELOW_NORMAL_PRIORITY_CLASS(보통 미만; 윈도우2000/XP) IDLE_PRIORITY_CLASS(낮음)

CPU 스케줄링 (3/5) 우선순위 클래스 종류 (cont'd)

CPU 스케줄링 (4/5) 우선순위 레벨 우선순위 레벨 종류 스레드 속성 같은 프로세스에 속한 스레드 사이에서 상대적인 우선순위를 결정할 때 사용 우선순위 레벨 종류 THREAD_PRIORITY_TIME_CRITICAL THREAD_PRIORITY_HIGHEST THREAD_PRIORITY_ABOVE_NORMAL THREAD_PRIORITY_NORMAL THREAD_PRIORITY_BELOW_NORMAL THREAD_PRIORITY_LOWEST THREAD_PRIORITY_IDLE

CPU 스케줄링 (5/5) 우선순위 클래스 + 우선순위 레벨  기초 우선순위(Base Priority) ... 스케줄러 CPU 스레드 (낮음) 기초 우선순위 (높음)

스레드 동기화 (1/2) 스레드 동기화가 필요한 상황 스레드 1 공유 변수 int money ... ① read money ② money = money+1000 ③ write money 스레드 2 ② money = money+2000

스레드 동기화 (2/2) C/C++ 라이브러리 선택

MFC 스레드 MFC 스레드 종류 작업자 스레드 사용자 인터페이스 스레드(UI 스레드) 메시지 루프를 가지고 있지 않다. 메시지 루프를 가지고 있다.

작업자 스레드 (1/5) 스레드 생성  CWinThread 타입 객체를 동적으로 생성하고 (스레드 를 만든 후) 이 객체의 주소값을 리턴 CWinThread* AfxBeginThread ( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );

작업자 스레드 (2/5) 스레드 생성 (cont'd) pfnThreadProc: 스레드 실행 시작점이 되는 함수(=제어 함수)의 주소 제어 함수의 형태  UINT 함수이름 (LPVOID pParam); pParam: 제어 함수에 전달할 인자(32비트) nPriority: 스레드의 우선순위 레벨 nStackSize: 스레드 스택의 크기 dwCreateFlags: 0 또는 CREATE_SUSPENDED lpSecurityAttrs: 보안 설명자와 핸들 상속 정보

작업자 스레드 (3/5) 스레드 제어 스레드 우선순위 레벨 값을 얻음 스레드 우선순위 레벨 값을 변경 스레드 실행을 일시 정지 스레드를 재시작 int CWinThread::GetThreadPriority (); BOOL CWinThread::SetThreadPriority (int nPriority); DWORD CWinThread::SuspendThread (); DWORD CWinThread::ResumeThread ();

작업자 스레드 (4/5) 스레드 종료 방법 1: 스레드 제어 함수가 리턴. 리턴값이 0이면 일반적으로 정상 종료를 뜻함 방법 2: 스레드 제어 함수 내에서 AfxEndThread() 호출

작업자 스레드 (5/5) 스레드 종료 (cont'd) nExitCode: 스레드 종료 코드 bDelete: 스레드 객체를 메모리에서 제거할 것인지를 나타냄. FALSE를 사용하면 스레드 객체 재사용 가능 void AFXAPI AfxEndThread( UINT nExitCode, BOOL bDelete = TRUE );

UI 스레드 (1/4) UI 스레드 생성 과정 CWinThread 클래스로부터 새로운 클래스를 파생 클래스 선언부와 구현부에 각각 DECLARE_DYNCREATE, IMPLEMENT_DYNCREATE 매크로 선언. CWinThread 클래스가 제공하는 가상 함수 중 일부를 재정의. CWinThread::InitInstance()는 반드시 재정의해야 하며, 나머지 함수는 필요에 따라 재정의함. AfxBeginThread()를 이용하여 새로운 UI 스레드 생성

UI 스레드 (2/4) 스레드 생성  CWinThread 타입 객체를 동적으로 생성하고 (스레드 를 만든 후) 이 객체의 주소값을 리턴 CWinThread* AfxBeginThread ( CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );

UI 스레드 (3/4) 스레드 생성 (cont'd) pThreadClass: 객체 정보를 담고 있는 CRuntimeClass 구조체의 주소 사용 형태  RUNTIME_CLASS(클래스이름) nPriority: 스레드의 우선순위 레벨 nStackSize: 스레드 스택의 크기 dwCreateFlags: 0 또는 CREATE_SUSPENDED lpSecurityAttrs: 보안 설명자와 핸들 상속 정보

UI 스레드 (4/4) 스레드 종료 방법 1: WM_QUIT 메시지를 받아서 메시지 루프가 종료 방법 2: 스레드 제어 함수 내에서 AfxEndThread() 호출

스레드 동기화 (1/3) MFC 클래스 계층도

스레드 동기화 (2/3) 클래스 요약 CSyncObject 스레드 동기화 클래스를 위한 공통의 인터페이스 제공 CCriticalSection, CEvent, CMutex, CSemaphore 윈도우 운영체제에서 제공하는 스레드 동기화 객체(임계 영역, 이벤트, 뮤텍스, 세마포)를 편리하고 일관성 있게 사용할 수 있도록 만든 클래스 CSingleLock, CMultiLock 스레드 동기화 클래스를 편리하게 사용할 수 있도록 보조

스레드 동기화 (3/3) 스레드 동기화가 필요한 상황 스레드 동기화 원리 두 개 이상의 스레드가 공유 리소스를 사용하는 경우 하나의 스레드가 작업을 완료한 후, 기다리고 있던 다른 모든 스레드에게 알려주는 경우 스레드 동기화 원리 스레드 1 매개체 스레드 2 진행 대기

임계 영역 (1/2) 용도 장점 단점 같은 프로세스에 속한 스레드 간의 동기화 속도가 빠름 공유 리소스를 접근하는 다수의 스레드가 있을 때 오직 하나의 스레드만 접근할 수 있도록 함 장점 속도가 빠름 단점 서로 다른 프로세스에 속한 스레드 간의 동기화를 위한 목적으로는 사용할 수 없음

임계 영역 (2/2) 사용 예 // 전역 변수로 선언 CCriticalSection g_cs; ... // 스레드 1 g_cs.Lock(); // 공유 변수 접근 g_cs.Unlock(); // 스레드 2

뮤텍스 (1/3) 용도 장점 단점 공유 리소스를 접근하는 다수의 스레드가 있을 때 오직 하나의 스레드만 접근할 수 있도록 함 서로 다른 프로세스에 속한 스레드 간의 동기화를 위한 목적으로는 사용할 수 있음 단점 임계 영역보다 속도가 느림

뮤텍스 (2/3) 뮤텍스 생성 bInitiallyOwn: TRUE면 뮤텍스를 생성한 스레드가 소유자가 됨 lpszName: 뮤텍스 이름 lpsaAttribute: 보안 설명자와 핸들 상속 관련 구조체 CMutex::CMutex ( BOOL bInitiallyOwn = FALSE, LPCTSTR lpszName = NULL, LPSECURITY_ATTRIBUTES lpsaAttribute = NULL );

뮤텍스 (3/3) 사용 예 // 전역 변수로 선언 CMutex g_mutex(FALSE, NULL); ... // 스레드 1 g_cs.Lock(); // 공유 변수 접근 g_cs.Unlock(); // 스레드 2

이벤트 (1/5) 이벤트 용도 신호(Signaled)와 비신호(Nonsignaled) 두 개의 상태를 가진 동기화 객체 두 개 이상의 스레드가 공유 리소스를 사용하는 경우  임계 영역, 뮤텍스, 이벤트(자동 리셋) 하나의 스레드가 작업을 완료한 후, 기다리고 있던 다른 모든 스레드에게 알려주는 경우  이벤트(수동 리셋)

이벤트 (2/5) 이벤트 객체를 이용한 동기화 이벤트 객체를 비신호 상태로 생성 하나의 스레드가 초기화 작업을 진행하고, 나머지 스레드는 이벤트 객체에 대해 Lock()을 호출함으로써 이벤트 객체가 신호 상태가 되기를 기다림 스레드가 초기화 작업을 완료하면 이벤트 객체를 신호 상태로 바꿈 기다리고 있던 모든 스레드가 깨어나서 작업을 진행

이벤트 (3/5) 종류 자동 리셋(Auto Reset) 수동 리셋(Manual Reset) 이벤트 객체를 신호 상태로 바꾸면, 기다리는 스레드 중 하나만 깨운 후 자동으로 비신호 상태가 됨 수동 리셋(Manual Reset) 이벤트 객체를 신호 상태로 바꾸면, 계속 신호 상태를 유지. 결과적으로 기다리는 스레드를 모두 깨우게 됨. 리셋을 하려면 명시적으로 함수를 호출해야 함

이벤트 (4/5) 이벤트 생성 bInitiallyOwn: FALSE면 비신호, TRUE면 신호 상태 bManualReset: FALSE면 자동 리셋, TRUE면 수동 리셋 lpszName: 이벤트 이름 lpsaAttribute: 보안 설명자와 핸들 상속 관련 구조체 CEvent::CEvent ( BOOL bInitiallyOwn = FALSE, BOOL bManualReset = FALSE, LPCTSTR lpszName = NULL, LPSECURITY_ATTRIBUTES lpsaAttribute = NULL );

이벤트 (5/5) 이벤트 상태 변경 이벤트 객체를 신호 상태로 바꿈 이벤트 객체를 비신호 상태로 바꿈 이벤트 객체를 신호 상태로 바꾸고, 신호 상태를 기다리는 다른 스레드를 깨운 후, 다시 비신호 상태로 바꿈 BOOL CEvent::SetEvent(); BOOL CEvent::ResetEvent(); BOOL CEvent::PulseEvent();

세마포 (1/3) 세마포 한정된 개수의 자원을 여러 스레드가 접근하려고 할 때, 이를 제어하는 동기화 객체 사용 가능한 리소스의 개수(=리소스 카운트)를 유지하여 수행될 수 있는 스레드 개수를 조절

세마포 (2/3) 세마포를 이용한 동기화 세마포를 생성. 이때 사용 가능한 자원의 개수로 리소스 카운트를 초기화 리소스를 사용할 스레드는 자신이 필요한 리소스 개수만큼 Lock()을 호출하며, Lock()이 성공할 때마다 리소스 카운트 값이 1씩 감소. 리소스 카운트가 0인 상태에서 Lock()을 호출하면 해당 스레드는 대기함. 리소스 사용을 마친 스레드는 자신이 사용한 리소스 개수만큼 Unlock()을 호출하며, 이때마다 리소스 카운트 값이 1씩 증가

세마포 (3/3) 세마포 생성 lInitialCount: 세마포의 초기값 lMaxCount: 세마포의 최대값 pstrName: 세마포 이름 lpsaAttribute: 보안 설명자와 핸들 상속 관련 구조체 CSemaphore::CSemaphore ( LONG lInitialCount = 1, LONG lMaxCount = 1, LPCTSTR pstrName = NULL, LPSECURITY_ATTRIBUTES lpsaAttributes = NULL );

CSingleLock 클래스 (1/2) 문제 발생 CMutex g_mutex(...); MyThread() { g_mutex.Lock(); // 예외 상황 발생 g_mutex.Unlock(); }

CSingleLock 클래스 (2/2) 해결 방법 CMutex g_mutex(...); MyThread() { CSingleLock lock(&g_mutex); lock.Lock(); // 예외 상황 발생 lock.Unlock(); }

CMultiLock 클래스 (1/2) 사용 예1 CEvent g_event[3]; CSyncObject* g_pSyncObjects[3] = { &g_event[0], &g_event[1], &g_event[2] }; MyThread() { CMultiLock multiLock(g_pSyncObjects, 3); multiLock.Lock(); ... }

CMultiLock 클래스 (2/2) 사용 예2 CEvent g_event[3]; CSyncObject* g_pSyncObjects[3] = { &g_event[0], &g_event[1], &g_event[2] }; MyThread() { CMultiLock multiLock(g_pSyncObjects, 3); multiLock.Lock(INFINITE, FALSE); ... }