이미 소장하고 있다면 판매해 보세요.
|
1. 소개
멀티스레드 프로그래밍이란 무엇인가? 왜 멀티스레드 프로그램을 작성하는가? 스레드를 사용하면 안 되는 경우 멀티스레드 프로그래밍으로 넘어가기 2. 스레드 스케줄링과 기본 개념 스레드 스캐줄링 멀티스레드 프로그래밍 개념 3. 프로세스와 스레드 API 커널 객체 프로세스 스레드 역학 프로세스 수명에 대한 재조명 4. 스레드 동기화 방법 Interlocked 함수 임계 영역 WaitForSingleObject와 WaitForMultipleObjects 함수 뮤텍스 세마포어 이벤트 5. 스레드간 통신 공유 메모리와 메모리 맵 파일 익명 파이프 스레드와 메시지 처리 MsgWaitForMultipleObjects 함수 6. Mcl: 멀티스레드 프로그래밍을 위한 C++ 클래스 라이브러리 CMcl 라이브러리 클래스 계층도 CMcl 클래스 라이브러리 구현 7. Mcl: 상위 레벨 클래스 CMclShreadMemory CMclLinkedLists CMclMailBox CMclMonitor CMcl 클래스 라이브러리를 위한 Makefile 8. 기초적 스레드 동기화 자원의 상호 배제 단일 허용 관문 경계적 대기 제한된 자원에 대한 경쟁 생산자와 소비자 문제의 변형 9. 고급 캡슐화 기법 객체와 스레드 동기화 스레드 로컬 저장소 10. 고급 스레드 관리 기법 요구에 따른 스레드 스레드 풀 11. 멀티스레드 프로그램에서의 DLL 32비트 DLL의 상세 분석과 의미 구조 DllMain 함수 함수와 데이터의 익스포팅 함수와 데이터의 임포팅 신중한 형태의 DLL을 구현하기 DLL에서의 정적 C++ 객체와 전역 C++ 객체 12. 멀티스레드 사용자 인터페이스와 MFC Win32 윈도우 시스템의 기본 구조 멀티스레드 프로그램과 사용자 인터페이스 왜 MFC를 사용하는가? 멀티스레드 프로그램에서 MFC 사용하기 MFC 프로그램에서 Mcl 사용하기 Mcl4Mfc 클래스 라이브러리 13. 기초적인 멀티스레드 GUI 설계 세 가지 기본 디자인 패턴 스스로 움직이는 컨트롤 식사하는 철학자 문제의 애니메이션을 이용한 시뮬레이션 자발적인 다이알로그 박스 14. 구조적 예외 처리 구조적 예외 처리의 개요 구조적 예외 처리의 일반적인 사용 예 예외 처리를 위한 전략 C++ 와 구조적 예외 처리의 활용 15. 멀티스레드 프로그램 디버깅 병렬적으로 사고하기 하이젠버그 불확실성 원리 코드를 단계별로 흝어라 비주얼 C++ 스레드와 콜스택 윈도우 사용하기 어떤 것이 주 스레드인가? 어떤 스레드를 디버깅하는지 파악해라 디버깅하는 동안 발생하는 문맥 교환에 주의해라 시간은 디버거 안에서도 기다리지 않는다 어떤 스레드가 어떤 윈도우를 소유하고 있는지 파악해라 OutputDebugString을 사용해라 메모리를 나눠라 |
|
WIn32 플랫품에서 프로세스란 자신만의 4기가바이트의 주소 공간을 갖는 단위를 의미한다. 하위 2기가바이트는 순수하게 프로세스만 할당되는 영역이며, 여기에는 애플리케이션의 실행 이미지(.EXE 파일)의 코드와 데이터가 포함되고, 또한 애플리케이션이 사용하는 동적 연결 라이브러리(DLL)가 포함된다. 상위 2기가바이트에는 시스템 코드, 공유 시스템 DLL, 프로세스 사이에 공유되는 코드와 데이터가 위치한다. 운영체제는 프로세스에 대한 다른 정보들도 유지해 나간다. 예를 들면, 현재 어떤 코드와 데이터가 RAM에 있는지, 보안 속성은 어떠한지, 접근 권한, 커널 객체 레퍼런스, 자원의 쿼터(quota) 설정 등이 운영체제에 의해서 유지된다. 물론 이런 정보는 기록을 위한 것이며, 실제로 수행되는 것은 아니다.
실제로 프로세스가 어떤 일을 하기 위해서는 적어도 하나의 스레드가 포함되어야 한다. 스레드는 프로세스 안에서 자신만의 스택과 운영체제에 의해서 스케쥴링되는 CPU 시간을 할당받는 수행의 단위이다. 프로세스는 동시에 수행하는 하나 이상의 스레드를 가질 수 있으며 이런 스레드는 스레드를 포함하고 있는 프로세스의 주소 공간의 문맥(context)안에서 수행된다. 즉 하나의 프로세스 안에 존재하는 모든 스레드는 메모리의 같은 주소에 있는 데이터에 대해서 동일한 값을 얻게 된다. 스레드에 의해서 코드의 수행이 점진적으로 이루어지고 데이터를 수정하며, 바람직한 경우에는 쓸만한 결과를 내면서 진행이 이루어지게 된다. Win 32 API를 사용해서 멀티스레드 애플리케이션을 작성하는 기법에 대해서 이야기하기 전에 먼저 운영체제가 스레드를 어떻게 다루는지에 대해서 살펴보도록 한다. 모든 종류의 멀티태스킹 운영체제의 가장 중심 부분은 스케줄러(scheduler)이다. 스케줄러의 역할은 주어진 시간 동안에 CPU에서 어떤 스레드를 동작하게 할지를 결정하는 것이다. 하나의 CPU가 있는 시스템에서는 실제로 어떤 경우라도 하나의 스레드만이 동작할 수 있다. 따라서 운영체제는 사용자에게 멀티테스킹(multitasking, 다수의 프로세스나 스레드가 동시에 동작하는 것)이 되는 것처럼 보여주기 위해서 시스템에서 동작할 스레드를 선택하고, 스레드가 동작하기 위해 필요한 것들을 준비한 후에 잠깐 동안 스레드를 동작시킨다. 잠시 후에 운영체제는 다시 시스템의 제어권(control)을 얻게 되고(이 과정에 대해서는 뒤에서 자세하게 설명한다), 어떤 스레드를 다음에 동작시킬지 결정한 후에 선택한 스레드를 동작시켜서 또 다시 여러 가지 일을 처리하게 한다. 운영체제의 스케줄러가 갖는 목표는 CPU를 가장 효율적으로 사용해서 컴퓨터의 성능을 최대한으로 발휘하게 하는 것이다. 운영체제가 위와 같은 결정을 내리는 과정은 스케줄링 정책(policy)에 의해서 이루어지며, 이것은 운영체제의 두뇌에 해당된다고 할 수 있다. --- p.32 |