'스케줄링'에 해당되는 글 3건

  1. 2010.02.28 쓰레드(Thread) (2)
  2. 2010.02.25 스케줄링 알고리즘과 우선순위
  3. 2010.02.09 프로세스의 생성과 소멸

쓰레드(Thread) : 하나의 프로그램 내에서 여러 개의 실행 흐름을 두기 위한 모델


1. 독립적인 스택(Stack)을 가진다.

2. 코드 영역을 공유한다.

(위와 같이 쓰레드 main 함수는 코드 영역에 존재하는 모든 함수를 호출할 수 있다)

3. 데이터 영역과 힙을 공유한다.(전역변수와 동적 할당된 메모리 공간 공유 가능)

4. 프로세스 핸들 테이블 공유

프로세스 핸들 테이블에 대한 핸들 정보는

프로세스 내의 쓰레드 들에게 공유되어 각 쓰레드가 그 핸들에 대해 접근이 가능하다
(참고 : 같은 프로세스내의 쓰레드들은 스택 이외의 모든 것을 공유한다)



프로세스와 쓰레드

Windows 에서 프로세스는 단순히 쓰레드를 담는 상자다.

실제 프로그램 흐름을 형성하는 것은 쓰레드이다.


따라서 스케줄러(Windows)가 볼때 2개의 프로세스가 아닌
 
실행 흐름을 가지고 있는 쓰레드 단위로 판단을 한다. 5개의 쓰레드를 인식한 후 스케줄링 한다.

(참고 : 컨텍스트 스위칭 시간

프로세스 A 내의 쓰레드 끼리의 컨텍스트 스위칭은 공유 영역이 많아 시간이 적게 걸린다.

하지만 프로세스 A와 프로세스 B 내의 쓰레드 끼리의 컨텍스트 스위칭은 공유 부분이 없어(프로세스끼리는 독립)

시간이 더 오래 걸린다)



커널(Kernel) 영역과 유저(User) 영역 :


유저 영역 : 사용자가 구현한 프로그램 동작시 사용하게 되는 메모리 영역

커널 영역 : 운영체제 동작시 사용하게 되는 메모리 영역


커널 레벨 쓰레드 :

쓰레드를 생성 및 스케줄링하는 주체가 커널


장점 : 안전성과 다양한 기능

단점 : 유저 모드와 커널 모드로의 전환으로 인해 성능이 저하된다.

(참고 : 사용자가 구현한 프로그램은 기본적으로 유저모드에서 동작하다가 Windows 커널이 실행되어야 하는 경우
커널 모드로의 전환이 일어나고 일을 마치면 다시 유저 모드로 전환된다)


유저 레벨 쓰레드 :

커널에 의존적이지 않은 형태로 쓰레드의 기능을 제공하는 라이브러리를 활용

(참고 : 스케줄러는 쓰레드를 지원하지 않아 쓰레드의 존재를 모른다. 따라서 프로세스 단에서 스케줄링을 한다
따라서 쓰레드 끼리의 스케줄링은 유저가 구현해야 한다) 

장점 : 유저모드에서 커널모드로의 전환이 필요없다. 성능이 좋다

단점 : 프로그래밍 하기 어렵고 커널 레벨 쓰레드에 비해 결과 예측이 어렵다.

'Windows > _System Programming' 카테고리의 다른 글

쓰레드(Thread) 메모리 접근 동기화  (0) 2010.03.04
쓰레드(Thread)의 생성과 소멸  (0) 2010.02.28
쓰레드(Thread)  (2) 2010.02.28
환경변수  (0) 2010.02.25
스케줄링 알고리즘과 우선순위  (0) 2010.02.25
파이프(Pipe) IPC 통신 소스  (0) 2010.02.24
Posted by Dakuo

우선순위(Priority) 스케줄링(Scheduling) 알고리즘 :

각각의 프로세스마다 우선순위를 부여해서 우선순위가 높은 프로세스를 먼저 실행한다.

