thread 프로그램을 해야하는 이유.
글쓴이: shjoung / 작성시간: 화, 2004/03/02 - 6:57오후
막연한 질문일지 모르겠지만..
thread를 써야 하는 이야가 뭘까요?
저같은 경우는
여러개의 하드웨어를 동시에 제어하기 위해서 사용하고 있는데..
친구가 thread를 써야 하는 이유를 물으니
대답하기가 쉽지 않군요.
편하니까! 라고 대답해 줄까요?
친구말로는 여러개의 thread실행 시켜 놓고
버그나면 잡기가 어렵다고 하는데...
사실, CPU가 하나인 컴퓨터에서 thread로 짠 프로그램을
실행시켜 보면 그렇게 빠른 성능을 보여주는 것 같지도 않고,
부하가 꽤 크게 걸리는 듯 하기도 한데..
공유메모리를 써서 프로그램 하는 방법도 있다고
들었는데..어떻게 하는줄 모르니,
고수님들의 thread에 대한 의견을 듣고 싶습니다.
Forums:
여러개의 하드웨어를 동시에 작동하기 위해서 바로 그이유때문인것 같습니다.
여러개의 하드웨어를 동시에 작동하기 위해서 바로 그이유때문인것 같습니다.
하나의 쓰레드라면 동시에 여러 하드웨어를 작동시킬수 없을테니깐요.^^
Dig it.
thread가 필요한 이유는 같은 처리를 동시에 하기위해서라고 설명하시면
thread가 필요한 이유는 같은 처리를 동시에 하기위해서라고 설명하시면 됩니다.
쉬운예로 HTTP 서버를 들면되겠죠.
즉, 여러명이 동시에 80포트로 접근했을때 하나의 프로세서로 그것을 처리하게되면
병목현상도 발생하며 동시라고는 하지만 그중에 늦게 접속한 사람은 다른 사람의 처리가
끝날때까지 대기해야하는 일이 발생을하죠.
그래서 동시에 여러 작업을 할 수 있게 하기위해서 사용한 것이 fork()인데 이것은
root와 똑같은 메모리 사이즈를 그대로 유지하기때문에 운영상에 메모리 효율이 떨어지고
그래서 thread를 사용해서 메모리의 효율도 높이고 동시에 여러개의 처리를 하게
되었다고 설명해주면 되겠네요.
물론 fork()나 thread나 동시에 여러 작업을 한다는것은 같기 때문에 자신이 원하는
것을 선택해서 사용하면 되겠지만 그건 논외로 적제적소에 적절한 형태를 사용하면
되겠죠.
위에 예로든것은 제가 알고 있는 사항으로 틀린 부분이 있을 수도 있지만 대체적으로
맞을겁니다. (틀린점이 있다면 다른분의 지적 부탁드리겠습니다. :))
------------------------------
좋은 하루 되세요.
-- 멀티스레드를 사용하는 이유1) 멀티프로세스 보다 훨씬 좋을
-- 멀티스레드를 사용하는 이유
1) 멀티프로세스 보다 훨씬 좋을 때
당연한 얘기로 웹서버를 보면 알 수 있습니다.
2) CPU 가 여러 개일 경우를 대비하여
3) CPU 가 노는 시간을 최대한 없에려고
파일입출력 시나 주변장치 입출력 시에
보통 체널이나 DMA 가 관여하지 CPU 는 잘 관여하지 않습니다.
이런 상태의 CPU 를 다른 작업에 사용한다면 더 효율적일 것입니다.
5) 최종 사용자 인터페이스와 관련하여
용량이 큰 하드가 달린 컴에서 윈도우 탐색기를 실행하면
일단 주스레드는 최상위 디렉토리 정보만 보여주고
다른 스레드가 그 외 디렉토리 정보를 메모리에 꼐속 쌓고 있을 것입니다.
이런 때처럼 사용자 인터페이스와 관련해서 멀티스레드를 사용하는 경우가 있습니다.
ESR's Art of UNIX Programming will be good answer.
In short, DO NOT USE THREAD UNLESS IT REALLY NEEDS.
Re: ESR's Art of UNIX Programming will be good answer.
To chunsj English Mania:
In short, DO USE THREAD IF IT REALLY NEEDS.
AND Speak IN Korean
thread를 쓰는 또 다른 이유
thread를 사용하면 프로그래밍하기 편한 경우가 있습니다.
예를 들자면, 웹서버 프로그램에서 ;-)
1. 여러 개의 연결을 동시에 처리하기 위해 non-block i/o를 씁니다.
하나의 연결은 socket fd와 더불어 여러 자료 구조를 가지고 있겠죠.
아마도 struct나 class instance가 될테고, 프로그램의 main loop은
이런 구조체들을 빙글빙글 돌아가면서 처리를 하게 됩니다.
다른 방법으로
2. 복수의 thread를 씁니다.
자기가 할당 받은 socket fd만 관심있는 thread가 연결 수 만큼 생기게 되는데
관련 정보는 thread의 local 변수 같은데에 저장 되겠지요.. 프로그램의
main loop은 thread 스케쥴링이 될 것이고.
이 두 가지 구조가 사실 cpu가 하나인 경우라면
cpu입장에서 프로그램이 돌아가는 모양새는 상당히 비슷합니다.
. struct 한개, 혹은 instance 하나 ~ . 개별 thread의 자료 구조
. struct array check하면서 loop 돌기 ~ . thread scheduling
그런데, 2번의 방법이 사람 머리로 볼때는 좀 더 생각하기 쉽더군요.
특히, 동시에 처리해야 할 작업이 제 각각인 경우는 thread로 생각하는것이
프로그래밍하기에 직관적일 것 같습니다.
------------ 여기까지 이유 ------
thread간에 간섭이 별로 없다면, 디버깅도 별로 복잡하지 않습니다. 저라면,
1. 여러 작업(특히 상이한)을 한 프로그램에서 동시에 해야한다.
2. 작업들이 서로 간섭을 별로 하지 않는다.
3. thread를 쓰면 performance가 상당히 떨어질 것 같지는 않다.
이럴 경우에 thread를 사용할 것 같습니다.
Re: ESR's Art of UNIX Programming will be good answer.
저는 이 말에 매우 공감합니다 :)
이 말을 사용한 의도는 fork 대신 thread를 사용하려고 할 때 정말로 필요할 때만 thread를 사용하라고 하는 것인 듯 합니다.
실제로 fork가 thread보다 조금 무겁다는 것 이외에 디버깅 측면에서 보나 안정성 측면에서 보나 fork가 프로그래밍하기 훨씬 편하죠 ^^;;
scalable을 생각했다 하더라도 어차피 task의 숫자가 무지하게 늘어나면 한 task를 만들 때 overhead보다는 수많은 task를 스케줄하는 overhead가 훨씬 크기 때문에 생각보다 thread가 fork보다 월등히 앞서지도 않습니다.
정말로 scalable을 생각했다면 non-blocking IO + select/poll/kqueue/epoll 등을 생각해야겠죠.
물론 정말로 thread가 필요할 때는 task간에 공유하는 것도 많고 같이 처리하는 것도 많아서 밀접한 관계에 있을 때라고 할 수 있을 것 같습니다.
CPU를 쓰레드 수+1 만큼 두면 안 쓰셔도 됩니다 ^^;
글 제목을 역으로 생각하면.....답변입니다.. 흐흐..
세상은 넓고, 할 일은 많은데, 난 숨만 쉬고 있니?
제가 아는 바로는..
스레드를 사용하면 다음의 두 가지 장점이 있습니다.
1. 평균 처리 시간이 짧아진다.
예를 들어 A라는 task가 10이라는 시간이 걸리고 B라는 task가 1이라는 시간이 걸린다고 가정합시다.
1) single thread로 처리할 경우
A를 먼저 처리하고 B를 처리한다고 하면, A는 처리에 10이라는 시간이 들고 B는 처리에 11이라는 시간이 든다. 평균 처리 시간은 10.5
2) multi thread로 처리할 경우
A를 먼저 처리하고 B를 처리한다고 가정하고, time slice를 1씩 고르게 배분한다고 가정하면, A를 처리하는데 11이라는 시간이 들고 B를 처리하는데 2라는 시간이 든다. 평균 처리 시간은 6.5
context switch cost를 고려하지 않았을 때, 총 처리시간은 11로 같지만 A,B를 처리하는데 평균적으로 걸린 시간은 multi thread 기반일 때가 빠르다는 것을 알 수 있습니다. 여기서 주의해서 보실 것은 스케쥴링이 잘 될 경우 sigle thread 기반이 더 빠르다는 것입니다. B를 먼저 처리하고 A를 처리한다면 평균 처리 시간이 6이 되고 더욱이 context switch cost도 없게 되지요. 하지만 이는 스케쥴을 잘 해줘야 하는 cost가 들기 때문에
'일반적'으로 multi thread 기반의 프로그래밍이 평균 처리 속도를 빠르게 할 수 있다. 는 것을 알 수 있습니다.
2. I/O operation이 많을 때 노는 CPU를 사용할 수 있다.
이는 다들 아실 내용일 것 같아 생략하겠습니다. ^^
multi thread기반 프로그래밍은 goto와 유사한 이유로 해로울 수 있습니다. 프로그램의 어떤 한 시점에서의 의미가 명확해지지 않기 때문인데요.. 유명한 goto statement considered harmful 이라는 논문을 읽어보시면 좀 더 자세한 설명을 보실 수 있습니다.
http://www.acm.org/classics/oct95/
하지만 평균 반응 시간이라던가 I/O가 많은 프로그램에서의 장점은 무시할 수 없기 때문에 꼭 필요할 때는 써 줘야 겠지요.. :)
Re: thread 프로그램을 해야하는 이유.
님이 짜고도 그이유를 모른다면.. 실제로 불필요하게 쓰레드를 사용했을수 있죠..
따라서 님친구분이 그것에대해 반문을 한것일수있고요
님이 짜셨다면 이유가 있어 짯을것 아닙니까..
이유없이 즉, 그냥 싱글테스킹이나 멀티테스킹으로도 충분히하고 아무문제 없는데(속도나기타여타의성은도 떨어지지않는데) 멀티쓰레드로 짜셨다면 저라도 그런질문했을겁니다.
공사판에 삽으로 할일을 구태여 중장비 동원할필요가없죠.. 기본은삽입니다.
----------------------------------------------------------------------------
Re: thread 프로그램을 해야하는 이유.
움.. 분명 여러개의 하드웨어를 제어하기 위해서 사용한다고
명시되어 있는데요. 그리고, 답글의 분위기가 조금 읽기 편하지가 않습니다.
단어나 글의 끝이 부드러운 글이면 좋겠습니다.
그럼..
세상은 넓고, 할 일은 많은데, 난 숨만 쉬고 있니?
Re: thread 프로그램을 해야하는 이유.
제글이 그런가요..
여러개의 하드웨어를 제어하기위해서는 반드시멀티쓰레드인가요?
그리고 글쓴이가 "분명 여러개의 하드웨어를 제어하기 위해서 사용한다고 "
(그래서 멀티쓰레드를 사용해야한다고 말한의도라면)
했다면 저글의 답변은 이미 질문자체에 써놓았네요.. 질문올릴필요가 없는거죠
----------------------------------------------------------------------------
Re: thread 프로그램을 해야하는 이유.
"저글의 답변은 이미 질문자체에 써놓았네요.. 질문올릴필요가 없는" 거라면
그런 질문에 대한 답글을 남길 필요까지도 없었던 거죠
따라서 그냥 보고 지나쳤어야 했겠죠
굳이 답글을 왜 달았죠
답변 합니다.
좋은 답변들 감사드립니다.
그리고 하나더 질문하고자 합니다.
제가 응용프로그램을 짜려고 하고 있습니다.
Gtk사용해서...
이런저런 메뉴 만들고,
메뉴중에 하나가
TCP/IP로 데이타를 받아들이는 메뉴가 있습니다.
TCP/IP로 데이타를 받으면서
다른 작업을 계속 해야 하는데...
글쎄요.
이때 thread를 사용하는게 좋을까요?
아니면 다른 방법을 사용하는 게 좋을까요?
할일은 많고, 능력은 없다. 결국 이런걸까요?
[quote]TCP/IP로 데이타를 받아들이는 메뉴가 있습니다. TC
저도 이런 경우를 많이 겪는데..
전 일단 fork 씁니다.
스레드도 사용해 보았으나.. 요즘 메모리야 남아도는데..128M 써도 영상 쪽
아니면 꽉 차는 경우는 드물던데요.
스레드를 사용하지 않는 이유는 일단 예기치 못한 오류가 많이 났던거 같던데요.
오래되서기억은안나지만 하나의 프로세스를 둘이상의 스레드로 나누고
그중 한 스레드를 또다시 스레딩 하면 (말이 좀 이상한가요-_-)..
얘기치 못한 상황이 많이 나더군요..
환경은 리눅스 였습니다.
fork 는 아무리 쪼개도 -_- 이상없더군요.
또한 성능면에서도 별 차이 못느꼈구요..
그래서 전 요즘도 fork 한번쓰고 빼먹고 코딩안한거 있음.. 다시 뒤엎기 귀찮아서
포크앞에 스레드 넣어줍니다. ㅋㅋ
또한 포크는 관련함수가 작잖아요 ㅋ
아참 메모리 공유땜에 스레드를 써야할때도 전 그냥 공유메모리를써는 편입니다.
머리가 나빠서.. 스레드 동기 맞추는게 싫더라구요 -_- :wink:
이상 허접답변이었습니다.
----------------------------
www.nate.com
----------------------------
저는 개인적으로 fork 에 대해서 전혀 아는 것이 없지만.. 쓰레드를
저는 개인적으로 fork 에 대해서 전혀 아는 것이 없지만.. 쓰레드를 사용하는 프로그램을 만들어 본적이 있어서 댓글을 답니다.
쓰레드를 쓰면 좋은 점이... 예를 들어서.. 공지메일을 3천통 보낸다고 생각을 해보세요.
일반적인 프로그램에서는 3천번... 전부 순서대로.. 하나 끝나면 다음 하나 보내고.. 그렇게 하겠지요?
하지만 쓰레드를 이용하면 이멜주소를 리스트로 저장해뒀다가.. 쓰레드마다.. 자신이 사용할 이멜주소만 pop 해서 사용하면 상당히 편합니다.
메일보내는 소켓을 달랑 하나만 열어서 사용하는 것보다.. 10개의 소켓을 열어서 사용하면 10배는 빨라지겠지요?
메일을 보내기 위해 소켓을 열고 응답하는 시간이 더 많이 걸리는 것이지 연산속도가 딸리는 것은 아니니까요..
음.. fork 는 정확히 어떻게 작동하는지 몰라서.. 그러는데.. 하여간 같은 데이터 리스트를 공유해서 여러개의 작업으로 할 일을 나누어서 처리하면.. 매우 효율적이지요. :)
이 곳의 주제를 Linux에 (또는 unix?) 제한하고 있지는 않지만,
이 곳의 주제를 Linux에 (또는 unix?) 제한하고 있지는 않지만, 주류는 그 분야라고 생각하고 있었는데, 의외로 fork는 모르고 thread는 아는 사람이 많이 있네요.
물론 win32쪽을 먼저 접하면 충분히 있을 수 있는 일입니다만, 신기하네요 :)
나쁘다는 것은 아닙니다 ^^;;
Re: thread 프로그램을 해야하는 이유.
오옷 :shock: 이럴수가..
님은 먼가 글을 제대로 안보시고 리플다시는군요..
".A.이라면..B.할필요가 없겠죠.." < 이말이 B 할필요가 없다는뜻인가요?ㅡ,.ㅡ;;쿵..
...A가 아니라는뜻이죠..
"...(그래서 멀티쓰레드를 사용해야한다고 말한의도라면)" 이 아니란뜻으로 전받아들였다는 뜻이죠..그랬기때문에 답한것이고요..
----------------------------------------------------------------------------
thread
fork대신 thread를 쓰는 대부분의 경우는 process의 개수를 줄이기 위해서가 아닐까요.
물론 process의 배치를 어떻게 하느냐에 따라 달라지지만 일반적으로 fork를 하여서 비즈니스 로직을 처리하는 경우 작업 요청자의 숫자만큼 process가 생기기 때문에 performance에 영향을 줄 수 있기 때문에 thread를 사용하는 것 같습니다.
아마 fork 천 개만 해도 context switch하는 것이 눈에 보일 것입니다.
그러므로 프로그램의 구조상 어쩔 수 없이 fork하여 작업을 처리하는 형태를 thread를 사용함으로써 thrashing을 막자는 것이 아닐까요..
Be Happy
Eric Raymond는 쓰레드를 싫어합니다. fork로 먼저 구현하는게
Eric Raymond는 쓰레드를 싫어합니다. fork로 먼저 구현하는게 당연한 순서겠죠. (프로세스 생성이 느린 윈도와 VMS가 아니라면 말입니다.)
- 죠커's blog / HanIRC:#CN
다른 분들이 많이 말씀해 주셨지만 저도 몇가지 말해 봅니다thread
다른 분들이 많이 말씀해 주셨지만 저도 몇가지 말해 봅니다
thread 가 fork 보다 선호되는 이유는
일단 스레드간 통신이 훨씬 쉽습니다.
fork 는 IPC 등 으로 통신해야 하는데 반해
thread 는 전역 변수가 공유 됩니다.
그리고 fork 는 프로세스에서 text 영역을 뺀 나머지를
그대로 복사해서 수행하지만 thread 는 필요 요소만 복사해서
수행되기 때문에 메모리도 조금 차지 합니다. 또 이러한 이유로
생성도 더 빠르다고 합니다
Re: 답변 합니다.
음. 아마 i/o 블럭때문에 gui 가 어는 현상 해결하시려고 thread 쓰시려는거 같습니다. ( 예전에 제가 겪었던 문제이네요:) )
krisna 님으로 부터 다음과 같은 답변을 받아서 해결..까진 아니고 공부하는 중입니다. 참고하세요 :oops:
역시 krisna 님의 답변인데
http://bbs.kldp.org/viewtopic.php?t=29353&highlight=g_io_channel
위와 같은 글타레도 있습니다. :D
---------------------------------------------------------------------------
http://jinhyung.org -- 방문해 보세요!! Jenix 의 블로그입니다! :D
약간 논외입니다만 상반된 견해의 두 문서를 읽어 보세요.Why T
약간 논외입니다만 상반된 견해의 두 문서를 읽어 보세요.
Why Threads Are A Bad Idea
http://home.pacbell.net/ouster/threads.ppt
Why Events Are A Bad Idea (for High-concurrency Servers)
http://www.usenix.org/events/hotos03/tech/vonbehren.html
--
익스펙토 페트로눔
댓글 달기