2009년 10월 14일
Multi Thread, Multi Process, Thread 몰라!?
프로그램이 동작하기 위해서는 두 가지의 메모리 공간이 필요하게 되는데 이것이 바로 코드공간과 데이터 공간이다.
코드공간이란, 특정 프로세스의 동작상태를 기록하는 것으로 하나의 프로세스가 독립적인 코드포인터를 가지고 동작하기 위해 꼭 필요하다.
데이터공간이란, 하나의 프로세스가 작동중에 필요로 하는 데이터를 저장해 두기 위한것으로 프로그램 변수나 메모리 스택공간등을 말한다.
하나의 프로세스는 동작하기 위해 이러한 두가지의 공간을 모두 요구하고, 다수개의 쓰레드는 하나의 프로세스 하부에서 나타나는데 이들은 독립적인 코드공간을 가지고 개별적으로 동작할 수 있지만, 독립적인 데이터 공간을 가지지 않으므로 하나의 프로세스 아래에 있는 모든 쓰레드들은 해당 프로세서의 데이터 공간을 각각 공유하게 된다. Multi Thread란, 이런 방식으로 하나의 프로세스가 다수 개의 작업을 가각 쓰레드를 이용하여 동시에 작동시킬 수 있는 것을 말하는데 보통 쓰레드의 생성과 파괴는 코드공간의 관리만을 필요하기 때문에 프로세스의 생성과 파괴보다 훨씬 적은 자원을 소모한다. 이때문에 멀티쓰레드는 동일 작업을 위한 멀티프로세스보다 효율적이라고 이야기하는 것이다.
Thread (쓰레드) : 코드의 실행흐름, 혹은 처리단위 등으로 해석할 수 있다
Process(프로세스) : 실행중인 프로그램을 의미한다. 쓰레드와 비슷하게 생각할 수도 있지만, 프로세스가 쓰레드를 가지고 있는것이다. 한개의 프로세스는 적어도 반드시 한 개 이상의 쓰레드를 가진다. 프로그램이 실행되면 명령어 코드, 필요한 데이터 등이 메모리에 올려지게 되는데 이 주소를 프로세스가 가지고 있다.
1. Multi Thread
가. Multi Thread의 개념
여러개의 쓰레드를 사용하여 하나의 수행업무를 동시에 처리함으로 컴퓨터의 처리속도를 증가시키는 프로세스 제어기법.
CPU가 매우짧은 단위시간인 시분할 방식으로 복수의 Thread에 차례로 활당하여 복수의 처리가 동시에 이루어지는 것 처럼보임.
나. Multi Thread의 특징
예측불가 : 각 Thread는 독립적이며, 실행/종료순서는 예측불가.
동기화 : 한 프로세스내의 다른 Thread들과 Sync.
우선순위 : Thread는 자신의 Stack, PC, 레지스터등의 다양한 우선순위 가짐.
자원공유 : 프로세스의 일부로서 데이터공유가 용이하고 Local 자원임.
성능 : 한 프로세스가 Sequencial하게 수행되는 것보다 월등한 처리성능 가짐.
2. Multi Thread의 문제점 및 해결기법
가. Multi Thread의 문제점
프로그램복잡성 : Thread의 동기화등으로 프로그램이 복잡해짐
경쟁상태돌입 : 동기화가 불확실 할 경우 Race Condition 발생 (DEADLOCK)
우선순위역전 : 우선 순위가 높은 Thread가 실행정지 또는 후순위 처리 될 수 있음
사용자예측불능 : Response Time, 실행순서등을 예측할 수 없음
나. Multi Thread의 문제점 해결기법
주로 Multi Thread 수행시 둘이상의 Thread가 공유자원 접근함으로써 발생되는 문제해결을 위해 공유자원의 접근제어 필요
임계영역(Critical Section) : 사용자객체로부터 공유자원에 대해 하나의 쓰레드만 접근허용
세마포어(Semaphore) : P연산(자원점유상태), V연산(자원해제상태)으로 이루어지며, 자원의 점유와 해제를 통제
상호배제(Mutex, Mutual Exclusive) : 시스템의 어떠한 자원(임계영역)을 한 시점에서 한 개의 프로세스 만이 사용할 수 있도록제어
3. Multi Thread 활용시 고려사항
가. 운영자 측면
Multi Thread의 사용전에 효율적인 프로세스 운영방안 수립이 필수
원하는 수준의 Multi Thread를 지원하는 O/S 탑제 제품의 선택중요
나. 프로그래머 측면
Thread간 자원사용으로 Deadlock 발생하지 않도록 설계 및 프로그래밍 필요
Multi Thread에 대한 개념과 내용을 간단하게 정리해 보았다.
그런데 문제는 실무에서 사실 Multi Thread 프로그래밍이 쉽지 않다는 것이다.
멀티쓰레드 프로그래밍을 잘 하면 성능 좋은 프로그램이 만들어지지만, 조금만 실를 하면 프로그램에 시한폭탄을 설치한것처럼 에러가 발생한다.
개인적으로 생각하는 좋은 멀티쓰래드 프로그래밍이란,
Task가 병행 또는 병렬로 실행
공유 데이터의 동기화
공유 데이터 Lock의 최소화
라고 생각하고 물론 위 셋 중 어느하나 쉽지 않는 것 또한 사실이다.
그리고 멀티쓰레드는 성능 개선을 위해서 하는 부분보다 꼭 멀티 쓰레드를 써야만 쉽게 구현할 수 있는 경우가 있다.
항상 멀티쓰레드 = 성능향상 이라는 등식이 성립하는 것은 아니다 라는 것이다.
Multi Thread에서 문제가 되는 건 쓰레드 생성이나 Context Swith 비용이 아니다. 이는 현재도 충분히 작고, 더더욱 Multi Core라면 어차피 각 쓰레드가 별도의 코어에서 도니까 Context Switch 비용은 큰 의미가 없다고 하겠다.
핵심적인 이슈는, Multi Thread에서 어떻게 과도한 Locking Overhead가 생기지 않도록 일을 잘 나눌 것인가 하는 거고, 다시 말해 Single Thread로 짜는 것보다 프로그램이 훨씬 더 복잡해진다는 것이다. 이를 어떻게 하면 버그없이 과도한 Lock Overhead 없이 잘 구현할 것인가 하는 방법론이 아직 제대로 나와 있지 않아서, 그냥 프로그래밍을 하는 개발자의 천재성(?)에 의존한다라는 것이다.
이 글과 관련있는 글을 자동검색한 결과입니다 [?]
- [스크랩]프로그래머가 알아야 할 기본지식Ⅱ by 비류연
- 멀티코어 시대를 맞이하여 최적화 이슈 1 by 붉은돼지
- 특정 프로세스 찾아서 죽이기 by 낮해밤달
- 멀티 쓰레드 프로그램이 어려운건 바로 이럴때가 아닐까? by Lohengrin
- Oracle - Server process by overdose
# by | 2009/10/14 05:14 | 프로그래밍? 내공? | 트랙백 | 덧글(0)




















☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]