원본 출처 :
http://sweeper.egloos.com/2814918

프로세스에 대해 간략하게 리마인드 차원에서 정리한다.

사실 Windows OS에서 프로세스는 쓰레드를 감싸고 있는 박스떼기에 불과하다고 해도 과언이 아니지만,
개념적으로 접근하기 위해 쓰레드보다는 프로세스를 주인공 취급하여 설명토록 하겠다.

귀찮아서 정리할 지 안할 진 모르겠지만, 이후 쓰레드 기초 내용 정리에서 다시 이에 관련된 내용들이 나올 것이다.

------------------------------------------------------------------------------

1. 프로세스란?


실행중인 프로그램의 instance


2. 프로세스의 구성 요소

1) 프로그램 실행시 메모리 구조

Code : 실행 파일을 구성하는 명령어(기계어)들이 올라가는 공간
Data : 프로그램이 종료될 때까지 지워지지 않는 데이터를 저장하는 공간. 대표적으로 전역/Static 변수가 있다.
Heap : 동적으로 할당되는 메모리를 위한 공간
Stack : 함수 내 지역 변수 및 함수 매개변수, 함수 반환 주소

2) Register set

실행 중인 프로세스에 관련된 데이터들고 CPU 내 레지스터들이 채워지기에 역시 구성 요소로 포함할 수 있다.


3. 프로세스 스케쥴링

멀티 프로세스 운영체제에서 하나의 CPU가 복수의 프로세스를 실행하기 위해선 스케쥴링이 필요하다.

프로세스 스케쥴링 방식에 따라 OS를 크게 두 가지 방식으로 나눌 수 있다.

1) Non-Preemptive OS

비선점형 OS는 현재 실행 중인 프로세스보다 높은 우선순위를 가지는 프로세스가 실행된다고 해서 실행 대상을 바로 변경하지 않는다.
새로 실행된 보다 높은 우선순위의 프로세스가 실행되기 위해서는 현재 실행 중인 프로세스가 명시적으로 CPU를 양보할 때까지, 혹은 I/O 작업 등으로 블로킹 상태가 될 때까지 기다려야만 한다.

과거 Windows95 이전, 그리고 Mac OS X 이전의 OS들이 비선점형 OS 였으며, 그 이후의 모든 OS는 선점형 OS 이다.

2) Preemptive OS

선점형 OS는 실행 중인 프로세스보다 높은 우선 순위의 프로세스가 실행되면, 스케쥴러에 의해 실행 순서가 적극 조정되는 OS를 얘기한다.

또한, 비선점형 OS에 비해 훨씬 더 스케쥴링이 복잡하게 처리가 되어 있는데, 우선 순위가 같은 프로세스들간 실행 배분에도 관여를 하기 때문이다.

최근의 모든 OS는 선점형 OS이며, Windows OS에서 선점형 스케쥴링 알고리즘으로 채택하고 있는 두 가지를 소개하겠다.

1. Priority Scheduling Algorithm

뭐 말 그대로 각각의 프로세스마다 우선 순위를 부여해서 우선 순위가 높은 프로세스를 먼저 실행시키는 알고리즘이다.

우선순위 10 프로세스와 1 프로세스가 동시에 실행중이라고 가정해 보자.
10 짜리가 더 높으니 거의 모든 CPU 타임을 10 프로세스가 차지하고 있을 것이다.

그럼 1 짜리 프로세스는 언제 실행되는가?
10 짜리 프로세스가 I/O Busy나 다른 프로세스를 기다리는 등의 블로킹 상태가 되어야만 한다.

2. Round-Robin Scheduling Algorithm

우선 순위 스케쥴링 방식의 예외를 처리하기 위해 고안된 알고리즘.
우선 순위가 같은 프로세스간에는 어떻게 해서 CPU를 분배하는가에 대한 스케쥴링 방식이다.

즉, 같은 우선 순위의 프로세스들간 형평성 유지를 위해 정해진 시간 간격 만큼만 실행을 하고 우선 순위가 동일한 다른 프로세스에게 CPU의 할당을 넘기는 방식을 뜻한다.

