소년포비의 세계정복!!

[ExecuteUnit] Process & Thread 개요 본문

프로그램 세상/C#

[ExecuteUnit] Process & Thread 개요

소년포비 2009. 10. 6. 06:30

* Process

우리가 보통 작성하는 프로그램은 결과물로써 EXE로 하드 디스크에 저장된다.

그리고 이렇게 저장된 응용프로그램은 실행 시 이 응용프로그램에서 사용하는 각종

데이터와 외부 코드 라이브러리 등이 메모리로 로드 되어 진다.

이렇게 로드 된 응용프로그램의 실행 단위(환경) Process 라 한다.

각 응용프로그램마다 자기 자신만의 독립된 실행환경(Process) 하에서 실행되기 때문에

하나의 Process 가 실패하더라도 다른 Process 들에는 아무런 영향을 주지 않는

안정성을 가지게 된다.

다음은 Process 의 개요에 대한 설명이다.

- 응용프로그램의 실행 단위

- 실행중인 하나의 프로그램

- 실행 중인 응용프로그램에 의해 사용되는 메모리 할당과 리소스들(외부 코드 라이브러리

   및 주 Thread)을 일컫는 용어

- Process 는 메인 Thread (응용프로그램의 진입점을 가진)를 최소한 하나는 갖는다

- 응용프로그램의 진입점인 메인 Thread를 최소한(반드시) 하나는 갖는다

 

현재 내 컴퓨터에서 실행되고 있는 프로세스 목록은 작업관리자에서 확인 가능하다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

실행중인 Process 는 그 Process 를 실행한 사용자와 CPU 및 메모리 현재 사용량과

고유한 프로세스 식별자(PID) OS로부터 할당받는다.

 

* 멀티 태스킹 (multitasking)

일반적으로 단일 CPU 환경(CPU가 하나인 컴퓨터)에서는 단위 시간에 하나의

프로그램만 실행시킬 수 있다.

그러나 특정 기법으로 동시에 두개 이상의 프로그램을 동시에 실행시키는 기능을

멀티 태스킹이라 한다.

이 특정한 기법이란 대표적으로 시분할기법이 있다.

(‘메시지기법도 있긴 하지만 이것은 단지 멀티 태스킹을 흉내내는 기법이라 한다)

(일반적인 상황에서 멀티 태스킹을 말하자면 컴퓨터로 음악을 들으면서 웹 서핑을 하고

문서를 출력하는 등.. 여러 프로세스를 동시에 실행하는 것을 생각하면 되겠다.)

 

* 시분할(Time-Shared)

시분할 기법은 멀티 태스킹 및 멀티 쓰레드를 가능케 하는 기법으로써

아주 짧은 시간 간격을 두고 여러 개의 프로그램(쓰레드)을 전환하면서 실행하는 방법이다.

이렇게 전환되는 속도가 거의 찰나에 가깝기 때문에 사용자들은 두개 이상의 프로그램이

동시에 실행되는 것처럼 느껴진다.

이렇게 프로그램들의 실행을 전환하는 것은 OS가 담당한다.

멀티 태스킹 : 컴퓨터의 프로그램 단위로 시분할

멀티 쓰레드 : 프로그램내의 함수의 단위로 시분할

다음 그림은 두개의 프로그램(or 쓰레드)에 대한 시분할 실행에 관한 흐름이다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

위의 두 개의 Process(or Thread) 는 동시에 실행되는 것처럼 느껴진다.

 

 

* Thread

앞서 Process 에 대해 알아 보았다.

Process 는 응용프로그램의 실행단위라고 설명하였다.

Process 에는 많은 함수(특정 실행 흐름, 프로그램 코드)들을 포함하고 있으며

이 함수들은 특정한 조건(순차,이벤트등)에 의해 실행되어 진다.

CPU는 결국 Process 를 실행할 때 그 Process 내의 특정 함수를 실행하게 된다.

(처음 Process 가 구동될 때 Main 함수를 실행하듯이..)

이렇듯 Thread OS CPU에 할당하는 최소의 실행단위 이다.

다음은 Thread 의 개요에 대한 설명이다

- Process 내에서 실행되는 흐름의 단위.

- os cpu 에 할당하는 최소의 실행 단위

-일반적으로 하나의 Process 는 하나의 Thread( Thread)를 갖는다 (단일 스레드)

 그러나 하나의 Process 에 다수의 쓰레드를 동시에 실행할 수도 있다(멀티 스레드)

 ( Thread 와 작업(Worker) Thread)

   

