탭앤테크

Thread

작성자 정보

  • 소다팝 작성
  • 작성일

컨텐츠 정보

본문

김형욱 [yurius] 님의 글입니다.

출근후 오전에 일이 없어-_-;;

 

이번엔 스레드에 대해 한번 다뤄보려 합니다.

좀 어려울수 있으니 주의 바랍니다 -_-

 

윈도우의 작업관리자를 참고하면 좋겠네요.
일반적으로 많은분들이 저게 정확히 뭘까? 그냥 그러려니 하는 부분이죠.
'핸들, 스레드, 프로세스'

 

이중에 가장 이해하기 쉬운것이 프로세스죠.
말그대로 프로그램 입니다.
메모장10개를 실행하면 10개의 프로세스가 늘어나는 것이죠.
프로세스는 더이상 설명이 필요없으므로 넘어가겠습니다.

 

두번째로 스레드입니다.
깊이 들어가면 복잡하지만, 쉽게 정의를 내리자면,
프로세스내에 존재해서 한가지 일을 처리하는 녀석이라 보면 됩니다.


워드작업을 예를들어, (아래는 예일 뿐이지, 실제로 이렇지는 않습니다.)
키보드를 입력하면 화면에 찍어주는 스레드,
저장버튼을 클릭하면 저장해주는 스레드,
인쇄버튼 클릭시 인쇄해주는 스레드 등이겠지요.

일반적으로 스레드는 동시에 실행될수가 없고,
하나가 끝나야 다음 스레드가 실행될수 있습니다만은,
여러개의 스레드가 동시에 계속 돌고있는 경우가 있지요.
이를 '멀티스레드' 라 합니다.

 

마지막으로 핸들입니다.
핸들은 프로세스가 참조하거나, 핸들링하기 위해 열어놓은 녀석들을 말합니다.
무엇들이 있냐 설명해보면,

참조하는 프로세스 (주로  윈도우 구성요소쪽이 됩니다.),
윈도우스테이션, 스레드 ID, 사용하는 디바이스, 데스크탑,
레지스트리 키, I/O, (키)이벤트 , 포트, 세마포어.......

등등 많은것들이 열립니다.


그리고 각각의 항목은 모두 작업관리자에 표시되는 핸들 수에 추가되는 것이죠.

따라서 수는 핸들 > 스레드 > 프로세스의 순입니다.

 

일단 오늘의 요점은 스레드이므로 스레드 기준으로 설명하겠습니다.
먼저 프로세스와 스레드의 관계는 가깝고도 먼 부적절한(-_-) 관계이므로,
이에대해 확실한 구분을 하고 넘어가도록 하지요.

 

예입니다.

 

아파치 HTTP 서버란 프로그램이 있습니다.
거의 모르는 사람이 없고, 성능으로도 입증된 잘 알려진 웹서버죠.
머나먼 구석기시대인 1.0.x 버전대의 이야기입니다.
그당시 아파치는 프로세스를 여러개 띄워논후,
요청이 들어오면 노는 프로세스를 보내거나,
모자란다면 새로 프로세스를 생성하는 방법을 썼습니다.
즉, 동시에 100요청이라면 아파치 서버가 100개 뜬다는 말이지요.
하지만 현재는 프로세스의 수를 최소화하고 멀티스레드로 처리하지요.

왜 바뀌었을까요?


시간이 흐르며 프로그램이 퇴보하지는 않았을테니,
프로세스가 스레드화 되었다는건 무언가 이점이 있기 때문이겠죠?

장점은 바로 자원의 공유와, 경제성에 있습니다.

 

첫째로,
프로세스 내의 스레드는 모두 해당 프로세스의 자원을 공유합니다.
하지만, 프로세스 단위라면 각각의 프로세스는 별개의 자원이 필요하지요.

 

둘째로,
프로세스의 생성시간은 스레드의 생성시간보다 약 30배 느립니다.
그리고 컨텍스트 스위칭 역시 약 5배 느립니다.

 

위와같이 성능향상을 위해 스레드를 사용하는방법이 있지요.


한가지 예를 더 설명하지요.
다음 예가 스레드의 정의에 상당히 도움이 될듯 하군요.

 

