<운영체제> CPU SCHEDULING - Thread, Multiple-Processor Scheduling
HONG CHANGSUB -
본 게시물은 영남대학교 곽종욱 교수님의 강의를 기반으로 작성됨
Thread란?
간략한 개념은 아래의 그림처럼 하나의 프로세스 내의 “lightweight-process”라고 이해해도 된다.
즉, 프로세스 내에서 프로세스의 resource를 이용하여 실제로 작업을 수행하는 것이 Thread이다.
기본적으로 Multi-Tasking(or MultiProgramming)을 지원하는 OS의 경우, 하나의 프로세스내에서 여러 쓰레드가 동시에 실행되는 Multi-Threading을 지원한다.
Thread는 user-level과 kernel-level 그리고 LWP, 총 세가지 종류가 있다.
user-level는 사용자가 만들어내는 Thread, 즉 우리가 프로그래밍 언어를 사용해서 만들어내는 사용자 Thread이며, kernel-level는 OS가 만들어내는 Thread이다. 마지막으로 LWP는 위 두가지의 Thread를 이어주기 위한 역할을 수행하는 Thread로서 Solaris에서 사용한다.
Process와 Thread 이미지
Thread Scheduling이란?
쓰레드의 종류에 따라 두가지의 방식으로 나뉜다.
user-level 쓰레드의 경우, process-contention-scope(PCS)로 알려진 방식으로 Thread Library가 관리하며, 프로세스 내에서 쓰레드간에time-slice를 할당 받기위한 스케쥴링을 관리하는 정책이다.
kernel-level쓰레드의 경우, system-contention-scope(SCS)라는 방식으로 시스템 내의 쓰레드간의 경쟁을 관리하는 방식이다.
NUMA와 UMA
Non-uniform memory access의 약자로, 메인 메모리에 접근하는 시간이 일정하지 않은 구조의 컴퓨터이다.
NUMA의 경우 아래그림처럼 대용량의 서버 컴퓨터나 슈퍼 컴퓨터처럼 여러개의 CPU와 메모리가 연결된 bus를 사용하는 구조이다.
이와 반대로 UMA는 Uniform-memory-access의 약자로 메인 메모리에 접근하는 시간이 일정한 컴퓨터 구조이다.
아래그림에서는 빨간색 상자 하나를 가지면 UMA, 해당 그림은 NUMA 구조이다.
NUMA 구조 이미지
Multiple-Processor Scheduling이란?
CPU가 여러개 있을 때의 “어느 CPU에 할당할까?”를 결정하는 스케쥴링 정책이다.
Asymmetric(비대칭) 방식과 symmetric(대칭) 방식이 있다. 비대칭 방식의 경우, 다른 CPU를 관리하는 유형의 CPU가 존재하는 방식이며, 대칭 방식은 모든 CPU가 동일한 레벨에서 작업하는 방식이다.
이러한 스케쥴링 정책을 결정할 때 고려해야 할 사항은 크게 두가지로 Processor Affinity와 Load Balancing이다.
Processor Affinity이란?
작업 A가 CPU1에서 90%진행 되었고 10%의 실행시간을 남겨둔 상황이라 가정할때, 작업 A를 CPU1에서 그대로 진행시키는 경우(5ms)와 작업 A를 CPU2로 이전시켜 작업을 마무리하는경우(invalidating + repopulating = 10ms) 어느 방안이 더 효율적인 Multiple-Processor Scheduling인가? 당연히 전자의 경우이다. 이러한 상황을 고려하는 것을 Processor Affinity 중 Time Affinity라 한다.
위 이미지의 NUMA 구조에서 CPU가 자기 자신의 메모리에 접근하는 것과 다른 CPU의 메모리에 접근하는 방식 중 어떤것이 더욱 효율적인가? 이 경우는 자기자신의 메모리에 접근하는 방식이 더 효율적이다. 반대로 위 그림에서 자기자신의 메모리 할당이 다 채워진 경우, 다른 CPU의 메모리 공간이 여유롭다면 비록 slow-access이지만 더욱 효율적인 Multiple-Processor Scheduling이 될 것이다. 이러한 물리적으로 흩어져 있는 메모리에 대한 접근 시간을 고려하는 것을 Space Affinity라 한다.
Load Balancing이란?
부하 균등이라는 뜻으로, 대상에 부여되는 작업량을 균일하게 맞춘다는 의미이다.
즉, 여러개의 CPU가 있을 경우 각각의 CPU가 균등하게 Job들을 배분받아서 Idle한 상태의 CPU가 없도록 만드는 것이다.
Push migration은 작업이 많은 CPU가 작업은 보내는 행위이며, Pull migration은 여유로운 CPU가 작업을 땡겨오는 행위이다.
Multicore Processors와 Multiple-Processor
요즘 대부분의 컴퓨터는 쿼드코어, 헥사코어 등 멀티코어 형태를 띄고 있다.
이는 하나의 CPU안에 논리적인 여러개의 CPU를 배치시키는 형태로 단일 코어 형태의 CPU보다 훨씬 빠른 속도와 비용절감의 장점을 가진다.
아래 그림처럼 Multicore Processors와 Multiple-Processor를 동시에 가지는 컴퓨터 구조도 있지만, 우리가 사용하는 대부분은 하나의 Multicore Processor로 이루어진 구조이다.
이러한 Multicore Processors도 Multiple-Processor Scheduling 정책을 반영해서 프로세스를 할당하여 CPU에서 작업을 진행한다.