문맥 교환 선점 - munmaeg gyohwan seonjeom

프로세스 정의

  • 프로세스 : 실행 중인 프로그램. 어떤 프로그램이 임의 시점에서 실행되고 있다면 그를 프로세스라고 한다. 프로그램은 저장장치(하드디스크)에 존재한다. 프로그램이 CPU가 이를 다룰 수 있도록 메인 메모리에 탑재되면 프로세스가 된다. 이들은 시스템 콜을 통해서 커널의 통제하에 시스템의 자원을 경쟁하는 주체들이다.
  • 시분할 시스템에서는 임의의 시점에 여러 프로세스가 동시에 수행하는 경우도 있다. 이를 멀티태스킹(혹은 멀티 프로세싱, 태스킹과 프로세싱은 같은 용어라고 봐도 무방)이라고 한다.
  • 프로세스는 그 주체에 따라 두가지로 나뉜다. 응용 프로그램이 실행되면 이는 사용자 프로세스라고 하고, 운영체제가 필요에 의해 생성하는 프로세스는 시스템 프로세스라고 한다.

문맥과 문맥교환

  • 프로세스의 문맥(context) : 시분할 환경에서 프로세스는 수행 중 계속해서 중단과 속개를 반복한다. 프로세스는 이처럼 상태를 변화가 있는 동적인 개체이다. 이 때 프로세스 중단시에는 보존되고 속개 시 다시 복구되어야하는 프로세스의 모든 실행정보를 문맥이라고 한다.
  • 문맥은 메인 메모리의 현재 상태를 의미하는 사용자 수준 문맥 / 커널이 관리하는 내용을 의미하는 커널 수준 문맥으로 나뉜다.
  • 사용자 수준 문맥 : (모든 각 프로세스가 가상 메모리 기법에 의하여 전체 메모리공간을 사용할 수 있다고 간주하자. 이에 대해서 자세히는 추후 알아볼 것이니 그냥 그렇게 가정하자.) 메모리 제일 아래 영역엔 text 영역이 있다. 여기엔 컴파일된 기계어 프로그램 코드가 존재한다. 그 위에는 광역변수가 들어가는 영역이 두 개 있다. 먼저 존재하는 data 영역은 프로그램 개발시 광역 변수로 선언된 초기값이 지정된 변수가 저장된다. 그 위의 bss(Block Started by Symbol)에는 초기화되지 않은 광역변수가 들어간다. 해당 공간에서는 변수명과 타입(크기)만 기억했다가 프로세스가 준비될 때 그 크기만큼의 메모리가 마련된다. 또 그 위에 존재하는 heap 영역은 프로그램에서 메모리를 동적으로 할당(malloc, free 등)할 때 사용되는 공간이다. 맨 위에 존재하는 stack 영역에서는 프로그램 내의 함수가 호출될 때 call stack 자료가 push되고, 그 함수에서 리턴될 때 자료가 pop된다. 대표적으로 지역변수가 이렇게 다뤄진다. 참고로 heap은 아래에서 위로, stack은 위에서 아래로 운영된다. 이러한 모든 정보를 사용자 수준 문맥이라고 한다.
  • 커널 수준 문맥 : 보통 CPU는 명령어를 읽어와서(Fetch), 이를 해독하고 (Decode), 그에 맞는 회로적 기능을 수행하는 (Excute) 세가지 과정을 반복적으로 수행한다. PC는 다음으로 Fetch할 명령어의 주소를 담고 있다. 상태 레지스터인 PSR(Program Status Resister)는 Decode 시 그 결과로 변화되는 여러 상태가 기록되는 공간이다. SP(Stack Pointer)는 사용자 수준 문맥에 해당되는 stack 공간에서 top에 해당되는 부분의 주소를 뜻한다. 이 셋을 특수 레지스터라고 한다. (cf. 이들은 프로세스가 중단될 때 PCB라는 특수한 자료구조에 저장된다.) 그 외에 다른 레지스터는 범용 레지스터인데, 특수 레지스터들과는 달리 사칙연산, 논리 연산에서 사용되는 계산 목적의 레지스터이다. 커널 수준 문맥에는 이러한 특수 레지스터내용과 범용 레지스터 내용, 그리고 프로세스의 현재 자원 사용정보, 커널의 프로세스 관리정보 모두가 포함된다.
  • 문맥 교환 : 프로세스들은 문맥을 보존하면서 서로 번갈아 수행한다. 이 때 일어나는 작업이 문맥 교환이다. 문맥교환은 CPU를 다른 프로세스로 넘기는 작업이다. 실행이 정지되는 프로세스의 문맥은 보존되고, 새로 실행되는 프로세스의 문맥이 활성화된다. 사용자 수준 문맥은 메모리에 그냥 남아있고, 커널 수준 문맥은 추후의 복구를 위해 PCB에 저장되었다가 속개시 원복된다. 이 때 프로세스의 자원 사용정보나 커널의 프로레스 관리 정보는 원래 PCB에 저장되어 있어 그대로 두면 된다.
  • 문맥 교환의 시점 : 문맥 교환의 시점은 타임슬라이스의 소진에 따른 스케쥴링으로 다른 프로세스에게 선정되거나 인터럽트로 CPU가 선점 당했을 때, (비자발적 문맥교환) / 프로세스 스스로 입출력을 요청하거나 프로세스 스스로 다른 프로세스가 보낼 시그널에 대한 대기 요청으로 CPU를 반납할 때 (자발적 문맥교환)이다. (당장은 이해가 잘 안될 수 있지만 추후 더 자세히 알아볼 것이다.)

