개요
- 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가 실행되도록..
두개의 차이점을 비교하여 볼 것..
댓글 없음:
댓글 쓰기