리눅스 커널과 스케줄링에 대한 질문입니다.
글쓴이: kmj8430 / 작성시간: 수, 2016/04/27 - 9:32오후
리눅스 커널 스케줄링을 공부하다 문득 떠오른 궁금증 입니다.
커널을 만약 하나의 (특수한)프로세스라고 간주한다면 커널 또한 프로세서에 의해 수행될테고,
그렇다면 커널 또한 프로세서의 스케줄링의 대상이 되어야 할것 같습니다.
만약 단일 코어 시스템에서 프로세서가 일반 프로세스를 수행 중에 있다면, 그때 커널은 동작하지 않고 있는 건가요?
멀티 코어 시스템에서 커널이 다른 프로세스와 마찬가지로 동등한 지위로 스케줄링을 받는 것인지, 아니면 커널만을 위한
스케줄링 정책이 따로 존재하는 것인지 궁금합니다.
Forums:
리눅스 커널의 실제 코드를가지고 분석해본건아니라서..
리눅스 커널의 실제 코드를가지고 분석해본건아니라서.. 저는 운영체제 공통적인 부분만 설명할수있겠내요
커널은 프로세스형태로 스케줄러에 의해 선택되어서 실행되는 케이스만 있는건아닙니다.인터럽트,시스템콜에 의해서 커널이 호출될수도 있습니다.
커널은 처음 부팅할때 (응용프로그램들이 하나도없을때)
여러 부팅작업을 수행하고 스케줄러를 실행시키고 나면(최초의 응용프로그램레벨 프로세스가 생성되면) 사실상 별로 할게없습니다.
그때부터 프로세서는 응용프로그램들이 주로 사용하는 상태가됩니다.
커널이 하는일은 이런 응용프로그램들 뒷바라지 하는게 주된임무죠
이후 커널이 호출되는 케이스는 대략적으로 다음과같습니다
1. 응용프로그램이 IO작업등을 위해서 시스템콜을 했을경우, 유저모드->커널모드 전환이라고도합니다 인텔명령어 syscall이라는 놈을통해 이루어집니다.
(윈도우로치면 ReadFIle,WriteFile.DeviceIoControl등등의 Win32API함수를 호출했을때로볼수있고
리눅스로치면 Read,Write등등의 시스템콜을 호출했을때로볼수있죠)
이때 프로세서제어는 응용프로그램에서 커널로 옮겨가게됩니다(구체적으로 말하면 디바이스 드라이버,즉 IO입출력을 담당하는 커널레벨 코드로 제어가 옮겨가게 된다고 볼수있습니다)
2.IO장치의(하드디스크같은.) 하드웨어인터럽트가 발생했을경우
응용프로그램프로세스가 잘동작하다가 이전에 디바이스 드라이버에서 등록해놓은 IO작업이 끝나면
하드웨어인터럽트가 발생하게되고 이때 코드 제어가 커널로 강제로 넘어가게됩니다. 그리고 다시 해당 IO를 완료할 디바이스 드라이버에게 제어가넘어가고 디바이스 드라이버가 하드웨어장치에서 데이터를 가져가고나서 IO완료를 OS에게 보고하면 다시 제어가 응용프로그램 프로세스 측으로 돌아오게됩니다. (윈도우에서는 비동기 IO랑 DPC루틴이라는게 있어서 더복잡한 예기가 되긴합니다만..)
여기서 1번과 2번의 중요한 특징은 커널코드가 특정 프로세스의 문맥아래에서 호출된다는점입니다.(단순하게 생각하면 응용프로그램 프로세스가 실컷 실행되다가 잠깐 커널로 넘어가서 잠깐 처리하고 돌아오는 케이스라고 보면됩니다)
3.타이머인터럽트가 발생했을경우(스케줄링)
응용프로그램이 자신에게 할당된 시간을 전부사용하면(보통 이런경우는 별로없지만) 강제로 타이머 하드웨어 인터럽트가 걸려서
다음 실행될 프로세스로 강제 컨텍스트스위칭됩니다.이때 이작업을 수행하는게 커널레벨의 타이머 하드웨어 인터럽트 서비스 루틴이고
OS영역의 자료구조인 PCB라는 놈을가지고 컨텍스트를 스위칭합니다 이경우도 커널이 호출된경우라고 볼수가있습니다
4.블로킹함수를 실행했을때 (스케줄링)
sleep(0),WaitForSingleObject(~)이런코드 많이보셨을텐데요
이런식으로 블로킹함수를 실행하면 해당함수 내부에서 스케줄러를 시스템콜하고 현제 CPU를 다음 실행해야할 프로세서로 넘깁니다
(물론 Read,Write,recv,send같은 IO관련 함수들도 스케줄링을 유발합니다, 윈도우의 비동기IO함수는제외~)
5.IDLE프로세스가 실행되고있을때
윈도우에서 작업관리자 켜보시면 아시겠지만 CPU사용률이 아마 거의 대부분 0퍼센트 일겁니다
그럼 그동안 프로세서는 뭐하느냐? 하는 의문이 생기는데 윈도우 작업관리자 잘 살펴보시면 System Idle Process라는 놈의 CPU사용률이 95퍼센트가 넘는걸 볼수있습니다. 즉 응용프로그램 프로세스들이 전부 한가한(블로킹상태)일때, 즉 응용프로그램들이 전부 할일이없어서 CPU를 반납하면 코드제어가 Idle Process라는 커널레벨의 프로세스로 넘어가게됩니다. 이 프로세스의 주된 역할은 이름그대로 쉴틈없이 돌아가는 CPU를 잠시 쉬는상태(아무명령어도 실행하지않는상태)로 만들어 부하를줄여줍니다 (HLT 인텔 명령어이용, 윈도우의 경우 DPC루틴들이 여기서 호출되죠)
6.위 케이스랑 비슷하게 디바이스 드라이버등등이 커널레벨의 쓰레드를 생성해 실행시킬경우
디바이스 드라이버에서는 커널레벨에서 돌아가는 프로세스도 만들수있습니다.
윈도우의 경우 작업관리자에서 사용자이름이 SYSTEM인놈들이 바로 그런프로세스들입니다.
감사합니다. 정말 많은 도움이 되었습니다.
현재 운영체제와 리눅스를 공부하고 있습니다. 그동안 뭔가 정리되지 않은 상태였는데
위 글로 커널의 위치와 역할에 대하여 어느 정도 정리가 되었습니다. 감사합니다.
댓글 달기