채팅 프로그램이 좋은 예입니다.
아니, 최근에 많이 쓰이는 MSN를 예로 하는것이 더 좋겠군요.
메신저의 기본 기능으로만 볼때,
두가지 기능이 있습니다.
하나는 날라오는 메세지를 잡아서 화면에 뿌려주는 부분.
그리고 자기자신이 메세지를 날리는 부분이지요.
위 두 작업은 별개의 기능이지만 반드시 동시에 수행되어야 합니다.
단일스레드라면 어떠한 문제가 발생할까요?
자신이 메세지를 보내고있을때 누군가에게 메세지가 날라온다면...
이런경우에는 프로그램 수행이 불가능해져버리죠.
즉 무전기가 되어버리는 것입니다.
상대방이 메세지 다 보내고 '오버~' 해줘야,
내가 보낼수 있는 결과가 나와버립니다.
이럴때에 멀티스레드를 사용하면 간단히 해결됩니다.
하나의 스레드는 계속 날라오는 메세지를 잡게 해두고,
다른 스레드로 입력작업을 하면 되겠죠.

 

뭐 대충 설명은 이정도 이고, 이것이 스레드의 전부입니다만,
사실 스레드라봐야. 이론만 찬란할 뿐이지,
실생활에 비슷한 (좀 어설픈 -_-) 예를 든다면 상당히 쉬워집니다.
스레드는 이론을 설명할수록 복잡해지므로,
예를 들어 설명하는게 낫다고 생각이 들기도 하지요.
다음과 같이 스레드 유형에 따라 몇가지가 있습니다.

 

예제1 ) 데이터 공유

3일 굶은 남자 5명이 만두집을 갔습니다.
만두를 5인분 시켰죠.
허겁지겁 먹으려 하겠죠?
그러나 젓가락은 한개뿐.
젓가락 한개로 돌려먹는 방법밖에 없겠군요...-_-;

 

프로세스 : 만두집 프로세스
CPU : 젓가락
스레드 : 남자 5명
공유데이터 : 만두

 

예제2 ) 데이터 공유 스레드 (비동기)

3일 굶은 남자 5명이 만두집을 갔습니다.
만두를 5인분 시켰죠.
주인장왈 만두가 없다네요 -_-;
만두를 만드는데로 계속 넣어주겠다고 합니다.
그러나 남자들의 젓가락 교환시간은 일정하지만,
주인장의 만두제조시간은 빨랐다 늦었다 하네요.
재수없는 남자는 만두가 없어 먹지도 못하고.
어쩌다가 아저씨가 불붙으면 만두가 2개씩 쌓이기도 하네요.

 

CPU : 젓가락
스레드1 : 주인장
스레드2 : 남자 5명
공유데이터 : 만두

 

예제3 ) 데이터 공유 스레드 (동기)

3일 굶은 남자 5명이 만두집을 갔습니다.
만두를 5인분 시켰죠.
주인장왈 만두가 없다네요 -_-;
만두를 만드는데로 계속 넣어주겠다고 합니다.
그러나 남자들의 젓가락 교환시간은 일정하지만,
주인장의 만두제조시간은 빨랐다 늦었다 하네요.
이번엔 주인장께서 감독을 합니다.
만두를 만들어 접시에 담은후,
먹을차례가 된 남자에게 손수 먹여주시네요.
그리도 다시 가서 만두만들고...

 

CPU : 젓가락
스레드1 : 주인장
스레드2 : 남자 5명
공유데이터 : 만두
스택 : 만두접시

 

예제4 ) 스레드 (재우기, 깨우기 (Wait, Notify))

3일 굶은 남자 5명이 만두집을 갔습니다.
만두를 5인분 시켰죠.
역시 젓가락은 한개뿐.
그런데 갑자기 만두가 떨어졌네요.
이유인즉, 주인장왈 "깨쓰가 떨어졌수. 시켰으니 금방올거우"
그러나 제대로 못알아들은 굶주린 5인의 남자는,
계속 젓가락 돌려가며 "만두 안줘요?" 를 외치는데...
열받는아저씨... 이 남자들을 쥐어패 모조리 잠재웁니다.
시간이흘러...
깨쓰통을 교체하고. 남자들을 깨웁니다.
그리고 정상궤도로...

 

...
여기서 더 깊이 들어가면 저도 정신이 없어질거같아,
글은 이상으로 마칠까 합니다.
이번에는 예제도 이상하고 예제위주로 나아가서 더 지저분해지네요.
파코즌분들이 모두 프로그램하는 분들도 아니고, 최대한 쉽게쉽게
하나보니 이런결과가 나왔습니다.

 

어쨋든 도움이 되기를 바라며,
저도 완벽하지는 못하기 때문에 잘못된점 지적해주시면 수정해나가도록 하지요.
또한 다루기를 원하는 내용에있어서는 쪽지주시면 참고하겠습니다.

관련자료

댓글 0
등록된 댓글이 없습니다.

최근글


새댓글


  • 댓글이 없습니다.