2010년 3월 24일 수요일

What the hell is "Thread"

Thread

개요
 - Process:
   .4GB의 가상메모리를 할당 받음(필요한 부분만 memory에 올라가고, 나머지는 HD에 할당)
   .CreateProcess() API함수에 의해 생성됨.
   .하나 이상의 thread를 가짐.
 - Thread
   .Process의 단일한 실행 흐름을 의미함
    → thread는 process의 처리를 세분화한 개념으로 생각할수 있음.
    → process를 하나의 집, thread는 그 집의 거주자로 비유한 예.
    → 실행 파일을 실행하면 하나의 process가 생성되고, 내부적으로는 하나의 thread가 실행됨.
       이때 thread는 실제 실행단위임.
   .thread는 우선 순위를 가지며, 하나의 process에서 다수의 thread가 실행될 수 있음(multi-thread)
   .왜 thread가 필요한가?
    → 한 사람보다 두 사람이 동시에 일을 하면, 같은 시간동안 많은 일을 처리할 수 있음.
    → 혼자서는 절대 처리하지 못하는 일도 있음.
   .User Interface Thread와 Worker Thread로 구분됨.

 - Comment:
   .HW는 concurrency를 지원하지만 SW coding 상에서는 이를 구현하기가 어려움. SW는 sequential하게
    line by line으로 처리되므로.. thread는 이 HW의 concurrency를 흉내내기 위한, concurrency를 지
    시하기 위한(마치 HDL에서 처럼) 일종의 장치인 것 같다.
 
User Interface Thread / Worker Thread
 1.User Interface Thread
  - Application의 작업과는 독립적으로 작동하며 메세지 처리를 통해 event에 반응할 수 있는
    application을 만들때 사용
  ex) Windows 탐색기: 탐색기에서 file복사를 하는 중에도 임의의 폴더를 클릭시
      폴더의 내용을 화면에 보여줌.
      → 만일 이것이 thread로 구현되지 않았을 시, 복사중에 또 다른 action을 취할 수는 없는것임.
 
 2.Worker Thread
  - Background 작업을 위해 사용.

Functions
 - AfxBeginThread():
     MFC에서 thread를 생성하는 함수
     이 함수를 이용하면 특정 전역 함수를 별도의 thread로 실행할 수 있음.
     thread로 실행할 함수 내부에서 MFC class(CString, CWnd등)객체를 사용해야 하는 경우에 사용
 - CreateThread():
     thread로 실행할 함수 내부가 Win32 API로 채워지는 경우 유용함.
 - WaitForSingleObject():
     특정 객체(object)의 상태가 설정(set)될 때까지 현재 thread의 실행을 멈추는 역할을 함.
 - Sleep():
     인자로 주어진 시간만큼 무조건 흐름이 정지되는 함수
     위의 WaitForSingleObject()함수는 주어진 시간 이내에 특정 핸들(memory)의 상태가 설정(set)
     되기를 기다린다는 점이 Sleep()과의 차이점.
 - TerminateThread():
     thread를 강제 종료시키는 API함수.
     이때 thread를 관리하면서 사용했던 memory는 해제되지 못하고 낭비됨.
     특수한 경우로 용도를 제한하고 가급적 사용을 자제해야 함.

Example) Worker Thread 의 작성
 - Worker thread는 AfxBeginThread()함수를 이용하여 쉽게 만들 수 있음.
   ex) CWinThread* pThread = AfxBeginThread(ThreadFunc, &threadInfo);
      첫번째 인자: thread로 실행할 함수명 → ThreadFunc가 background작업으로 실행됨.
      두번째 인자: 함수에서 사용하게 될 인자.
 - 순서
  1) thread로 실행할 함수를 작성함.
     이때 thread로 실행할 함수는 반환형이 'UNIT', 인자는 'LPVOID' type이어야함
     ex) UINT threadTest(LPVOID pParam)
         {
          
          }
  2) AfxBeginThread()함수의 인자로 함수명을 전달
  3) Worker thread를 만들고 실행 할 수 있음.

TODO is..
 - 무한 loop를 실행하는(for(;;);) application을 작성하되,
   하나는 thread를 사용하는 loop를, 또 다른 하나는 thread없이 전역함수에서 loop가 실행되도록..
   두개의 차이점을 비교하여 볼 것..

댓글 없음:

댓글 쓰기