1. 스레드(Thread) 정의
: 한 태스크(Task)안에 있는 여러 모듈들을 엮어서 하나의 프로세스를 만든다는 의미에서 스레드라는 용어를 사용. 한 태스크에는 여러 개의 스레드가 존재할수 있는데, 목적에 따라 여러 가지로 엮을 수 있기 때문이다. 단 하나의 스레드만 가진 태스크를 우리는 프로세스라 한다.
· 현재 대부분의 운영체제는 멀티태스킹을 지원
· 2개 이상의 작업을 동시에 처리하거나 프로그램들을 동시에 구동시키는 것
· CPU 사용율을 극대화 시키고, 대기시간 및 응다비간을 최소화시켜줄수 있다.
· 세미(semi)프로세스라 불리며, 주로 다수의 클라이언트를 처리하는 서버/클라이언트 모델의 서버 프로그래밍 작업에서 주로 사용
· fork()에 비해 빠른 프로세스 생성능력 및 적은 메모리를 사용하기에 경량 프로세스라 불리우기도 함.
· 프로세스내에서 동시에 실행되는 독립적인 실행 단위를 말함
2. 스레드(Thread) 특징
· 어플리케이션의 성능을 향상시킬수 있고, 구현이 쉽다. 즉 작은투자로 큰효과를 기대.
· 스레드를 활용한 대표적인 예) 웹 브라우저
· 스레드를 쓰지 않고 프로세스나 다른 방법을 통하여 비슷하게 구현할수 있다. 반면 대부분의 자원을 많이 소모하여 구현이 복잡해지고 범용성이 떨어지는 등의 문제점이 있다. 스레드를 사용함으로 이 문제들을 해결할수 있다.
3. 스레드(Thread)의 장점 / 단점
: 스레드는 각자의 스택 메모리영역을 가지고 있다. 프로세스와 달리 스레드는 동일한 프로세스내의 다른 스레드들과 전역메모리를 공유한다. 이에 반해 프로세스는 자기 자신의 메모리 영역을 가진다.
①빠른 프로세스 생성 ② 적은 메모리 사용 ③ 쉬운 정보 공유
; 스레드는 작업 디렉토리, 파일 지시자들, 대부분의 전역변수와 데이터, UID와 GID 같은 자원들을 서로간에 공유하고 있기 때문에 자원을 쓰기시 복사(copy-on-write)방식으로 자식 프로세스에게 복사하여 사용하는 프로세스(fork) 방식에 비해 더 빠른 수행능력을 보여주고 있다. 하지만 다중스레드 방식의 프로그래밍에서는 매우 정교한 실패나 의도하지 않은 변수의 공유로 인해 야기되는 실패가 발생할 가능성이 매우 높다. 그 대표적인 예)교착상태
※ 교착상태 : 다중프로그래밍 체제에서 하나 또는 그 이상의 프로세스가 수행할수 없는 어떤 특정시간을 기다리고 있는 상태. 망에서는 사용 가능한 버퍼가 없어 일단의 노드들이 패킷을 전송할 수 없는 상태이다. 데이터 통신망에서 송신기 및 수신기간에 전송할 정보는 있지만 송수신에 필요한 자원이 서러 맞물려 있어 송수신이 이루어질수 없는 현상. 교착상태에는 직접, 간접 및 재조립 교착상태가 있다.
4.스레드(Thread) 사용시 주의할 점
: 확실한 사용 목적이 없는 경우 스레드사용을 자제하는 것이 좋다. 한 개의 스레드를 추가하게 되면 공유자원에 대해 동기화를 생각하고, 이로 인해 프로그램의 설계, 구현, 디버깅에 이르기까지 모든 것을 다시 생각해야 한다. 즉 무조건적으로 스레드를 사용하는것보다는 명확히 독립적인 경우에 한해 스레드를 사용하는 것이 좋다. 실제 스레드에 의해 수행되는 작업량보다 동기화로 인한 오버해드가 더 클 경우에는 사용을 자제하는 것이 좋다. 명확히 독립된 스레드라 하여도 운영체제가 스레드를 다루는 데에 따른 부하가 발생할수 있다.
5.스레드(Thread) 사용여부
: 스레드가 모든 프로그래밍 문제에 있어서 가장 좋은 해답이라 할수없으며 스레드가 항상 좋은 결과만을 나타내지는 않는다. 한 예로 지나친 다중화는 스레드 자체의 연산보다는 각 스레드를 스케줄링하는데 대부분의 CPU타임을 소모하여 스레싱(thrashing)과 같은 문제를 야기할수 있다. 또한 어떤 문제들은 정말로 병행적이지 않아서 스레드를 사용할 경우 프로그램이 더 느려지고 복잡해질수 있으며, 프로그램의 모든 단계가 전 단계의 결과를 필요로 한다면 스레드를 사용하는 것은 그다지 도움이 되지 못한다. 왜냐하면 각 스레드는 다른 스레드가 끝날 때까지 대기상태에 있기 때문이다. 위와같은 경우엔 가급적 스레드 사용을 재고할 필요가 있다.
※좋은 결과를 얻을수 있는 예
① 여러 스레드의 의해서 병렬적으로 다수의 작업을 수행할수 있고, 다중프로세서 하드웨어 등에서 동작하는 프로그램
② 작업 처리량을 증가시키기 위해 중복될수 있는 많은 입출력을 수행하는 프로그램
※ 스레드고유자원: 스레드우선순위, 스택(stack), 스레드 ID, 레지스터 및 스택포인터
<간단예제>
#include<stdio.h>
#include<window.h> //Sleep()함수를 위한 헤더파일
#include<process.h> //스레드를 위한 헤더파일
unsigned __stdcall Thread(void *arg) //스레드 함수
{
while(1)
{
printf("Hello\n");
Sleep(1000);
}
}
void main()
{
_beginthreadex(NULL, 0, Thread, 0, 0,NULL); //스레드 시작
char c='0';
while(1)
{
c = getc(stdin);
if(c)
break; //c에 값이 들어오면 종료
}
}
'프로그래밍 > 시스템' 카테고리의 다른 글
jquery 강제 키 입력 트리거 (0) | 2017.12.19 |
---|---|
MASM 프로그래밍 (0) | 2017.11.06 |
[C] _beginthreadex (0) | 2017.08.19 |
C언어 연산 우선순위 (0) | 2017.07.26 |
[C-알고리즘] 그레이 코드 (0) | 2017.07.21 |