CPU 스케쥴링의 개념 CPU를 스케쥴링 한다는 것은 어떤 쓰레드가 어떤 우선순위로 CPU를 얼만큼

사용할 것인지 결정하고 수행하는 과정이다. 또 다른 관점에서 보면 CPU스케쥴링 한다는 것은 쓰레드가

작업을 처리하기 위해 중앙처리를 할당 받는 정책을 계획하고 처리하는 방식이다.

CPU 스케쥴링의 목적 시간당 처리되는 프로세스의 수(throughput)를 높이고 CPU의 효율을 높여주기 위함이다.

프로세스가 CPU를 획득해서 작업이 종료 될 때까지의 시간(turn around time)을 최소화 할 수 있다.

응답 시간(response time)을 최소화하여 시스템 내의 자원들의 활용을 최대화 하고 자원들이 유휴상태로

놓이지 않도록 하며 특정 프로세스 실행이 무한정 대기하지 않도록 시한성을 보장하는 역할을 한다.

공평성(fairness)과 예측성(predictability)을 높여주며, 무기한 연기(indefinite postponement)의 방지하고

급격한 성능 저하 방지(graceful degradation)한다.

CPU 스케쥴링의 단계 CPU 스케쥴링은 크게 장기, 중기, 단기 스케쥴러 단계로 나눌 수 있다.

장기 스케쥴러에서 준비큐에 대기하고 있는 태스크들이 우선순위에 따라서 준비큐에 들어가고 준비 큐에 있는

것들이 단기적으로 우선 순위에 맞춰서 수행이 된다. 그리고 수행 중에 우선순위가 더 높은 것이 들어오거나

퀀텀타임이 끝나게 되면 대기 모드로 들어가며 그 내에서 스케쥴이 결정되어서 다시 준비큐에 들어와서 수행을

준비하게 된다.

종류 Long-term Job Scheduling(장기) 어느 작업(Job)을 등록하여 시스템 자원을 이용할 수 있게 할 것

인지를 결정한다. 선택된 작업은 프로세스로 된다. Immediate Level Scheduling(중기) 어느 프로세스에게

메모리를 할당할 것인지를 결정한다. 시스템의 상태에 따라서 조정하게 된다. (suspending / activating)

Short-term Scheduling(단기) 준비 상태의 프로세스들 중 어떤 것에 CPU를 할당할 것인지를 결정한다.

(dispatcher가 수행한다.)

쓰레드 우선순위 우선순위 스케쥴링 알고리즘은 각각의 스레드에 특정한 범위의 우선순위 값이 주어지고,

스케쥴러 루틴은 실행 대기 중에 있는 스레드 중 우선순위 값이 가장 높은 스레드를 선택하여 실행하는 방식이다.

위쪽의 그림은 윈도우 운영체제를 기준으로 하여 쓰레드가 수행되기 위해서 순서대로 기다리고 있는 모습이다.

쓰레드나 프로세스 각각이 우선순위를 갖고 있다. 이 우선순위에 따라서 CPU를 사용할 수 있고 그 사용 시간이

지나면 다시 반환하게 된다. 이러한 방식이 우선순위 방식이다.

선점형 스케쥴링 vs 비선점형 스케쥴링 CPU 스케쥴링 알고리즘에는 크게 선점형과 비선점형으로 나눌 수 있다.

선점형 스케쥴링(Preemptive scheduling)이란 어떤 쓰레드가 CPU를 사용하고 있는 동안 다른 쓰레드에 의해

그 CPU의 사용을 빼앗길 수 있는 스케쥴링 방식을 말하며, 비선점형 스케쥴링(nonpreemptive scheduling)

이란 어떤 스레드가 CPU의 사용권을 다른 쓰레드에게 이양한 후에야 다른 쓰레드가 그 CPU를 사용할 수 있게

되는 방식을 말한다.

관련 게시물

Toplist

최신 우편물

태그