실행의 최소 단위 시간 간격을 우리는 Quantum 또는 Time Slice 라 하는데, 동일한 우선 순위의 모든 프로세스들은 이 타임 슬라이스를 기준으로 CPU의 할당을 넘기게 된다.

타임 슬라이스 간격이 관건인데...

1) 너무 길면 인터랙티브한 시스템에서 문제가 될 수 있다. 입력에 대한 반응이 늦는 등...
2) 너무 짧으면 컨텍스트 스위칭이 너무 많이 발생해서 성능 저하 문제가 심각해 진다.

최근 OS들은 보통 15~20ms 간격으로 스케쥴링을 수행한다고 한다.
Windows7의 경우 약 15ms 단위 (정확하게 15.6001ms)로 스케쥴링한다.

따라서, 우리가 만든 쓰레드가 임의로(::Sleep 등) 쓰레드 컨텍스트 스위칭을 시키지 않았다 하더라도,
항상 수행되고 있다고 가정해서는 안 된다는 것을 반드시 기억해야 한다.

특정 쓰레드가 모든 프로세서를 점유하고 있다면 다른 쓰레드가 어떻게 수행될 수 있겠는가?

Window 운영체제의 경우 GetSystemTimeAdjustment 함수를 활용하면 정확한 타임 슬라이스 값을 확인할 수 있다.

  1. DWORD timeAdjustment = 0;
  2. DWORD timeIncrement = 0;
  3. BOOL timeAdjustmentDisabled = FALSE;
  4.  
  5. GetSystemTimeAdjustment(&timeAdjustment, &timeIncrement, &timeAdjustmentDisabled);


정리를 하면,
Windows OS에서는 (Linux도 MAX OS X도...거의 모든 OS에서)

1) 우선 순위 스케쥴링과 2) 라운드-로빈 스케쥴링 알고리즘을 혼합한 선점형 스케쥴링을 수행한다.

윈도우 OS에서는 프로세스들의 Priority와 I/O Busy state 등을 토대로 아래 그림과 같이 스케쥴링한다.



4. 프로세스 스케쥴링 발생 시점

이 발생 시점에 대해서는 특별하게 따로 외우거나 할 필요가 있다기 보다, 스케쥴링 방식을 이해하고 있으면 자연스레 습득할 수 있다.

1) 라운드-로빈 방식을 위한 Every Time Slice 

동일 우선 순위의 다른 프로세스에게 CPU를 넘겨줘야 하는지 판단하기 위해 매 타임 슬라이스마다 스케쥴러가 동작해야 한다.

2) 우선 순위 방식을 위한 프로세스 생성과 소멸

우선 순위가 가장 높은 프로세서가 CPU를 차지해야 하므로, 현재 실행 중인 프로세스보다 더 높은 프로세스가 새로 생성되었는지, 더 높았던 프로세스가 종료되었는지를 알기 위해서는 프로세스가 생성되고 소멸될 때마다 스케쥴러가 동작해야 한다.

3) 실행 중인 프로세스 블로킹

현재 실행 중인 프로세스가 블로킹 상태가 되면, 다른 프로세스가 대신 실행된다. 따라서, 현재 실행 중인 프로세스가 블로킹 상태에 놓이면 다음 실행될 프로세스 선정을 위해서 스케쥴러가 동작해야 한다.


5. Context switching

CPU가 멀티 프로세스를 수행함에 있어 위 그림과 같이 프로세스 스케쥴링이 발생한다.
이로 인해 프로세스의 잦은 교체가 발생할 수 있다.

현재 실행중인 프로세스가 바뀌는 것은 Context switching이라고 하며, 같은 절차가 필요하다.

1) A 프로세스의 데이터로 채워져 있던 레지스터들의 내용을 B 프로세스의 내용들로 교체.
2) A 프로세스의 데이터들은 컨텍스트 메모리에 백업.


'프로그래밍 > 프로그래밍 공부' 카테고리의 다른 글

CPU  (0) 2016.02.15
스레드(Thread)의 기본적인 특성  (0) 2016.02.15
프로세스(Process) , 스케쥴링(Scheduling)  (0) 2016.02.15
스트림(Stream)이란  (0) 2016.02.05
압축  (0) 2016.01.28
statement란?  (1) 2016.01.27
Posted by GENESIS8

댓글을 달아 주세요