정보공간_1

[linux kernel] power management 와 hibernation 이란 본문

IT 놀이터/IT Storehouse

[linux kernel] power management 와 hibernation 이란

알 수 없는 사용자 2011. 8. 19. 07:04


안녕하세요

강남 멤버쉽 최정호입니다

이번에는 리눅스 커널 중에서 Power Management와 관련된 부분에 대해서 말하고자 합니다

사실 Power Management와 같은 부분은 시중에 나와 있는 리눅스 커널 책에서도 그렇게 심도 있게 다루고 있는 부분이 아닙니다

일반 데스크탑이나 노트북에서 전원관리라는 측면이 별로 의미가 없기 때문이죠

하지만, 스마트폰이 출시가 되고 해당 OS에 안드로이드가 올라가면서 리눅스 커널의 Power Management 부분도 큰 관심을 갖게 됩니다

그렇다면, 리눅스 커널에서 제공하는 Power Management의 가장 큰 목적은 무엇일까요 ??

가장 큰 목적은 유휴전력의 관리 입니다. 다시 말해서 사용자가 디바이스 (컴퓨터, 노트북, 스마트 폰...)를 사용하지 않는 동안에

적절히 수면상태에 빠져야 되고 또한 수면상태에서 빠르게 깨어나서 사용자가 사용할 수 있게 해주는 거라 보시면 되겠습니다


그렇기 전에 먼저 ...

ACPI 라는 표준에 대해서 한번 알아보고자 합니다.

ACPI 표준은 Operating system에 의해 프로세스는 물론 컴퓨터에 접촉한 각종의 주변 회로, 기기류들의 전원상태를 세밀하게 조정하는 표준입니다.

또한 이 표준에 의하면 사용하지 않는 전원에 대해서 기기에 공급되는 전원을 끌 수 가 있어서 많은 스마트 폰에 이 표준을 적용하고 있습니다.

이렇듯 Power의 관리는 스마트폰이 대중화 되는 시점 부터 부각되어 왔고 스마트폰의 휴대성을 더 높이기 위해서

사이즈의 소형화와 함께 전원의 용량과 그 전원을 어떻게 효율적으로 다룰지에 대한 고민이 함께 이뤄져야 된다고 생각합니다.


그럼 먼저 global power state에 대해 먼저 정의를 해보겠습니다

1. working
2. sleeping
3. soft off
4. mechanical off

이 네가지 상태로 전체적인 power state를 정의 할 수 있겠는데 이 글을 보시는 모든 분들도 working 상태와 mechanical off 상태의

정의는 쉽게 하실 수 있을 겁니다

그럼 sleeping 상태와 soft off 상태에 대한 정의를 좀 명확히 해보도록 하겠습니다.

리눅스 개발 문서에는

sleeping : Work can be resume without rebooting the OS
           because large elements of system context are saved by the H/W and rest by the system S/W

soft off : The system  must be restarted to return to the working state

이렇게 정의를 하고 있는데 ...

아시는 분들은 아시겠지만 두 상태의 가장 큰 차이는 reboot을 하냐 하지 않느냐의 차이라고 보시면 되겠습니다. 이해 되시나요

그렇다면 제가 지금 부터 본격적으로 말하고자 하는 것은 sleeping 중에서도 Hibernation과 관련된 이야기를 해보고 싶습니다.

Hibernation에 대해서 정의하면 메모리 상태를 디스크 Swap 영역에 저장을 해서 컴퓨터 Reboot시 그 이미지를 불러 들여서 빠른 시간에 부팅을 완료하는 기술을 말합니다.

여기서 그 부팅을 커널영역에서 하게 되면 Swsusp 라 하고 부트로더 영역에서 하게 되면 Snapshot 부팅이라 불리게 되는 것 입니다.

이 두과정을 합쳐서 보통 hibernation 이라 부르게 됩니다.

hibernation과 관련된 내용은 시중에 판매되고 있는 리눅스 커널관련 서적에서도 많이 다루지 않아서 이 부분을 스터디 하고자 하시는 분의 좋은 길잡이가 되었음 합니다.

먼저 관련된 소스코드는 kernel/power/ 폴더 하단에 있는 전체 소스를 보시면 됩니다

물론 해당 커널에 hibernation을 올리기 위해서는 커널 컴파일 하기전에 해당 커널 버젼에 맞게 새롭게 세팅을 해주셔야 하니 그점 유의해 주시구요

그럼 지금부터 hibernation의 전체적인 과정이 어떻게 흘러가는지 알아보도록 하겠습니다.

먼저 첫단계는 모든 프로세스의 상태를 freeze 상태로 바꿉니다.

모든 프로세스를 가장 안정적인 상태로 전환을 해서 보다 안정적인 이미지를 생성하기 위함입니다.

예를 들어 CD-Rom이 무지막지 하게 돌고 있는 상태의 프로세스를 저장하게 되면 컴퓨터는 부팅하자마자 CD-ROM을 가동할겁니다.

그렇게 되면 빠른 부팅은 성공할 지 몰라도, 전원은 평소보다 더 많이 소비하게 되겠죠...

그래서 가장 안정적인 상태를 만들게 됩니다.

그리고 다음은 메모리 영역을 점검하게 됩니다. 메모리영역을 검사는 목적은 두가지입니다

먼저 이미지를 저장할 공간이 swap 영역에 남아있는지 확인하게 됩니다. 당연하겠지요. 기껏해서 이미지를 만들었는데 ...

swap 영역에 저장할 공간이 충분치 않다면 ... 낭패일 테니까요

다음은 이미지를 만드는데 필요한 메모리 공간이 충분한지 확인합니다.

메모리의 디스크 이미지를 만드는 작업은 연산량은 작지만, 많은 리소스를 잡아 먹게 됩니다. 지금 사용하는 메모리 공간을

그대로 이미지로 만드는 작업이니까 굳이 말씀을 않들여도 ... 당연한 일이겠지요

이렇게 확인 절차가 끝났으면, 이미지를 생성하게 됩니다.

이미지를 생성한 다음에는 freeze로 되어있던 프로세스를 활성화 시키고

사용자가 장비를 다시 사용할 수 있는 상태로 만들어 줍니다.

다시말해 이작업은 장비가 사용되지 않는 시간에 이뤄지는 작업입니다.

만약에 이작업이 다 수행하기 전에 사용자가 다시 장비를 사용하고자 한다면 이 작업은 즉시 중단하게 됩니다.

사용자가 사용하지 않는 시간을 이용해서 이미지를 만들어 저장하게 한다. 굉장히 효율적인 시스템입니다 ㅋㅋㅋ

이런과정이 끝나고 컴퓨터 전원을 내린다음에 다시 전원을 키게 되면

초기화 루틴과정에서 이미지를 불러오는 과정으로 점프하게 됩니다.

이 점프되는 시점은 2가지가 있다고 앞에서 설명 드렸으니 패스 하도록 하겠습니다.

그런 다음 다시 이 이미지를 로드하게 되면 ... 이미지를 뜨기 전의 상태로 컴퓨터가 시작되겠습니다.

이 과정은 부팅시간을 줄여줌과 동시에 사용자에게 작업의 연속성을 줄 수 있어 상당히 효율적인 기술이라 생각됩니다.

hibernation 과 관련된 코드 리뷰는 다음에 기회에 하도록 하겠습니다.

관련된 소스코드는 kernel/power/swsusp.c , hibernation.c , snapshor.c , main.c 와 이에 상응하는 헤더 파일로 구성되어 있습니다