728x90

처음에 프로그래밍을 배우면 헤깔리는 개념이다.

일단 설명을 하자면,

 

1. 프로그램은 실행가능한 "파일"이다. 

윈도우즈에서는 *.exe 형태이며, 안드로이드에서는 *.apk 형태의 것들이 프로그램이다. 자바에선 *.class 이다.

프로그래머는 소스코드를 짜고, 컴파일러 프로그램을 통해서 컴파일된 결과물이 바로 프로그램이다.

물론, 웹의 자바스크립트나 VB스크립트 등 컴파일되지 않는 프로그램도 있다.

또한, DB 프로시져처럼 파일형태로 존재하지 않는 프로그램도 있다.

 

2. 프로세스는 실행된 프로그램(Running App)이다.

간단하게 생각해보면, 윈도우에서 실행파일을 마우스로 클릭하면,

프로그램이 실행된다. 이 실행된 프로그램을 프로세스라 생각하면 된다.

 

하지만 전산적으로 생각해보면 간단하진 않다.

마우스로 딸깍 하는 순간 여러가지 일이 일어난다.

 

일단 이 순간 OS는 크게 2가지 일을 한다.

- 프로그램 파일을 메모리에 적재(loading)한다.

- 프로세스를 CPU 스케줄링큐(Queue)에 넣는다.

 

아시다시피, 프로그램은 CPU에 의해서 돌아간다.

그라나 CPU가 1개라면, 동시에 돌아갈 수 있는 프로그램은 1개뿐이다.

OS는 트릭을 써서...마치 프로그램이 동시에 여러개 돌아가는것처럼, 보이게 할 뿐이다.

이것이 바로 CPU 스케줄링이다.

 

스케줄러 프로그램(OS안)은 짧은 시간 내에, 프로세스를 CPU에 돌렸다가 내리고, 

다른 프로세스를 돌렸다가 역시 내린다. 아주 짧은 시간동안 이루어지기 때문에,

프로그램이 동시에 여러개 돌아가는 것처럼 보일뿐이다. 이것이 바로 멀티프로세싱이다.

 

마치, 가스버너는 1개뿐인데...

요리그룻을 번갈아가며, 한꺼번에 조리하는모습이라고 할까?

 

 

 

 


 

3. 쓰레드는 프로세스와 비슷하다.

멀티프로세싱이 한 컴퓨터에서 여러 프로그램을 돌리는 것이면,

멀티쓰레딩은 한 프로그램에서 여러 실행흐름이 있는 것이다.

 

일반적으로 프로그램을 짜보면 알겠지만,

Call Stack이란게 있다.

함수1이 함수2를 호출하고, 함수2가 끝나야 함수1의 실행흐름이 다시 시작된다.

이렇게 함수를 부르는게 하나의 실행흐름이다.

일반적으로 C나 Java는 main이란 함수에서 프로그램의 실행흐름이 시작된다.

 

하지만, 쓰레드를 쓰면...

프로그램 안에 별도의 Call Stack - 실행흐름을 만들 수 있다.

즉, 쓰레드를 쓸 때마다...함수를 호출하고 호출하는 흐름이 생기는 것이다.

 

호출흐름이란 말처럼...

쓰레드(실행흐름)은 자기만의 Stack을 갇는다. 

반면, Heap이나 Static한 공간은 쓰레드끼리 공유한다.

 

공유한는 것에서.....

쓰레드 프로그램은 매우 어려워진다.

바로, 공유된 변수에 여러쓰레드가 접근했을 때...

변수의 무결성이 깨질 수 있기 때문이다.

 

그래서, 동기화 코드를 짜야한다.

이게 쓰레드 프로그램의 어려운 점이다.

 

그러나 쓰레드는 속도라는 장점이 있다.

이전 프로젝트나 유틸을 짤 때, 쓰레딩의 성능이슈를 풀어낸 경우가 많다.

- 가장 기억나는게, 파일배치작업이였는데, 쓰레딩을 써서 배치가 한번돌면 1주일걸리던게...4시간까지 줄었었다.

- 또한 배포유틸의 경우 하루종일돌던게, 3분으로 줄었다.

 

왜 쓰레딩을 쓰면 속도가 비약적으로 빨라질까?

그것은 하드웨어 장비의 이용효율이 좋아지기 때문이다.

무슨말인가 하면, 싱글쓰레딩일 경우...파일작업코드에서 waitting이 걸리면, CPU를 놀리고 있게 된다. 

네트웍코드에서 네트웍이 느리면, 하드나 CPU을 놀리게 된다.

DB처리가 오래 결릴 경우, 역시 다른 자원을 놀리고 있게 된다.

 

이게 누적으로 쌓이면, 프로젝트에선 엄청나게 느린 코드가 된다.

생각해봐라...

1건의 DB처리가 1초걸린다고 해도, 1천만건 처리하게 되면....대기시간만으로 1천초를 쓰게된다.

즉, 1천초동안 CPU나 하드, 네트웍장비, 그래픽장비를 놀리고 있는거다.

 

쓰레딩을 쓰면,

해당 쓰레드가 대기탈 때, 다른 쓰레드가 놀리고 있는 CPU나 하드 등 자원을 쓰도록 하게된다.

그렇게되면, DB처리할 때 대기시간, 하드입출력 대기시간, CPU처리 대기시간...등

대기시간의 비약적으로 줄어줄어서...성능이 비약적으로 좋아지게 된다.

요컨데, 쓰레딩을 쓰면, 대기시간을 줄여서 하드웨어 이용을 극한적으로 높이게 되는거다^^

 

728x90

'OS' 카테고리의 다른 글

디스크 스케쥴링 방법  (0) 2014.11.30
프로세스 스케쥴링 방법  (0) 2014.11.30
스레드 간 통신  (0) 2014.11.28
IPC  (0) 2014.11.28
프로세스와 스레드  (0) 2014.11.28

+ Recent posts