U E D R , A S I H C RSS

5인용C++스터디/멀티쓰레드

  • 발표에 꼭 들어가야 할 것들
    • 프로세스가 무엇인가?
    • 쓰레드가 무엇인가?
    • 멀티쓰레드를 어떻게 사용하나?
    • 쓰레드 동기화가 무엇인가?
    • 크리티컬섹션이 무엇인가?
    • 크리티컬섹션을 어떻게 사용하나?

스레드

스레드란 무엇인가? 실제로 말한다면 하나의 작업의 단위를 스레드라고 할수 있습니다. 윈도98는 멀티 테스킹이 가능한 프로그램입니다. 즉 한 번에 여러 작업을 할수 있다는 것입니다. CPU 자체는 한스텝에 한 개의 작업밖에는 하지 못합니다. 그렇다면 어떻게 윈도95는 멀티테스킹이 가능할까요? 바로 시간 분할입니다. CPU의 처리 속도가 1초에 99개의 작업 한다고 가정을 합시다. 그리고 현재 A,B,C 3개의 프로그램이 동작중이라고 예를 들어본다면 1초에 CPU는 A에 해당하는 작업 33개 B에 해당하는작업 33개 C에 해당하는 작업 33개로 나누어서 작업을 합니다.
이렇게 작업을 함으로써 작업을 멀티 테스킹으로 할수 있다라는 의미입니다. 이때 하나의 작업 단위들을 스레드라고 합니다. "그럼 프로그램 내부에 모든 작업은 스레드로 나누어 지겠네요?" 라는 질문이 있을 것 같은데 그렇지는 않습니다. 스레드란 독립적인 작업 단위입니다. 즉 다른것에 구애 받지않는 자체적인 작업 단위를 스레드라고 합니다. 윈도에서 워드 프로세서를 띄우고 대용량의 데이터를 로드하여 프린터로 출력한다고 가정을 합시다. 프린팅 작업 도중에 워드프로세서를 사용할수 있습니까? 물론 윈도 95에서는 프린터는 프린터 대로 작동을 하고 워드 프로세서는 워드 프로세서대로 작업을 할수 있습니다. 여기에 인터넷을 통해서 큰 데이터를 다운 받는다고 가정을 합시다. 프린터하고 원드프로세서로 새로운 내용을 입력하면서 인터넷을 통해서 데이터를 다운 받을수 있습니다? 물론 할수 있습니다. 여기에서 원드프로세서의 입력작업이 하나의 스레드 프린팅 작업이 하나의 스레드 또한 다운 로드가 또하나의 스레드입니다. 실지로 윈도 98의 내부적인 모든 프로그램의 동작은 멀티 스레드로 설정되어 있습니다. 그렇기 때문에 다중 작업을 할수 있는 것입니다.
프로그램 작성하다 보면 프로그램 수행도중 현재 프로그램은 다른 작업을 수행하면서 또하나의 작업을 수행하고자 할 때가 있을 것입니다. 이때 사용하는 것이 바로 스레드 입니다. 작업을 함수로 프로그래밍을 하고 난후에 이것을 스레드로 형태로 실행하면 됩니다

스레드 동기화

스레드의 동기화
스레드를 동기화 시키는 것은 상당히 어려운 작업중의 하나입니다. 아주 작은 실수만 하더라도 프로그램은 생각과는 전혀 다른 방향으로 흘러가고 맙니다. 또한 여러개의 스레드를 동시에 디버깅 한다는 것도 쉬운일은 아닙니다. 그러나 다해이도 VC는 기본적으로 동기화가 잘 된 프로그램을 제공합니다. 작은 단위의 일을 하는 중간에 자신의 작업을 다른 스레드로 뺏기는 일이 별로 없다는 이야기입니다. 여기에서는 스레드의 동기화에 대한 맛보기 정도로만 소개합니다.
프로그램이 수행될 때 한 개의 데이터를 동시에 두 개의 프로그램이 핸들링할경우가 있습니다. 예를 들어 (a)라는 파일에 A프로그램은 데이터를 입력,수정하고 B라는 데이터는 데이터를 검색합니다. B가 읽고자 하는 시점에서 A라는 프로그램이 그데이터를 수정하고자 한다면 여기에서 문제가 발생됩니다. A가 수정한 후에 B가 읽게 할것인가? 아니면 B가 읽고 난후에 A라는 데이터가 수정을 하게 할것인가? 이런 문제점은 동시성을 가진 운영체제에서 해결해야할 중요한 항목입니다.
A스레드와 B스레드가 동시에 진행하다가 특정 사건이 발생되었을 경우 이때 B스레드는 C라는 결과가 오기 전까지는 스레드 동작을 중지 해야 합니다. 만일 중지하지 않고 현재의 스레드를 계속적으로 진행을 시킨다면 큰 문제점이 나타날것입니다. B의 상태와 C가 생각하는 B의 상태가 같아야 합니다. 이렇게 같게 맟추는 것을 동기화 라고 합니다.
MFC에서는 다음의 6가지 클래스를 멀티쓰레딩을 위해서 제공합니다.
동기 클래스인 CSyncObject, CSemaphore, CMutex, CCriticalSection, CEvent와 동기화된 접근을 허용하는 CMultiLockCSingleLock이 그것이니다.
이중 CSyncObjectCSemaphore, CMutex, CCriticalSection, CEvent의 상위 클래스로서 직접 사용하지는 않습니다.


