이미 소장하고 있다면 판매해 보세요.
|
1부 개념
1장 개요 ___동시성을 사용해야 하는 이유 ___프로그램 구조와 동시성 ___병렬화 계층 ___동시성을 사용하면 안 되는 경우 ___정리 ___참고 문헌 2장 동기화와 시간 ___프로그램 상태 관리 ______공유 상태/비공개 상태 식별 ______상태 기계와 시간 ______격리성 ______불변성 ___동기화: 종류와 기법 ______데이터 동기화 ______조정과 제어 동기화 ___정리 ___참고 문헌 2부 메커니즘 3장 스레드 ___스레드의 세부 사항 ______윈도우 스레드란? ______CLR 스레드란? ______명시적 스레딩과 대안 ___스레드의 탄생과 죽음 ______스레드 생성 ______스레드 종료 ______DllMain ______스레드 로컬 저장소 ___정리 ___참고 문헌 4장 스레드 고급 활용 ___스레드 상태 ______유저 모드 스레드 스택 ______내부 데이터 구조(KTHREAD, ETHREAD, TEB) ______컨텍스트 ___스레드 생성과 종료 동작 원리 ______스레드 생성 과정 ______스레드 종료 과정 ___스레드 스케줄링 ______스레드 상태 ______스레드 우선순위 ______퀀텀 ______우선순위와 퀀텀 조정 ______실행 중지와 양보 ______스레드 중단 ______선호도: 특정 CPU를 선택해 실행 ___정리 ___참고 문헌 5장 윈도우 커널 동기화 ___기본 개념: 시그널과 대기 ______커널 객체를 사용하는 이유 ______원시 코드에서 대기 처리 ______관리되는 코드 ______APC ___커널 객체 사용 ______뮤텍스 ______세마포어 ______뮤텍스와 세마포어를 이용한 예제: 차단/유한 큐 ______자동 리셋 이벤트/매뉴얼 리셋 이벤트 ______대기 가능 타이머 ______객체 시그널과 원자적인 대기 ______커널 객체 디버깅 ___정리 ___참고 문헌 6장 데이터와 제어 동기화 ___상호 배제 ______Win32 임계 구역 ______CLR 락 ___읽기/쓰기 락 ______윈도우 비스타의 가벼운 읽기/쓰기 락 ______닷넷 프레임워크의 가벼운 읽기/쓰기 락 ______닷넷 프레임워크의 레거시 읽기/쓰기 락 ___조건 변수 ______윈도우 비스타 조건 변수 ______닷넷 프레임워크 모니터 ______보호된 영역 ___정리 ___참고 문헌 7장 스레드 풀 ___스레드 풀 101 ______세 가지 방법: 윈도우 비스타와 윈도우 레거시, CLR ______공통 기능 ___윈도우 스레드 풀 ______윈도우 비스타 스레드 풀 ______레거시 Win32 스레드 풀 ___CLR 스레드 풀 ______작업 아이템 ______I/O 완성 포트 ______타이머 ______등록된 대기 ______기억할 것: 스레드를 소유하면 안 됨 ______스레드 풀 스레드 관리 ______디버깅 ______사례 연구: 스레드 풀의 최상위에서 우선순위와 격리 계층화 ___스레드 풀을 사용할 때 성능 ___정리 ___참고 문헌 8장 비동기 프로그래밍 모델 ___비동기 프로그래밍 모델 ______만남: 네 가지 방법 ______IAsyncResult 구현 ______닷넷 프레임워크에서 APM이 사용되는 장소 ______ASP 닷넷 비동기 페이지 ___이벤트 기반의 비동기 패턴 ______기본 개념 ______취소 지원 ______진도 보고와 증가 결과 지원 ______닷넷 프레임워크에서 EAP가 사용되는 장소 ___정리 ___참고 문헌 9장 파이버 ___파이버 개요 ______긍정과 부정적인 측면 ___파이버 사용 ______새로운 파이버 생성 ______스레드를 파이버로 변환 ______스레드가 파이버인지 확인 ______파이버 간의 전환 ______파이버 삭제 ______현재 스레드 전환 예제 ___추가적인 파이버 관련 주제 ______파이버 지역 저장소 ______스레드 관련성 ______사례 연구: 파이버와 CLR ___사용자 모드 스케줄러 구축 ______구현 ______스택 있는 차단과 스택이 없는 차단 ___정리 ___참고 문헌 3부 테크닉 10장 메모리 락과 락 없는 프로그래밍 ___메모리 읽기와 쓰기 재배치 ______실행되는 것이 항상 작성한 것과 동일한 건 아니다 ______장벽으로서 임계 영역 ______데이터 종속과 재배치에의 영향 ___하드웨어 원자성 ______일반 읽기와 쓰기의 원자성 ______상호 락된 동작 ___메모리 일관성 모델 ______하드웨어 메모리 모델 ______메모리 장벽 ______닷넷 메모리 모델 ______락 없는 프로그래밍 ___낮은 락 코드 예제 ______지연 초기화와 이중 검사 락 ______비차단 스택과 ABA 문제 ______데커 알고리즘 다시 보기 ___정리 ___참고 문헌 11장 동시성 위험 요소 ___정확성 위험 요소 ______데이터 경쟁 ______재귀와 재진입 ______락과 프로세스 종료 ___라이브 위험 요소 ______데드락 ______놓친 깨움(놓친 펄스와 동일) ______라이브락 ______락 수송 ______스탬피드 ______두 단계 춤 ______우선순위 도치와 기아 ___정리 ___참고 문헌 12장 병렬 컨테이너 ___소단위 락 ______배열 ______FIFO 큐 ______연결 리스트 ______사전(해시 테이블) ___락 없음 ______일반 목적의 락 없는 FIFO 큐 ______큐를 훔치는 작업 ___조직 컨테이너 ______생산자/소비자 데이터 구조 ______장애물을 가진 단계적 계산 ___정리 ___참고 문헌 13장 데이터와 태스크 병렬 처리 ___데이터 병렬성 ______루프와 반복 ___태스크 병렬성 ______포크/조인 병렬성 ______데이터 흐름 병렬성(미래와 약속) ______재귀 ______파이프라인 ______검색 ___메시지 기반 병렬성 ___오류에 대한 우려 ______동시성 예외 ______취소 ___정리 ___참고 문헌 14장 성능과 확장성 ___병렬 하드웨어 구조 ______SMP와 CMP, HT ______슈퍼 스칼라 실행 ______메모리 계층 ______비주얼 스튜디오의 프로파일링 ___속도 향상: 병렬 코드와 순차 코드 ______병렬 사용 결정 ______병렬성 성능 향상 측정 ______암달의 법칙 ______임계 경로와 부하 불균형 ______가비지 컬렉션과 확장성 ___반복 대기 ______윈도우에서 제대로 대기하는 방법 ______유일 반복 락 ______Mellor-Crummey-Scott(MCS) 락 ___정리 ___참고 문헌 4부 시스템 15장 입력과 출력 ___중첩된 I/O ______중첩된 객체 ______Win32 비동기 I/O ______닷넷 프레임워크 비동기 I/O ___I/O 취소 ______현재 스레드에 비동기 I/O 취소 ______다른 스레드에 동기 I/O 취소 ______다른 스레드에 비동기 I/O 취소 ___정리 ___참고 문헌 16장 그래픽 사용자 인터페이스 ___GUI 스레딩 모델 ______STA ______반응성 ___닷넷 비동기 GUI 특성 ______닷넷 GUI 프레임워크 ______동기 컨텍스트 ______비동기 동작 ______편리한 패키지: BackgroundWorker ___정리 ___참고 문헌 5부 부록 부록 A 동시성 닷넷 프로그램에 재사용 가능한 라이브러리 설계 ___동시성에 관한 고견 ___세부 사항 ______락 모델 ______락 사용 ______안전성 ______스케줄링과 스레드 ______확장성과 성능 ______차단 ___참고 문헌 부록 B 닷넷 병렬 프로그래밍 확장 ___태스크 병렬 라이브러리 ______미처리 예외 ______부모와 자식 ______취소 ______미래 ______지속 ______태스크 관리자 ______전체 요약: 유용한 병렬 클래스 ______자체 복제 태스크 ___병렬 LINQ ______버퍼링과 병합 ______순서 유지 ___동기 프리미티브 ______ISupportsCancelation ______CountdownEvent ______LazyInit「T」 ______ManualResetEventSlim ______SemaphoreSlim ______SpinLock ______SpinWait ___동시성 컬렉션 ______BlockingCollection「T」 ______ConcurrentQueue「T」 ______ConcurrentStack「T」 ___참고 문헌 |
|
나는 2005년 말쯤 이 책을 집필하기 시작했다. 그 당시에는 듀얼 코어 프로세서가 일반 고객(프로그래머가 아닌)이 구입하는 주류 PC의 표준이었고, 산업계의 일부 사람들이 곧 들이닥칠 동시성 문제에 대해 얘기하기 시작했다(허브 서터Herb Sutter의 논문인 공짜 점심은 끝났다가 생각난다). 물론 사람들이 걱정하는 문제는 과거의 소프트웨어가 추가적인 계산 파워를 자연스럽게 사용할 수 있게 하는 방법으로 작성되지 않았다는 점이다. 클록 속도의 끝없는 증가와는 대조된다. 실질적으로 공짜 점심은 없는 것이다.
동시성은 결국 모든 소프트웨어 개발자의 일에 중요한 부분이 될 것이고, 이런 책은 중요하고 유용한 것이 될 것처럼 보인다. 2년 후에는 운영체제에서 시작해 라이브러리를 거쳐 애플리케이션 자체까지 영향이 미칠 것이다. 이것은 6개월간 작업한 작은 부업 프로젝트인 병렬 언어 통합 쿼리(PLINQ, Parallel Language Integrated Query)의 원형을 마무리 짓던 시기와 일치한다. PLINQ 프로젝트는 동시성과 멀티코어, 특히 동시성이 실제로 일상적인 프로그램에 어떻게 사용되는지에 대한 복잡성을 탐구할 수 있는 통로가 됐다. 나는 동시성을 플랫폼의 어디가 부족한지 알아내는 도구로 사용했다. 이것은 마이크로소프트에서 본업과 더불어 2년간 어느 정도 산업계의 유행어가 된 기술인 소프트웨어 전이 메모리(STM, Software Transitional Memory)에 집중돼 있다. 말할 필요도 없이 동시성의 모든 주제에 관해 꽤나 견고한 지식을 갖게 됐다. 그 주제에 관해 책을 집필하는 것보다 더욱 견고하게 하는 좋은 방법이 있는가? 이런 모든 프로젝트에 종사하고, 결국 PLINQ는 닷넷 프레임워크 기술의 병렬 확장(Parallel Extension)으로 발전됨에 따라 윈도우에서 동시성에 관한 좋은 책이 얼마나 적은지 알고 놀랬다. 나는 계속해서 동시성과 관련된 정보의 복잡성과 소수만 이해하는 내용에 놀라거나 신기해했던 것을 기억한다. 이 내용은 책에 포함하려고 적어두고 특정 목적에 배정했다. 나는 단지 누군가가 전에 이것을 작성해 놓음으로써 복도에서 대화와, 윈도우와 CLR 소스코드에 쏟아 부은 긴 밤, 엄청나게 많은 마이크로소프트 직원의 블로그를 읽고 또 읽는 등의 여러 소스를 샅샅이 뒤질 필요가 없기를 바랐다. 그러나 이 주제에 관한 최고의 책은 90년대 초반으로 거슬러 올라갔고, 여전히 훌륭하긴 하지만 기계학에 중점을 두고 있으며, 병렬 프로그램의 구조화, 병렬 알고리즘의 구현, 병렬성의 위험 요소 처리를 포함한 모든 중요한 개념에 대해서는 충분하지 않았다. 다른 모든 것은 애플리케이션과 시스템, 라이브러리 개발자보다는 학계와 연구자들을 목표로 했다. 나는 스스로 배워면서 찾아냈던 무작위의 모든 정보를 손쉬운 방법으로 처리하는 매력적이고 유용한 방법을 책으로 집필하기 시작했다. 이 책을 끝내는 데 놀랍게도 긴 시간인 2년 반이 걸렸지만, 기술은 천천히 발전하고, 이 주제에 대한 좋은 책의 상태도 그렇게 많이 변하지 않았다. 내가 바라는 노력의 결과는 실제적이고 유용하지만, 여전히 매우 심도 깊은 기술 정보를 포함한 새로운 책이다. 이 책은 장래에 동시성이 모든 소프트웨어의 기본 요구 조건이 될 것이라고 믿는 모든 윈도우 개발자나 닷넷 개발자를 위한 책이다. 이것은 마치 모든 산업의 트렌드를 의미하는 것처럼 보인다. 나는 긴장을 풀고 여유로운 마음으로 이 책을 즐기길 바란다. 그리고 독자들도 그렇게 하길 바란다.---저자 서문 중에서 ★ 옮긴이의 말 ★ 지금 우리는 엄청난 컴퓨팅 패러다임의 변화를 경험하고 있다. 또한 동시성과 병렬성 모두에 기반한 양적인 증가(클라우드, 멀티코어 프로세스)뿐만 아니라 동시성에 기반한 다양성(모바일, 태블릿)에 있어서도 여러 가지 시도가 이뤄지는 시대에 살고 있다. 이런 다양한 하드웨어적인 환경에서 개발자들의 동시성에 대한 학습은 필수라 하겠다. 우선 많은 사람이 혼동해 사용하는 동시성과 병렬성에 대한 용어를 정리해보겠다. 동시성 프로그래밍(Concurrent Programming)은 프로그램이 여러 개의 동시적인 스레드로 실행이 되고, 따라서 결과가 비결정적인 특성이 있다. 반면에 병렬 프로그래밍(Parallel Programming)은 성능 향상에 목적을 두고 명시적으로 멀티프로세서를 사용하는 기술을 말한다. 이 책이 동시성(Concurrency)에 초점이 맞춰져 있음에도 '병렬 프로그래밍'이라는 제목이 정해진 이유는 병렬성(Parallelism)이라는 용어가 동시성을 포함한 광범위한 개념으로 인식되고 있기 때문이다. 오늘날 작은 모바일 기기가 멀티, 쿼드 코어 시대로 나아가고 있고, 대용량 컴퓨팅을 위해 엔비디아(NVIDIA) 사는 그래픽에만 이용되던 GPUGraphic Processing Unit를 GPGeneral Purpose-GPU라고 불리는 형태로 보조적인 계산에도 이용한다. 모바일 컴퓨팅의 변화에 대해서는 애플 iOS와 구글 안드로이드의 발전상에서도 쉽게 확인할 수 있다. 초기 iOS 제품에서는 개발자들의 멀티태스킹에 대한 접근이 철저하게 금지됐다. 당시 애플은 시스템의 안정성을 이유로 들었다. 하지만 iOS가 발전하고 하드웨어 사양이 높아짐에 따라 멀티태스킹의 안정성을 확보하게 된 애플은 개발자에게 동시성을 이용한 프로그래밍을 허용하기에 이르렀다. 이는 싱글코어 하드웨어에서 멀티코어 하드웨어로 나아가는 관문을 통과했다고 볼 수 있다. 애플과는 달리 최초 소프트웨어 개발자 키트SDK를 배포할 때부터 개발자에게 동시성 프로그래밍에 대한 문호를 개방한 안드로이드는 초기에 다소 불안했던 개발 환경을 극복하고, 많은 버그 수정과 테스트 끝에 지금은 높은 안정성을 보여주고 있다. 따라서 이러한 모바일 플랫폼에서 개발자의 동시성에 대한 이해는 시스템의 안정성뿐만 아니라 효율성도 높이는 아주 중요한 요소로 인식되고 있다. 요즘 많은 이슈가 되고 있는 빅 데이터(Big Data)의 처리는 대부분 클라우드 컴퓨팅(Cloud Computing)이라는 대규모 데이터 센터에서 이뤄진다. 클라우드 컴퓨팅의 기본은 병렬성이며, 기본적인 처리 방법은 데이터를 작은 조각으로 나누고, 여러 컴퓨터에 분산해 다루는 것이다. 이러한 기술은 흔히 맵리듀스(Map-Reduce)라고 불리며, 가장 대표적인 플랫폼으로는 하둡(Hadoop)이라는 아파치 공개 소프트웨어를 들 수 있다. 여기서 병렬성의 개념은 동시성의 확장이라고 이해하면 된다. 로컬의 여러 스레드(프로세스)가 동시에 작업을 진행하던 것을 여러 컴퓨터가 작업하는 것이라고 볼 수 있다. 이렇듯 병렬성과 동시성의 기본적인 이해를 높이는 데 이 책의 내용은 여러 모로 도움이 될 것이 분명하다. 마지막으로, 프로세서 자체의 발전상을 이해해야 한다. 지금까지 인텔과 AMD에서 주도하던 프로세서 아키텍처에 새로운 패러다임을 제시한 엔비디아 사는 수백 개의 코어를 이용한 컴퓨팅을 전제로 한다. 하지만 엔비디아 사의 GPU는 자체적으로 동작하기보다는 대용량 컴퓨팅이 필요한 작업에 대해 인텔과 AMD 프로세서의 보조 역할로서 자리매김하고 있다. GPU의 여러 프로세서(코어)에는 하나의 큰 메인 메모리가 있으며, 코어 그룹인 블록Block에는 공유 메모리가 있다. 이런 메모리 구조의 계층화는 동시성의 필요성을 높이는 계기가 됐다고 할 수 있다. 여기에서 이야기한 모든 발전상을 완전히 따라가기에는 무리가 있겠지만, 이 책에서 설명하는 기본 개념을 알고 있다면 개발자들은 어떤 플랫폼에서 개발을 하더라도 엄청난 적응력을 발휘할 수 있을 것이다. 참고로 이 책은 저자인 조 더피(Joe Duffy)가 윈도우 비스타와 2008을 개발하던 시기의 경험을 바탕으로 쓰여진 내용이며, 그 당시에 이미 동시성에 대한 마이크로소프트의 기술은 성숙 단계에 올라 있었다고 볼 수 있다. 따라서 그 이후에 출시된 윈도우 7과 8은 모두 이 책에 설명된 기술을 바탕으로 계승 발전된 형태를 띤다. 이 책은 윈도우 7이나 8의 세부 기술에 대해 논의하지는 않으므로 이에 대한 정보를 얻기에는 한계가 있으나, 윈도우의 동시성 프로그래밍의 기본 기술을 깨우치는 데는 충분히 참고할 만하다. PC 개발자뿐만 아니라, 모바일 개발자, 클라우드 개발자, GPU 개발자 모두가 이 책에서 설명하는 개념을 완벽히 이해하기 바라며, 이 책을 강력히 추천한다. ---옮긴이의 말 중에서 |
|
저자 조 더피는 동시성과 하드웨어 병렬성의 최적 이득을 얻을 수 있는 소프트웨어 작성 방법을 설명하는 큰 일을 해냈다. 이 책에서 저자는 주로 윈도우의 C#과 C++를 사용해 대규모의 병렬 프로그램을 설계하고, 구현하고, 유지하는 방법을 설명한다.
이 책에서는 애플리케이션과 시스템, 라이브러리 개발자에게 멀티코어 프로세서를 위한 효율적이고 안전한 코드를 작성하는 데 필요한 도구와 기술을 전달하는 것을 목표로 한다. 이와 같은 내용은 동시성이 내재되고 사용하기 쉬운 서버 애플리케이션과 계산 위주의 이미지 조작, 금융 분석, 시뮬레이션, AI 알고리즘 등의 문제뿐만 아니라, 더 많은 노력을 바탕으로 동시성을 사용해 속도를 향상시킬 수 있는 수학 라이브러리와 정렬 루틴, 보고서 생성, XML 조작, 스트림 프로세싱 알고리즘 등의 문제에도 중요하다 이 책은 4개의 주요 부분으로 구성했다. 첫 번째로 높은 수준에서 동시성을 설명하고, 다음은 근본적인 플랫폼 특징과 내부 작업에 집중한다. 다음으로 동시성 소프트웨어를 작성할 때 발생하는 공통적인 패턴과 최적의 실습, 알고리즘, 데이터 구조를 설명한다. 마지막으로 동시성 프로그래밍의 일반적인 시스템 아키텍처와 프로세스 관련 내용을 다룬다. ★ 이 책의 구성 ★ 이 책은 네 부분으로 구성했다. 1부 '개념'은 어느 하나의 주제를 깊게 파고들지 않고 높은 수준의 동시성을 소개한다. 2부 '메커니즘'은 플랫폼 특징, 내부 동작, API 상세 설명에 관해 바로 초점을 맞췄다. 3부 '테크닉'은 동시성 소프트웨어를 작성할 때 나타나는 공통 패턴과 최적의 실행, 알고리즘, 데이터 구조를 설명한다. 4부 '시스템'은 전체 시스템 구조와 자주 발생하는 프로세스에서 중요한 내용을 다룬다. 여기서는 연속성이 있다. '개념'은 일반적인 동시성을 기본적으로 이해하게 돕기 때문에 첫 번째다. '테크닉'을 이해하는 것은 '메커니즘'에 대한 확실한 이해가 없으면 어려울 것이며, 비슷하게 실제 '시스템'을 만드는 것은 나머지를 이해하지 않고서는 불가능하다. 마지막에 두 장의 부록도 있다. |