우선순위가 다른 두 프로세스를 동시 실행할 때,

우선순위가 높은 프로세스가 작업을 마치지 않는다면(블로킹 상태가 되거나 I/O 작업을 하지 않는다면)
우선순위가 낮은 프로세스는 절대로 실행되지 않는다. (기아 상태 : Starvation)



라운드 로빈(Round-Robin) 스케줄링 알고리즘 :

우선순위가 동일한 프로세스들의 형평성 유지를 위해
정해진 시간 간격(타임 슬라이스(Time Slice), 퀀텀(Quantum))만큼만 실행하고 CPU 할당을 넘긴다.

타임 슬라이스 ↑ -> 반응속도 ↓
타임 슬라이스 ↓ -> 성능 ↓ (잦은 컨텍스트 스위칭 발생으로 인하여 시스템이 무리가 가서 성능이 저하된다)



Windows의 스케줄링 알고리즘 :




스케줄링이 진행되는 시점 :

1. 매 타임 슬라이스마다 스케줄러 동작.
2. 프로세스가 생성 및 소멸될 때마다 스케줄러 동작
3. 현재 실행 중인 프로세스가 블로킹 상태에 놓일 때마다 스케줄러 동작



Windows 프로세스 우선순위 :

 Priority  의미
 IDLE_PRIORITY_CLASS  기존 우선순위 4
 NORMAL_PRIORITY_CLASS  기존 우선순위 9
 HIGH_PRIORITY_CLASS  기존 우선순위 13
 REALTIME_PRIORITY_CLASS  기존 우선순위 24
 ABOVE_NORMAL_PRIORITY_CLASS  NORMAL_PRIORITY_CLASS 보다 높고
 HIGH_PRIORITY_CLASS 보다 낮다.( 9< x < 13 )
 BELOW_NORMAL_PRIORITY_CLASS  IDLE_PRIORITY_CLASS 보다 높고
 NORMAL_PRIORITY_CLASS 보다 낮다. ( 4 < x < 9 )

프로세스 우선순위 변경 :

BOOL SetPriorityClass(
        HANDLE hProcess,              // 우선순위를 변경할 프로세스의 핸들
        DWORD dwPriorityClass        // 새롭게 적용할 우선순위 상수값
);


Priority Inversion :

프로세스의 우선순위가 뒤바뀌는 상황

(예 :

프로세스 A > 프로세스 B > 프로세스 C (우선순위)

프로세스 A가 실행이 되다가 프로세스 C에게 데이터를 받을 일이 생겼다.

프로세스 C가 실행이 되게 하기 위해 자신이 Blocked 상태가 되었다.

하지만 프로세스 C보다 우선순위가 높은 프로세스 B가 실행이 되어 프로세스 C가 실행이 되지 않으므로

프로세스 A 또한 실행이 될수 없게 된다.
(즉, 프로세스 A 보다 우선순위가 낮은 프로세스 B가 우선순위가 가장 높은것처럼 되었다))

'Windows > _System Programming' 카테고리의 다른 글

쓰레드(Thread)  (2) 2010.02.28
환경변수  (0) 2010.02.25
스케줄링 알고리즘과 우선순위  (0) 2010.02.25
파이프(Pipe) IPC 통신 소스  (0) 2010.02.24
메일슬롯(MailSlot) IPC 통신 소스  (0) 2010.02.24
커널 오브젝트(Kernel Object) - 2  (0) 2010.02.23
Posted by Dakuo

프로세스(Process) : 메모리에 로드되어 실행중인 프로그램

1. 프로세스를 구성하는 요소

메모리 구조 : 프로세스 생성시 만들어진다.


Register Set : 프로세스 실행을 위해 필요한 데이터들로 채워진다.



2. 프로세스의 스케줄링과 상태 변화