동기화는 멀티 쓰레드 프로그래밍에서 고전적인 문제이다.

생각하는 것과 식사하는 것, 두 가지 일만 하는 철학자 다섯 명이 있다. 이들 철학자 사이에 하나씩의 스틱이 놓여 있다. 식사 를 하려면 양쪽의 스틱을 모두 가져야만 한다.
만약 모든 철학자가 오른쪽의 스틱을 잡고 있고 왼쪽의 스틱을 기다린다면 문제가 발생한다. 그들은 아무도 왼쪽 스틱을 얻을 수 없으므로 모두 굶어죽게 된다. 물론 철학자들은 모두 사기를 칠 줄 모르며 먹는 양도 모두 같다고 가정한다. 이런 상태를 데 드락이라고 한다. 데드락을 방지하려면 어떻게 해야 할까? 이 애플릿에서는 다섯 개의 스틱 중 하나를 표시하여 표시된 스틱을 잡을 경우 반드시 내려놓고 다른 스틱을 시도하도록 하고 있다. 이렇게 하면 위와 같은 데드락 상황이 발생하기 전에 표시된 스 틱의 왼쪽 철학자는 오른쪽의 표시된 스틱을 내려놓고 왼쪽 스틱을 기다리게 되므로 표시된 스틱의 오른쪽 철학자가 왼쪽 스틱을 얻을 수 있게 된다.

스레드 동기화 (Thread Synchronization) (2)


  • 거의 동시에 일어나는 일이지만 순서가 있는 작업을 수행 할 때 스레드들의 수행순서를 정해주는 것

    - ex)) 통신프로그램 작성시, 전송받은 데이터를 화면에 보여주는 일련의 작업은 반드시 데이터를 전송받은 후에 수행되어야 함 (동기화의 필요성)

멀티 태스킹의 개념

  • 프로그램이 로딩되어, 메모리 상에서 실행되고 있는 상태를 프로세스(process) 혹은 태스크(task)라 한다.
    윈도우는 멀티태스킹 시스탬이다. 즉, 여러 개의 프로세스를 동시에 실행시킬 수 있는 시스템 능력을 가지고 있다. 멀티태스킹은 실제적으로 여러 개의 프로세스가 동시에 실행되는 것이 아니라, 아주 짧은 시간을 여러 조각으로 나누어 마치 동시에 실행되는 것처럼 보이는 것이다.


크리티칼 섹션(Critical Section)

반복적으로 동작하는 두 개 이상의 스레드가 하나의 리소스를 공유하려고 할 때, 동시에 리소스에 접근하지 못하도록 하기 위하여 크리티칼 섹션을 사용한다.

Critical Section of Code 크리티컬 섹션 또는 크리티컬 리젼이라 불리우는 이 부분은 커널과 관련된 중요 부분에서 인터럽트로 인한 커널의 손상을 막기 위해 불리우는 곳이며 또한 수행시간의 단축이 절대적으로 필요한 부분에서 쓰이는 구간이다. 이는 코드와 자원의 공유를 막고 배타적인 공간으로 설정된다.

OS에서 공유자원이나 특정코드가 수행되는 도중에 다른 프로세스에 의해 interrupt 되는것을 방지하기 위해 크리티컬 섹션을 사용하게 된다. 이는 윈도우즈 프로그래밍에서 스레드관련 처리를 해 줄 때에도 나오는 용어이다.



Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2009-05-27 07:09:19
Processing time 0.1842 sec