다음 그림은 하나의 Process 내 두 개의 Thread 를 나타낸다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

* 멀티 쓰레드 (multithread)

앞서 설명한 멀티 태스킹의 개념과 거의 유사하다

단 멀티 태스킹은 Process 단위로 동시 실행을 의미하지만 멀티 쓰레드는

하나의 Process 내의 여러 Thread 단위로 동시 실행을 의미한다.

- 특정 Process 내의 다수의 실행(흐름)들이 동시에 진행된다.

- 프로세스 내의 메모리를 공유한다.

  멀티 태스킹에서는 서로 다른 Process 이기 때문에 Process 간 메모리 공유를 하지 않는다

- 스위칭 : CPU가 프로세스 내의 특정 스레드를 실행하다가 다른 스레드를 실행할 때

            스레드간의 스위칭(전환)이 일어 난다

- 프로세스간의 전환 속도(멀티 태스킹) 보다 쓰레드 간의 전환 속도가 빠르다

그러나 하나의 프로세스에 너무 많은 쓰레드를 두는것도 위험할 수 있다.

결국 쓰레드간의 전환도 비용이 드는 작업이기 때문이다.

- Time-Slice : CPU가 하나의 쓰레드를 실행시키는 단위 시간

 

(일반적인 상황에서 멀티 쓰레드을 말하자면 MS 워드로 글을 작성할 때 글 작성과 동시에 맞춤법을

검사한다. 이처럼 하나의 프로세스에서 여러 다른 작업이 동시에 일어나는 것이다)

 

하이퍼 스레딩

기본적으로 하나의 CPU 는 단위시간에 하나의 작업만 처리 할 수 있다.

앞서 언급했듯이 단일 CPU에서의 멀티 스레딩 역시 찰나에는 하나의 스레드만

실행되는 것이다.

그러나 최근의 Intel CPU 에는 하나의 CPU 가 다수의 스레드를 동시에 처리 할 수 있는

기능을 가지고 있다. 이것을 하이퍼 스레딩이라 한다

 

 

* 스케줄링

멀티 태스킹이나 멀티 쓰레드의 경우 시분할기법을 사용하여 멀티 Job 을 수행한다고 하였다

이 경우 다수의 프로세스(쓰레드) 중 어떤 우선순위로 처리 하는지 결정하는 것을 스케줄링이라 한다

다음은 스케줄링 방식 중 라운드 로빈에 대한 설명이다

 
여러 작업들이 동시에 그 실행의 요청이 들어 왔을때 우리의 CPU는 어떻게
그 여러 작업들을 처리 하게 되는 것인가?
여기에는 몇가지 스케줄링 방식이 있다.
우선 닷넷환경에서는 라운드 로빈(Round Robin) 방식을 따른다.
라운드 빈이란 여러 작업들이 cpu의 일정 클럭 수 만큼 조금씩 실행되는 방식이다.
간단히 말해 A,B두 작업의 요청이 들어왔을때 A작업 쬐끔하고 B작업 쬐끔하고..
A작업 쬐끔하고 B작업 쬐끔하고..  이런식을 되풀이 해서 두 작업을 처리하는 것이다..
..언놈이 먼저 요청을 했건 말건 공평하게 나눠주는..
 
이것말고 또 다른 방식은 먼저 들어온놈 부터 처리하는 방식이 있다..
마치 선착순 같이.. 이 방식을 FCFS(First Come First Service) 라 한다.
어떻게 보면 부지런한 사람이 성공하는 원리와 같은게..
남들보다 부지런 하면 성공하는 인간사와 비슷하다고 생각한다.
 
또 있다.
누가 먼저 작업 요청을 했건 뒤에 요청한 놈이라도 앞에 요청한 놈보다 짧은 작업시간만을
필요로 한다면 그 놈부터 처리하는 방식이다.
이건 마치 차별 하는 것 같아 개인적으로 밉다.
먼저 요청 했더라도 뒤에 놈이 더 잘난 놈이면 그 놈부터 받아 주겠다는 거잖아..
이것을 SJF(STRN)이라 한다
 
이 외에 우선순위를 주어서 다른 쓰레드 보다 실행우선권을 줄 수도 있다.
따라서 정확히 따져보면 닷넷환경에서의 스레드는Round Robin + Priority  이라고 볼 수 있다.