프로세스의 스케줄링(Scheduling) : 프로세스의 CPU 할당 순서 및 방법을 결정짓는 일
(스케줄링 알고리즘(Scheduling Algorithms) : 스케줄링에 사용되는 알고리즘)

스케줄러(Scheduler) : 스케줄링 알고리즘을 적용해서 실제로 프로세스를 관리하는 운영체제 요소(모듈)


(참고 : 멀티 프로세스(Multi-Process) 운영체제의 CPU 사용

실행해야 할 프로세스 여러개라면
멀티 프로세스는 모든 프로세스를 일단 실행시킨 후 운영체제의 스케줄러에 의해 프로세스들을 관리한다.

일반적으로 프로그램은 많은 시간을 I/O(입출력)에 할당한다.
프로그램이 I/O 를 하고 있을때 CPU는 일을 하지 않고 가만히 있는다.

이때 스케줄러가 다른 프로세스로 교체를 하여 CPU를 쉬지 않게 하는것이 멀티 프로세스 기반이다)


프로세스의 상태 변화 :


1. S(Start) : 프로세스 생성 -> Ready

프로세스는 생성과 동시에 Ready 상태로 들어간다.
Ready 상태에 있는 프로세스는 CPU(정확히 말하면 운영체제의 스케줄러)에 의해 실행되기를 기다린다.

2. Ready -> Running

Ready 상태에 있는 프로세스들은 스케줄러에 의해 관리된다.
스케줄러는 Ready 상태에 있는 프로세스중 하나를 선택해서 CPU에 의해 실행될 수 있도록 한다.
(스케줄링 알고리즘 기반)

스케줄러에 의해 선택된 프로세스는 Running 상태가 되어 실행된다.

3. Running -> Ready

일의 중요도에 따라 프로세스들은 생성시 우선순위(Priority)가 매겨진다.
우선순위가 더 높은 프로세스가 Ready 상태에 있다면 스케줄러는 실행중인 프로세스를 Ready상태로 내리고
실행시킨다. Ready 상태로 간 프로세스는 우선순위가 더 높은 프로세스가 종료되기만을 기다린다.

4. Runnimg -> Blocked

실행 중에 있는 프로세스가 실행을 맘추는 상태(Blocked)로 들어간다.
I/O 에 관련된 일을 하는 경우(CPU에 의해 더이상 실행될 수 없다) 스케줄러는 Blocked 상태로 프로세스를 내리고
Ready 상태인 프로세스 중 하나를 실행시킨다.

5. Blocked -> Ready

Blocked 상태는 스케줄러에 의해서 선택될 수 없다.
따라서 Blocked 에 있는 프로세스는 다시 실행될 수 있는 Ready 상태로 간다.

예) :  I/O 가 완료된 프로세스

6. Blocked -> E(Exit)

프로세스를 종료시킬 경우 Blocked 상태를 거쳐 E(Exit)상태로 간다.


컨텍스트 스위칭(Context Switching)

CPU 내에 존재하는 레지스터들은 현재 실행 중에 있는 프로세스 관련 데이터들로 채워진다.

스케줄러에 의해 실행중인 프로세스가 변경되면 CPU 내의 존재하는 레지스터들도 컨텍스트 스위칭에 의해

데이터를 변경한다.


(참고 :

실행되는 프로세스의 변경과정에서 발생하는 컨텍스트 스위칭은
레지스터 갯수가 많을수록 프로세스별로 관리되어야 할 데이터 종류가 많을수록 시스템에 많은 부담을 준다)

'Windows > _System Programming' 카테고리의 다른 글

CreateProcess 함수  (0) 2010.02.10
프로세스(Process) 생성 소스  (0) 2010.02.10
프로세스의 생성과 소멸  (0) 2010.02.09
명령 프롬프트(Cmd) 작성  (0) 2010.02.09
64비트 기반 프로그래밍  (0) 2010.02.08
Windows에서의 문자셋(Character Sets)  (0) 2010.02.08
Posted by Dakuo