GUEST ARTICLE
Application 처리속도 개선을 위한 Embedded Linux 경량화 기법 上
본 논문에서는 기존의 임베디드 리눅스를 경량화 하는 방법을 개선하고 통합하여 임베디드 시스템에서 동작하는 어플리케이션의 처리 속도 개선에 어떤 효과가 있는지를 검증하고자 한다.
이를 위해 Hibernation 기법을 응용한 부팅시간 단축, Symbolic Link 기법과 가상주소매핑 기법을 적용한 JFFS2 파일시스템 최적화, 범용성을 보장하는 커널 경량화 방법을 적용하였으며 실험을 통해 본 논문에서 제안하는 경량화 기법이 임베디드 시스템의 성능 향상에 어떤 효과가 있는지를 확인하였다.
제1저자 이태우 dickgap@gmail.com
충북대학교 컴퓨터공학과 강의전담교수(컴퓨터공학 박사)
본 논문에서는 임베디드 시스템에서 실행하는 어플리케이션의 처리 효율을 개선하기 위하여 임베디드 리눅스 경량화 기법을 제안한다. 임베디드 리눅스 경량화를 위하여 Hibernation 기법을 응용한 부팅 시간 단축, Symbolic Link 기법과 가상주소매핑 기법을 적용한 JFFS2 파일시스템 최적화, 범용성을 보장하는 커널 경량화 등 세 가지 방법을 적용하였다. 이후, 의존성 검사 및 커널 이미지를 타깃 임베디드 키트에 맞게 생성하여 전송한 후 기존 임베디드 리눅스를 사용한 시스템과 본 논문에서 제안하는 경량화 기법이 적용된 임베디드 리눅스를 사용하는 시스템의 성능을 비교해 보았다.
실험결과, 커널 사이즈는 기존대비 9.6% 개선되었고, 부팅 완료시간은 18% 개선되었음을 확인하였다. 그리고 타깃 임베디드 키트에서 동작하는 어플리케이션의 처리 속도 또한 최적의 경우 11%, 최악의 경우 66%의 처리 속도가 개선되었음을 확인할 수 있었다. 이 결과는 본 논문에서 제안하는 경량화 기법을 통해 부팅 속도의 향상 및 기존 커널 대비 많은 리소스 확보가 가능하다는 것을 보여주며, 이렇게 확보된 시스템 자원이 임베디드 시스템에서 동작하는 어플리케이션 처리속도 개선에도 좋은 영향을 준다는 것을 의미한다.
서론
임베디드 시스템이란 미리 정해진 특정 기능을 수행하기 위해 컴퓨터의 하드웨어와 소프트웨어가 조합된 전자 제어 시스템을 말하며, 필요에 따라 기계의 일부가 포함될 수 있다. 즉, 단순히 회로로만 구성된 것이 아니라 마이크로프로세서가 내장되어 있고 그 마이크로프로세서를 구동하여 특정한 기능을 수행하도록 프로그램이 내장되어 있는 시스템을 가리키는 것이다. 이러한 임베디드 시스템은 최근 IT기술의 발달로 마이크로프로세서가 저가, 소형화, 고성능화 되어가는 것과 맞물려 지속적으로 성장하고 있다[1].
임베디드 시스템이라는 것은 통상적으로 일반적인 시스템과는 달리 특정한 작업만을 수행하도록 설계되어지며, 초기의 임베디드 시스템은 비교적 단순해서 특별한 운영체제가 필요 없이 순차적인 프로그램을 작성해서 실행하도록 설계되었다. 하지만 최근 임베디드 시스템 자체가 상당히 커지게 되었고 네트워크나 멀티미디어가 시스템에 기본적으로 자리 잡으면서 순차적인 프로그램으로 작성하기가 매우 어려워졌다. 이에 따라 임베디드 시스템에서도 운영체제의 개념이 필요하게 되었고, 현재 임베디드 시스템을 위해 가장 많이 사용되고 있는 운영체제가 임베디드 리눅스이다[1].
하지만 임베디드 리눅스는 임베디드 시스템을 위한 범용적인 운영체제로써 그 자체로 모든 응용시스템에 적용하기에는 용량, 부팅속도, 기능 등에서 몇 가지 문제점을 가지고 있다. 특히, 이미지 프로세싱이나 단순한 산술연산 및 데이터 입·출력을 처리하는 임베디드 시스템 환경에서는 부팅속도 및 루트파일시스템, 그리고 커널 경량화 등이 중요한 요소로 부각되고 있다[1-7].
따라서 본 논문에서는 기존의 임베디드 리눅스를 경량화 하는 방법을 개선하고 통합하여 임베디드 시스템에서 동작하는 어플리케이션의 처리 속도 개선에 어떤 효과가 있는지를 검증하고자 한다. 이를 위해 Hibernation 기법을 응용한 부팅시간 단축, Symbolic Link 기법과 가상주소매핑 기법을 적용한 JFFS2 파일시스템 최적화, 범용성을 보장하는 커널 경량화 방법을 적용하였으며 실험을 통해 본 논문에서 제안하는 경량화 기법이 임베디드 시스템의 성능 향상에 어떤 효과가 있는지를 확인하였다.
관련 연구
1. 임베디드 리눅스 경량화 방법
임베디드 리눅스는 임베디드 시스템을 위한 범용적인 운영체제로써 그 자체로 모든 응용시스템에 적용하기에는 몇 가지 문제점을 갖고 있다. 따라서 이러한 문제를 해결하기 위하여 시스템에서 사용하는 임베디드 리눅스를 임베디드 시스템 자체 혹은 해당 시스템에서 특정 목적으로 사용하도록 설계되어진 응용어플리케이션의 목적에 맞게 수정·보완해서 사용해야 한다. 이를 임베디드 리눅스 경량화(Light-Weight) 혹은 최적화라고 부르며 일반적인 임베디드 시스템에서 사용하는 운영체제를 경량화 하는 방법은 크게 부팅 메커니즘 개선, 루트파일시스템 경량화, 그리고 리눅스 커널 경량화 등 세 가지 방향으로 진행된다.
첫 번째 경량화 방향인 부팅 메커니즘 개선은 범용 운영체로의 부팅 시간에 영향을 주는 요소를 최적화하여 부팅 시간을 최소화하는 것이다. 부팅 시간 최소화의 일반적인 방법은 임베디드 장치의 하드웨어 구성과 어플리케이션의 목적 등을 고려하여 부팅 요소를 구성하는 모듈 중에서 불필요한 부분을 제거하는 것이다. 다른 방법으로는 정상적인 부팅 과정에서 필요한 요소만으로 분리하여 우선 적재하고 부가적인 요소에 대해서는 필요할 때 적재하도록 함으로써 부팅 시간을 단축하는 것이다.
두 번째 경량화 방향은 루트파일시스템의 효율적인 적용이다. 임베디드 리눅스는 기본적으로 여러 가지 파일시스템을 제공하고 있다. 또한 이들 각각은 특성에 맞는 장단점을 보유하고 있기 때문에 현재 임베디드 시스템에서 사용하고 있는 플래시메모리 및 SDRAM의 종류, 응용어플리케이션의 목적에 따라 각기 다른 파일시스템을 선택하여 사용한다. 이때, 페이징 시간 단축 및 I/O 처리 속도를 개선할 수 있는 방법들을 적용함으로써 효율성을 높이고 있다.
마지막으로 살펴볼 경량화 방향은 리눅스 커널을 경량화하는 것이다. 이 방법 또한 응용어플리케이션의 목적에 따라 크게 필요하지 않은 기능을 적재하지 않거나, 기능 중 선별적으로 적재함으로써 임베디드 시스템의 커널 크기를 줄이고 시스템의 효율을 높이는 것이다. 리눅스 커널 경량화는 일반적으로 커널 Configuration 최적화를 통해 수행한다. 즉, 임베디드 시스템이 구동하는데 꼭 필요한 메모리 및 프로세스 관리, 인터럽트, 시그널 관리 및 파일시스템 기능만이 포함되도록 커널 이미지를 생성하는 것이다. 이때, 커널의 각 기능 간의 의존성을 해치지 않는 범위 내에서 이루어져야 하는데 그 접점을 찾는 것은 매우 어렵다. 따라서 일반적으로 필수 기능을 제외한 나머지 부수적인 기능들 중 시스템에서 동작하는 어플리케이션의 목적이나 성격에 맞게 추가적으로 선택하여 커널 이미지를 생성한다. 위에서처럼 기능 전체를 적재하느냐, 하지 않느냐를 결정하기도 하지만 오픈된 리눅스 커널 소스를 직접적으로 변경하여 불필요한 요소를 제거하는 방법도 있다.
또한, 커널 이미지를 생성할 때 사용하는 gcc 컴파일러의 최적화 옵션을 사용해 리눅스 커널 경량화를 수행하기도 한다.
앞에서 살펴본 세 가지의 임베디드 리눅스 경량화 방법은 독립적으로 연구되기도 하지만 서로 유기적으로 연결되어 다른 방법의 결과에 영향을 미친다. 따라서 각각의 경량화 방법을 개선하고자 할 때, 다른 부분에 어떤 영향을 미치는지 면밀히 분석한 후 적용하여야 한다.
그림 1.
Hibernation 기법을 이용한 빠른 부팅 원리
2. 임베디드 리눅스 경량화에 대한 기존 연구
본 절에서는 임베디드 시스템 환경에서 리눅스 운영체제 경량화를 위한 선행 연구를 살펴보고, 각 연구들의 장단점에 대하여 살펴본다.
(1) 빠른 부팅을 위한 기존 연구
임베디드 시스템에서 빠른 부팅 및 로딩을 구현하기 위하여 XIP 기법에 관한 연구가 진행되었다[2-3]. XIP 기법은 실행 코드를 RAM으로 복사하지 않고 플래시 메모리 영역에서 바로 실행하는 기법으로 플래시 메모리를 보조 저장장치로 채택하고 있는 임베디드 시스템 환경에서 쉽게 적용될 수 있다. 그러나 플래시 메모리는 SDRAM에 비해 10배 정도 느린 접근 시간을 가지고 있어 운영체제와 같은 실행빈도가 높은 코드를 플래시 메모리에서 실행하는 것은 시스템 전체의 성능을 저하시킬 수 있는 문제점이 있다. 따라서 최근에는 XIP 기법을 통해 부팅 시간을 감소시키는 연구보다는 주기억장치의 사용량을 줄이고 파일 입·출력의 효율을 높일 수 있는 기법으로 연구되고 있다[2-3].
다음으로 임베디드 리눅스의 빠른 부팅을 위하여 활발히 연구되는 분야는 스냅샷을 이용한 Hi bernation 방식이다[4]. 그림 1과 같이 이 방식은 현재의 시스템 상태를 기록한 이미지를 스냅샷 형태로 플래시 메모리에 기록해 두었다가 부팅 시 저장된 상태를 그대로 복원함으로써 일반적인 부팅과정에서 발생하는 초기화 과정을 감소시켜 부팅 시간을 단축한다.
Hibernation 기법이 활발히 연구되는 이유는 임베디드 리눅스를 부팅할 때 부트로더가 플래시 메모리에서 RAM으로 커널 이미지를 복사해야 하는데 이때, 전체 부팅 시 소요되는 시간 중 상대적으로 많은 시간이 소요되기 때문이다. 아울러 각종 초기화 과정을 수행하면서 부트로더가 커널에 포함될 기능과 디바이스들에 대한 정보를 플래시 메모리에서 RAM으로 빈번히 이동시켜야 한다. 여기서 현재의 시스템 상태를 통합된 이미지로 저장하였다가 그대로 RAM 영역으로 복사함으로써 기존의 부트로더의 로드를 감소시킬 수 있다. 그러나 Hibernation 기법을 이용한 빠른 부팅 방식은 항상 저장된 상태로 복원되므로 시스템 사용 중 변경되거나 기록된 사항들이 모두 초기화된다는 단점을 가지고 있다. 이는 시스템 사용 중 변경되는 항목들에 대하여 유연하게 대처할 수 없다는 뜻이다.
또한 하드웨어에 매우 큰 의존성을 가지고 있어 만들어진 스냅샷 이미지를 다른 시스템에 적용하기 쉽지 않다는 단점도 가지고 있다.
(2) 효율적인 파일시스템 적용을 위한 기존 연구
앞에서 살펴본 빠른 부팅 못지않게 임베디드 리눅스 경량화를 위하여 효율적인 파일시스템 적용도 중요한 요소이다. 임베디드 시스템에서 비용 효율성은 가장 중요한 요소 중의 하나이며, 시스템 목적에 적합한 파일시스템을 적용함으로써 비용 효율성을 높일 수 있기 때문이다. 임베디드 리눅스는 기본적으로 범용적으로 설계되었기 때문에 개발자로 하여금 시스템에 가장 적합한 파일시스템을 선택할 수 있도록 다양한 형태의 파일시스템을 제공하고 있다. 따라서 효율적인 파일시스템 적용을 위한 기존 연구들은 선택한 파일시스템을 동작하면서 발생하는 오버헤드를 어떤 방법을 이용하여 감소시키는지에 초점이 맞춰져 있다[5].
이런 연구들 중 가장 활발히 연구되는 분야는 압축파일시스템을 사용하여 효율성을 높이며 제한된 저장장치를 효과적으로 사용하는 방법을 검증하는 것이다. 특히, 비효율적인 압축·해제 구조 개선을 통해 불필요한 오버헤드를 해결하고 효율적인 압축·해제 기법을 제시하는 연구가 진행되고 있다. 그 중 높은 압축률이 큰 장점인 SquashFS의 성능향상 연구는 압축해제를 위해 사용되는 비연속적인 내부버퍼를 그림 2에서와 같이 각 버퍼에 저장된 압축 블록들을 하나씩 압축 해제하여 내부버퍼에 임시 저장하였다가 압축해제가 완료되면 내부버퍼의 데이터들을 파일의 주소 공간으로 해당 페이지를 복사하여 효율을 높여주었다.
그러나 위 방법은 다음과 같은 문제점을 갖고 있다. 첫째, 압축해제 함수의 반복적인 호출로 인한 오버헤드이다. 그림 2에서 보는 바와 같이 압축 블록들이 저장된 버퍼공간이 비연속적으로 존재하기 때문에 각 버퍼 별로 압축해제를 실행하여야 하는 한계를 가지고 있다. 두 번째 문제점으로는 불필요한 복사 오버헤드의 발생이다. 압축 해제된 데이터를 내부버퍼에 임시로 저장하였다가 모두 완료된 후 파일의 주소 공간으로 복사하는데 이때, 주소 공간에 복사하는 페이지의 크기가 고정되어 있어 여러 번 플래시 메모리에서 데이터를 읽어와야 하는 불필요한 시간의 낭비가 발생한다.
(3) 리눅스 커널 경량화를 위한 기존 연구
리눅스 커널 경량화를 위한 연구 방향은 단순한 형태로 진행되었다. 임베디드 시스템의 하드웨어 구성과 응용어플리케이션의 목적에 따라 크게 필요하지 않은 기능을 적재하지 않는 방식이 그것이다. 이때 임베디드 리눅스에서 제공하는 Configuration 옵션을 이용하여 설정하는데 개발자에 의해 선별적으로 적재함으로써 임베디드 시스템의 효율을 높일 수 있다[1][6-7].
하지만 리눅스 커널 경량화를 위하여 옵션을 조정할 때, 임베디드 시스템이 구동하는데 꼭 필요한 기능들은 반드시 적재되어야 하고 개발자의 요구에 의해 불필요한 기능들을 제거하는 방식이기 때문에 이렇게 설정된 커널 경량화 옵션을 다른 임베디드 시스템에 그대로 적용할 수 없다는 한계를 가지고 있다. 즉, 표준화된 리눅스 커널 경량화 옵션을 결정하기 어렵다. 이는 시스템에서 동작하는 응용어플리케이션과 하드웨어 구성에 의해 선택적으로 결정할 수밖에 없기 때문에 쉽게 해결할 수 없는 한계이다. 이와 같은 한계를 극복하기 위하여 오픈된 리눅스 소스를 직접적으로 변경하여 불필요한 요소를 제거하는 방법이 연구되고 있지만[7] 여전히 타깃 시스템에 종속된 형태로 진행되고 있다.
그림 2.
SquashFS의 압축 해제 과정
그림 3.
제안하는 경량화 기법 전체 구성도
임베디드 리눅스 경량화 기법
본 논문에서는 임베디드 시스템에서 동작하는 어플리케이션의 처리 속도를 개선하기 위하여 임베디드 리눅스 경량화 기법을 제안한다. 본 논문에서 제안하고 있는 경량화 기법은 크게 세 가지 형태로 진행되며 이들 각각은 서로 유기적으로 연결되어 자원 효율과 처리 속도를 개선할 수 있도록 설계되었다. 그림 3은 본 논문에서 제안하고 있는 임베디드 리눅스 경량화 기법의 전체 구성도이다.
그림 3에서와 같이 효율적인 루트파일시스템, 빠른 부팅 시간을 위한 부팅 기법 및 리눅스 커널 경량화를 수행한 후, gcc 컴파일러 최적화를 이용하여 임베디드 리눅스 이미지를 생성하면 RAM으로 복사 시간, 압축해제 시간, 프로세스 초기화 시간, 자원의 효율적인 이용, 입출력 관련 오버헤드 제거 등과 같은 효과를 얻을 수 있으며 이는 곧 임베디드 시스템에서 동작하는 어플리케이션의 처리 속도를 향상시킬 수 있다.
1. 부팅 최적화 메커니즘
본 논문에서는 부팅 메커니즘을 최적화하고 이를 통해 빠른 부팅 시간을 확보하기 위하여 다음 두 가지 방법을 적용하였다. 앞서 살펴본 Hiber nation 방법이다. 앞서 설명하였듯이 Hiberna tion 기법은 스냅샷 이미지를 이용하여 부팅과정에서 발생하는 초기화 과정을 감소시켜 부팅 시간을 줄여주지만 하드웨어 의존성이 강하고 시스템 상황에 유연하게 대처할 수 없다는 단점을 가지고 있다. 따라서 본 논문에서는 Hibernation 기법이 가지고 있는 초기화 과정을 감소시키는 장점은 수용하면서 단점을 보완하기 위하여 Software Suspend 알고리즘을 적용하였다. Software Suspend 알고리즘이란 프로그램 혹은 프로세스(Task)가 Running 상태에서 Suspend 상태로 변경될 때의 메모리 상태 및 PC레지스터 등이 변경되는 원리를 이용하여 멀티쓰레딩, 멀티태스킹을 지원하는 방법으로 이를 임베디드 리눅스 커널 환경에 맞게 변경하여 적용하였다.
일반적인 Hibernation 기법은 커널 이미지 복사 및 초기화 과정을 부트로더가 담당한다면, 본 논문에서 제안하는 부팅 최적화 메커니즘에서는 최초 커널 이미지 복사는 부트 로더가 담당을 하되, 커널이 RAM에 복사되어 실행할 때 부트로더를 Suspend 시키고 이후 커널이 주체가 되어 다시 한 번 수행을 시키는 구조를 갖는다. 이 방식은 일반적인 Hibernation 기법을 이용한 부팅보다 느리지만 커널 레벨에서 초기화를 수행하기 때문에 높은 하드웨어 의존성을 낮출 수 있으며 시스템에 유연하게 대처할 수 있어 높은 이식성을 얻을 수 있다. <참고>는 Software Suspend 알고리즘을 Hibernation 기법에 적용한 의사코드이다.
의사코드에서와 같이 본 논문에서 제안하는 부팅 메커니즘에서는 시작은 부트로더가 담당을 하지만 최초 커널 이미지를 로드한 후에는 커널에서 모두 담당하도록 설계하였다. 이를 통해 범용 임베디드 리눅스가 갖고 있는 유연함과 높은 이식성을, Hibernation 기법이 갖고 있는 빠른 부팅 시간을 모두 획득할 수 있었다.
<참고> Software Suspend in Hibernation Pseudo-code
int hibernate_nvs_register
(unsigned long start, unsigned long size)
{
struct nvs_page *entry, *next;
while (size > 0) {
커널사이즈 계산 및 할당();
if (!entry)
goto Error;
페이지 사이즈에 맞게 동적 구성();
// Linked List로 구현하여 가장주소 할당이 가능하도록 설계
}
return 0;
Error:
list_for_each_entry_safe(entry, next, &nvs_list, node)
{
시스템에 가상 페이지 주소 반납();
}
return -ENOMEM;
}
sector_t alloc_swapdev_block(int swap)
{
unsigned long offset;
offset = swap 페이지 타입에 따른 오프셋 계산();
allocate a swap page(); // 페이지 할당
register allocation(); // 레지스터 변경
return 0;
}
int swsusp_swap_in_use(void)
{
// 커널 레벨에서 변경된 내용이 있을 때 이미지를 새로 저장하도록 처리
return (swsusp_extents.rb_node != NULL);
}
static int swsusp_extents_insert
(unsigned long swap_offset)
{
struct rb_node **new = &(swsusp_extents.rb_node);
struct rb_node *parent = NULL;
struct swsusp_extent *ext;
while (*new)
// 디바이스 혹은 시스템 변경에 따른 수정 사항 체크
ext = container_of(*new, struct swsusp_extent, node);
종료조건 체크();
rebalance the tree();
// swsusp 블록 처리를 위한 노드 초기화
}
2. 루트 파일시스템 경량화 기법
임베디드 리눅스는 루트 파일시스템을 통해 하드디스크나 I/O 디바이스 등에 접근하는 구조를 가지고 있다. 매우 빈번한 접근이 발생할 뿐만 아니라 Read-Only 파일시스템 특성 등을 고려하여 시스템의 성능을 향상시키기 위해 RAM에 루트 파일스세템을 구축하는 구조를 갖는다. 이 루트 파일시스템도 커널과 동일하게 압축된 상태로 플래시 메모리에 저장되어 있으며 부팅 시에 RAM으로 복사되어 압축을 해제하는 과정을 거치므로 루트 파일시스템의 압축해제 효율을 개선하여 경량화를 시킬 수 있으며, 이를 통해 부팅 속도뿐만 아니라 전반적인 임베디드 시스템의 성능을 향상시킬 수 있다.
그림 4.
수정전과 Symbolic Link 수행 후 메모리 맵 구조
본 논문에서는 JFFS2 파일시스템을 루트 파일시스템으로 결정하고 Symbolic Link 기법과 가상주소매핑 기법을 적용하여 효율을 높이고자 하였다. JFFS2 파일시스템은 임베디드 리눅스에서 기본적으로 제공하는 파일시스템으로 저널링 방식을 사용한다. 따라서 가비지 컬렉션에 시간이 많이 걸린다는 단점을 가지고 있지만, 높은 압축 효율을 가지고 있으며 작은 비용으로 파일 시스템의 향상성을 유지할 수 있다는 큰 장점을 가지고 있다.
본 절에서 제안하는 루트 파일시스템 경량화는 메모리에 적재되는 루트 파일시스템의 크기를 최소화하기 위하여 Symbolic Link를 사용하고, 분리된 메모리 구조를 갖고 있음으로 인해 발생하는 빈번한 I/O 시 효율을 높이기 위하여 vmap()과 vunmap()을 이용한 가상주소매핑 방법을 적용하였다. 첫 번째 Symbolic Link를 사용함으로 인해 메모리 자원을 효율적으로 사용할 수 있지만, 반복적인 I/O 발생과 압축해제 함수의 호출이라는 오버헤드가 발생한다.
여기서 이러한 오버헤드를 감소시키기 위하여 가상주소매핑 방식을 도입한 것이다. 다음 그림 4는 JFFS2 파일시스템을 기본으로 RC 스크립터 단계에서 Symbolic Link를 구성하여 루트 파일시스템을 최소화한 메모리 맵 구조를 도식화한 것이다. Symbolic Link를 이용하여 루트 파일시스템을 확장루트파일시스템과 기본루트파일시스템으로 분리하여 설정한 후 부팅 시 기본루트파일시스템만 적재하여 수정전과 비교하였을 때 메모리 사용량이 작아졌음을 확인할 수 있었다.
그림 5.
vmap/vunmap을 이용한 가상주소매핑 흐름도
다음으로 Symbolic Link를 이용하여 파일시스템을 분리 적재함으로 발생하는 오버헤드를 제거하기 위한 가상주소매핑 기법을 적용하였다. 가상주소매핑 기법은 임베디드 리눅스 커널에서 제공되는 API인 vmap()과 vunmap()을 사용하여 구현할 수 있다. 필요한 가상주소 공간을 할당받고, 할당받은 가상주소 공간에 페이지들을 매핑 하는 방법으로 간단히 구현된다. 필요한 작업이 끝나면 할당받은 가상주소 공간에 매핑 된 페이지들을 매핑 해제시키고 할당받은 가상주소 공간을 반환해야 한다.
이 과정은 페이지들을 매핑 시키는 과정이 RAM 영역에서 동작하기 때문에 순서가 틀리면 압축해제를 실행할 때마다 메모리 누수가 발행하므로 매우 중요하다.
그림 5는 vmap/vunmap을 사용하여 가상주소매핑 기법을 이벤트 흐름에 따라 보여주고 있다. 기존의 JFFS2 방식은 읽기 작업을 수행할 때마다 반복적으로 새로운 가상주소를 할당받아야 하는 문제를 가지고 있었다. 이와 같은 오버헤드를 감소하기 위하여 본 논문에서는 메모리상에 비연속적인 공간에 흩어져 있는 압축 블록들을 연속된 가상공산으로 연결시켜 한꺼번에 접근할 수 있도록 개선하였으며 이를 통해 한 번의 압축해제 함수 호출로 압축을 해제할 수 있으며, 내부버퍼를 사용하는 대신 주소공간의 페이지들을 연속된 공간처럼 사용할 수 있어 내부버퍼에서 데이터를 복사하는 오버헤드를 제거하였다.
그림 6.
최적화된 가상주소 매핑 방식
또한 기존 파일시스템에서 읽기 작업을 수행할 때마다 반복적으로 새로운 주소를 할당받아야 하는 오버헤드도 필요한 공간을 플래시 메모리와 RAM 영역에서 가상주소 할당과 페이지 매핑을 따로 구분하고 동작시켜 해결하였다.
그림 6에서 보는바와 같이 가상주소 공간을 할당/반환하는 작업은 마운트와 언마운트 시점에서만 수행하므로 연속적인 공간에 페이지와 가상주소를 매핑 시킬 수 있으며 빈번히 발생하는 가상주소 매핑으로 인한 오버헤드를 제거하였다.
참고문헌
[1] Huins, "System On Chip and Embedded System Design using ARM9 Core," HongRung Press, 2004.
[2] B. Roman, "Tips and Tricks for Implementing Software Execute-In-Place with Windows CE.NET, Datalight, 2003.
[3] In Hwan Doh, "Implementation of the Hibernation-based Boot Mechanism on an Embedded Linux System," Journal of the Korea society of computer and information, Vol. 16, No. 5, pp23-31, 2011.
[4] S. Park, J. Song, C. Park, "A Fast Booting Technique using Improved Snapshot Boot in Embedded Linux," Journal of KISS, Vol. 14, No. 6, pp594-598, 2008.
[5] S. Ahn, S. Hyun, K. Koh, "Improving Read Performance of SquashFS for Multimedia Embedded System," Conf. Korea Multimedia Society, pp117-120, 2008.
[6] M. Mackall, "Linux-tiny and directions for small systems," Proc. of the Linux Symposium, Jul. 2004.
[7] LinuxTiny, http://www.selenic,com/linux-tiby/
회원가입 후 이용바랍니다.
개의 댓글
댓글 정렬
BEST댓글
BEST 댓글
답글과 추천수를 합산하여 자동으로 노출됩니다.
댓글삭제
삭제한 댓글은 다시 복구할 수 없습니다.
그래도 삭제하시겠습니까?
그래도 삭제하시겠습니까?
댓글수정
댓글 수정은 작성 후 1분내에만 가능합니다.
내 댓글 모음