일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 구글 앱 엔진
- BAM
- 고려대학교
- 패턴 인식
- 신경망
- 물걸레자동세척로봇청소기
- SSM
- NarwalFreo
- 삼성
- Friendship
- 나르왈프레오
- 패턴인식
- 멤버십
- 하이퍼바이저
- 인공지능
- Google App Engine
- Neural Network
- 가상화
- 동아리
- 파이썬
- 삼성전자 소프트웨어멤버십 SSM
- 삼성소프트웨어멤버십
- 증강현실
- hopfield network
- Bidirectional Associative Memory
- 물걸레로봇청소기추천
- 갤럭시탭S8울트라
- 신경회로망
- Python
- 빅데이터
- Today
- Total
정보공간_1
[6기 강북 전영진] 리눅스 커널 심층 분석 #2 본문
#Intro
안녕하세요. 강북멤버십 23-2기 전영진입니다.
이번엔 리눅스 프로세스 스케줄러에 대해 소개하겠습니다.
#멀티태스킹
멀티태스킹 운영체제는 하나 이상의 프로세스를 동시에 실행할 수 있는 운영체제 입니다. 멀티태스킹 운영체제에는 협동형 멀티태스킹과 선점형 멀티태스킹 두 가지 방식이 있습니다.
여타 유닉스 시스템을 포함한 최근 운영체제와 마찬가지로 리눅스도 선점형 멀티태스킹을 지원합니다.
선점형 멀티태스킹에서는 스케줄러가 프로세스 실행을 언제 중단하고 다른 프로세스를 실행할 지를 결정합니다. 이와 달리 협동형 멀티태스킹은 프로세스가 자발적으로 중지하지 않는 한 프로세스를 중지 시킬 수 없습니다. 그러므로 덩치가 큰 프로세스가 계속 독점하여 전체 시스템을 먹통시킬 수 있습니다.
이러한 이유로 대부분의 운영체제는 선점형 멀티태스킹을 지원합니다.
#리눅스의 프로세스 스케줄러
선점형 멀티태스킹에서는 스케줄러에 따라서 시스템의 전체적인 느낌이 정해지는 경우가 많으며, 프로세서 시간의 사용을 효율적으로 정할 수 있습니다. 스케줄러 정책은 프로세스 응답시간을 빠르게 하는 것과 시스템 사용률을 최대화하는 것 이 두 가지 상충되는 목적을 달성하고자 합니다.
이러한 목적을 이루기 위해 스케줄러는 복잡한 알고리즘을 사용해 우선순위가 낮은 프로세스에게 공정함을 보장하면서도 순간순간 실행가치가 가장 높은 프로세스를 선택합니다.
#프로세스 우선순위
스케줄링 알고리즘의 일반적인 형태는 우선순위 기반 스케줄링입니다. 이 방식은 가치와 필요에 따라 프로세스의 순위를 매기고 프로세서 시간을 할당하는 것입니다. 일반적으로 우선순위가 높은 프로세스를 우선수위가 낮은 프로세스 보다 먼저 실행하고, 우선순위가 같으면 Round-Robin방식으로 실행합니다.
리눅스 커널에서는 ‘나이스값’,’실시간 우선순위’이 두 가지 별개의 우선순위 단위를 가집니다. Ps -el 명령을 이용하면 시스템 프로세스 목록과 각각의 나이스 값을 확인 할 수 있습니다. (NI항목에 표시됩니다.)
:: 나이스 값
-20~+19 : 기본값은 0
나이스 값이 클수록 우선순위 낮음:값이 클수록 nice(친절)함
나이스값이 작을수록 더 많은 시스템프로세서 사용시간(timeslice)할당
:: 실시간 우선순위(POSIX.1b)
0~99
클수록 우선순위가 높음
모든 실시간 프로세스는 일반적인 프로세스보다 우선순위가 높음
실시간 우선순위와 나이스 값은 별도
#타임슬라이스
타임슬라이스는 선점되기 전까지 작업을 얼마나 더 실행할 수 있는지 나타내는 값입니다. 스케줄러에 정책에 따라 타임슬라이스 기본값을 정하게되는데, 너무 길게 잡을 경우 시스템의 대화형 성능이 떨어지고, 너무 짧게 잡을 경우에는 프로세스 간의 전환에 상당량의 프로세스 시간을 소비하게 됩니다.
이런 점을 고려하여 많은 운영체제에서 기본 타임슬라이스 값을 상당히 낮게 10밀리초 정도로 설정합니다. 하지만 리눅스에서는 프로세스에 할당되는 프로세서 시간은 시스템의 부하에 따른 함수로 결정됩니다. 예를 들면, 나이스 값이 높은 프로세스는 낮은 가중치가 적용되어 낮은 비율의 프로세서 시간을 받고, 나이스 값이 낮은 프로세스는 높은 가중치가 적용되어 높은 비율의 프로세서 시간을 받습니다.
#리눅스 CFS 스케줄러
리눅스 스케줄러는 커널 2.6부터 O(1)이라는 이름의 새로운 스케줄러가 사용되고 있으며, 최근 2.6.23버전부터는 CFS(Completely Fair Scheduler)라는 또 다른 새로운 스케줄러가 도입되었습니다.
CFS(Completely Fair Scheduler)는 SCHED_NORMAL로 정의된 리눅스 일반 프로세스용 스케줄러 클래스이며, kernel/sched_fair.c에 정의되어 있습니다.
구체적으로 CFS는 다음 네가지 구성요소로 표현할 수 있습니다.
1. 시간기록 – 모든 프로세스는 시간을 기록합니다. vruntime이라는 변수에 프로세스의 가상 실행시간이 저장되는데, 가상 실행시간은 실행 가능한 프로세스 개수에 따라 정규화한 실제 실행시간을 의미합니다.
이 기록작업은 kernel/sched_fair.c에 정의된 update_curr()함수가 처리합니다.
[ 시간 기록 처리 절차 ]
update_curr()함수는 현재 프로세스의 실행시간을 계산.
그 값을 delta_exec에 저장.
__update_curr()함수에 전달 및 가중치를 계산하여 현재 프로세스의 vruntime에 저장.
2. 프로세스 선택 – 다음 실행할 프로세스를 선택할 때 CFS는 vruntime이 가장 작은 프로세스를 선택하는데, 가장 작은 실행가능 프로세스를 효율적으로 찾고 관리하기 위해 레드블랙트리를 사용합니다.
CFS의 프로세스 선택 알고리즘은 “레드블랙트리의 가장 왼쪽 노드에 해당하는 프로세스를 실행한다.”로 요약할 수 있습니다.
이러한 과정은 kernel/sched_fair.c파일에 정의된 __pick_next_entity()함수가 이런 선택과정을 처리합니다.
그리고 enqueue_entity()함수가 프로세스를 트리에 추가, Dequeue_entity()함수는 프로세스를 트리에서 제거합니다..
3. 스케줄러 진입 위치 – 프로세스 스케줄링 작업을 시작하는 곳은 kernel/sched.c 파일에 정의되어 있는 schedule()함수 입니다. 커널의 다른 부분에서 이 함수를 통해 프로세스 스케줄러를 호출함으로써 다음에 실행할 프로세스를 선택하고 실행합니다. Pich_next_task()함수를 호출하면서 가장 높은 우선순위의 프로세스를 찾아냅니다.
4. 휴먼 및 깨어남 – 휴면중이거나 대기상태인 작업은 실행 불가능한 특별한 상태입니다. 대기열을 이용해 휴면 상태를 처리합니다. 대기열은 특정 조건이 일어나기를 기다리는 단순한 프로세스 목록을 말합니다.
#선점과 컨텍스트 전환
실행 중인 한 작업에서 다른 작업으로 전환하는 것을 뜻하는 컨텍스트 전환(context switching)은 kernel/sched.c에 정의된 context_switch()함수를 통해 처리됩니다. Schedule()함수가 새로 실행할 프로세스를 선택하면 이 함수가 호출됩니다.
context_switch()함수는 기본적으로 다음 두 가지 일을 합니다.
첫번째는 <asm/mmu_context.h>에 정의된 switch_mm() 함수를 호출해 이전 프로세스의 가상 메모리 매핑을 새 프로세스 것으로 변경합니다.
두번째는 <asm/system.h>에 정의된 switch_to() 함수를 호출해 이전 프로세스의 프로세서 상태를 현재 프로세스의 프로세서 상태로 변경합니다. 이 과정에서 프로세서 단위로 관리가 필요한 스택 정보, 프로세서 레지스터 등의 특정 하드웨어 관련 정보를 저장하고 복원하는 일도 포함됩니다.
이번 포스팅은 스케줄러의 개념만 간략하게 소개 했는데
다음 포스팅에서는 리눅스 커널:시스템 호출에 대해 살펴 보겠습니다.
(Linux kernel development. 3/E 참조)
'IT 놀이터 > Elite Member Tech & Talk' 카테고리의 다른 글
[6기 부산 정희록] Pillow #1 (0) | 2014.10.08 |
---|---|
[6기 부산 정희록] Beautiful Soup #3 (0) | 2014.10.07 |
[6기 대구 허정욱] EasyHook - Windows API Hooking (0) | 2014.10.06 |
[6기 강남 송태현] android Framework Notifiacation & NotifyService 분석 (0) | 2014.10.04 |
[6기 강남 조유석] Union-Find (0) | 2014.09.21 |