IT 그리고 정보보안/Knowledge base

윈도우 스레드 스케줄링 그리고 컨텍스트 스위치

plummmm 2021. 4. 13. 07:16
반응형

스레드 스케줄링에 대해 알아보자.

 

컴퓨터가 여러개의 프로그램을 한번에 사용가능한 이유가 바로 스케줄링이라는 것이 존재하기 때문이다.

각 스레드의 우선 순위에 따라서 CPU사용 시간을 할당하여 처리하므로 나름 쾌적한? 컴퓨터 이용이 가능한 것이다.

 

윈도우는 기본적으로 우선 순위 기반의 선점형 스케줄링을 사용한다.

이렇게 처리 우선 순위가 필요한 이유는 말안해도 알겠지만.. 작업마다 중요도가 다르기 때문이다.

 

예를 들어, 하드웨어에서 요청하는 작업 같은 경우 다른 작업에 비해서 빨리빨리 처리를 해주어야 하므로.. 그리고 만약 우선순위가 낮은 스레드가 cpu를 사용 중인데, 더 중요한 작업의 요청이 올 경우 그 작업 부터 실행하는게 선점형이다.

 

그럼 이제 우선 순위에 관련된 얘기를 좀 해보자. 스레드 우선순위와 IRQL 두가지 개념이 존재한다.

스레드 우선 순위는 IRQL에 속해 있다. "스레드 우선 순위"  "IRQL"

 

스레드 우선 순위

스레드를 처리할 때 참고하는 우선 순위

 

IRQL (Interrupt Request Level)

인터럽트 요청 레벨 즉, 커널 내부에서 인터럽트 요청이 오는 것을 스케줄링하기 위한 우선 순위이다.

 

스레드 우선순위는 KTHREAD, IRQL은 KPROCESS에 구현되어 있다.

 

아래 그림들은 스레드 우선 순위와 IRQL의 관계와 내용에 대한 것을 나타낸 그림이다.

먼저 스레드 우선순위에 관한 그림이다.

 

우선순위가 높으면 먼저 실행되는 거임.

 

실시간 수준에서는  중요 커널 모드 시스템 스레드들 (메모리 관리자, 캐시 관리자 등)이 설정됨.

가변 수준은 이제 우리가 사용하는 응용 프로그램들의 스레드가 설정됨.

맨 아래의 zero-page thread는 다쓰고 해제된 페이지를 0으로 만드는 작업을함.

 

OS를 통해 할당받는 메모리 페이지는 항상 0 즉, 클리어 상태에 있어야 한다.

그래서 이런 작업을 해주는 Zero-page thread가 필요함.

 

방금 말했듯이, 일반 스레드들은 가변 수준에서 기본값 8을 받음. 

다만 윈도우에서 중요한 일부 시스템 프로세스들은 8보다 높은 값으로 초기 설정이 된다.

 

초기 설정이 가변 수준에서 수행되고 후에 값이 변동 될 수 있다.

예를 들어, 너무 오래 대기하거나 하면 가변 순위 내에서 우선순위를 올려준다.

 

실시간 수준까지 올리려면 ISP (Increase Scheduling Priority) 즉, 권한 상승에 대한 특권이 있어야한다.

ISP를 이용하여 올린다고 쳐도, 실시간 수준에서 너무 오래 있으면 중요한 스레드들이 말썽을 부릴 수 있음

얘네들이 말썽부리면 문제가 생김

 

다음은 IRQL에 관해서 봅시더

우리가 위에서 공부한 스레드 우선 순위는 IRQL 1 또는 0에서 동작한다.

 

Passive(Low, 0) 레벨은 인터럽트가 없는 상태이다. 유저 모드의 스레드는 무조건 여기다.

낮은 순위이므로 하드웨어 인터럽트한테 항상 밀림

 

APC (Asynchronous Procedure Call)는 비동기 프로시져 호출이다.

커널에서 요구하는 작업들을 수행할 때 이용되는 레벨이다.

 

이거랑 비동기 프로시져 호출과 무슨 관련이 있나..?

대개 커널에서 요청하는 작업은 일반 스레드가 작업 중이더라도 cpu를 선점해야 한다.  우선순위가 높으니까..

근데 일반 스레드가 하던 작업이 있는데.. 커널 모드 작업이 선점하면 하던 작업을 저장해야 될것이 아닌가

그래서 APC Queue(큐)라고 하는 곳에 저장한다고 생각하면 된다.

 

커널 모드의 스레드가 APC 이상 레벨로 올라가는 경우에 대해 알아보자.

디바이스 인터럽트가 들어오면 자신 보다 낮은 APC 레벨 등의 프로세스를 선점할 것이다.

이 때 디바이스 인터럽트가 자신 보다 낮은 수준의 작업의 IRQL을 자신의 수준으로 올린다.

이 수준이 디스패치 레벨 아래로 내려가지 않으면 스레드 스케줄링은 일어나지 않는다.

 

추가로 Context switch에 대해서 설명함.

 

스레드는 CPU를 점유할 때 지정된 시간이 있음.

이 시간이 끝나면 다른 스레드에게 cpu 사용권을 내어주어야 함, 이때 설정되는 시간을 퀀텀이라고 함.

 

이 퀀텀은 CPU 1클록 당 3 퀀텀임.

 

퀀텀이 다 끝나면 다른 스레드로 넘어간다고 했는데. 이것을 컨텍스트 전환(Context Switch) 이라고함.

 

대학교 때 운영체제 수업 시간에 문맥교환? 이라는 단어로 배운 것인데..

뭐 번역하는 과정에서 생기는 흔한 븅신같은 케이스 인 것 같다.

 

컨텍스트 전환이 일어날 때 TCB ( Task Control Block ) 이라는 곳에 저장하고 다음 실행될 스레드의 정보를 TCB에서 꺼내온다.

 

 

참고 도서 : 리버싱 윈도우

반응형