일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 지승욱
- 거제도
- 윈도우 모바일
- 윈도데브
- 소년포비소프트
- 훈스닷넷
- 신동혁
- UX베이커리
- 김춘배
- 신석현
- 데브피아
- 윈도우폰
- 옴니아2
- 쉐어포인트코리아
- 윈모데브
- 스마트폰
- 서진호
- 루나네스
- 윈도우폰7
- 실버라이트 코리아
- 마이크로소프트
- 헤이맨
- winmodev
- 안드로이드
- MIX10
- windows mobile 6.5
- 황광진
- 소년포비
- 주신영
- 윈도우모바일
- Today
- Total
소년포비의 세계정복!!
[ExecuteUnit] Process & Thread 개요 본문
* 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 이라고 볼 수 있다.
'프로그램 세상 > C#' 카테고리의 다른 글
문자열 다루기 (0) | 2009.10.06 |
---|---|
오버로딩,오버라이딩 그리고 new (0) | 2009.10.06 |
[ExecuteUnit] Process 다루기 Demo (0) | 2009.10.06 |
[Thread][동기화] Event (0) | 2009.10.06 |
[Thread] Thread 메서드에 매개변수 넘기기 (0) | 2009.10.06 |