TECHNICAL FOCUS



SMP를 지원하는 Windows Embedded Compact 7 커널

오래 전부터 예고 되었던 "임베디드 시스템"이 바꾸는 세상은 이미 다양한 기기들의 개발로 우리 생활에 있어 일상 품목으로 자리 잡은 지 오래다. 대표적인 "임베디드 시스템"인 "스마트폰" 과 "타블렛"에 대한 기사들이 연일 쏟아지고 있으며 우리의 일상 곳곳에 이런 기기들을 심기 위한 노력이 가속화 되어 또 다른 전망과 시대를 예고하고 있다. 우리 미래의 일상을 변화시킬 "임베디드 시스템"의 끊임 없는 노력은 현재/미래 진행 중에 있다.
"임베디드 시스템"의 발전을 주도했던 운영체제(이하 'OS'라 함) 중 하나인 "Windows Embedded CE"가 "Windows Embedded Compact 7"이라는 새로운 이름으로 드디어 출시 되었다. 기존의 기능들을 한층 더 강화하고, 새로운 기능들로 무장하였다. 무엇보다도 최신 CPU와 Multi-Core기술을 지원하여 성능이 대폭 향상 되었으며 다양한 UI 환경을 쉽게 개발할 수 있게 되었다. 본 기고에서는 "Windows Embedded Compact 7"에 추가된 주요 기능과 CE 6.0에서 달라진 기능들에 대해서 알아 보고자 한다.


글 유정현 대리




Microsoft MVP이면서 Microsoft 총판 MDS테크놀로지에서 Windows Embedded 기술지원을 맡고 있다. Windows Embedded 세미나 및 개발자 커뮤니티 'WECOM'을 통해 새롭고 다양한 Embedded 기술을 개발자들과 함께 공유하고 있다.
 


이번 호에서는 Windows Embedded Compact 7 커널의 가장 큰 특징인 SMP 지원과 업데이트된 메모리 매니저 부분에 대해 자세히 알아보고, 실제 BSP에서 구현된 부분의 예를 살펴보도록 하겠다.

SMP (symmetric multiprocessing) 지원
이번에 새로 출시된 Windows Embedded Compact 7 커널의 기능 중 가장 눈의 띄는 부분은 SMP 지원이다. Compact 7 에서 SMP 기능이 어떻게 구현되어 있고 어떻게 사용하는지에 대한 방법을 보기에 앞서 멀티 코어 프로세서, 멀티 프로세싱에 대해 간략히 알아보도록 하겠다.

멀티 코어 프로세서
프로세서란 데이터를 읽고 실행하는 컴퓨터 유닛이다. 프로세서는 보통 하나의 코어를 가진다. 멀티 코어의 프로세서는 두 개 혹은 그 이상의 코어 숫자를 가지는 하나의 시스템을 말한다.
멀티 코어 기술은 오늘날 광범위하게 쓰여진다. 임베디드는 물론이고, 네트워크, 그래픽 기술 등에도 많이 사용된다.

1. 왜 멀티 코어 프로세서인가?
멀티 코어 기술이 많이 쓰이게 된 이유는 첫째 CPU와 메모리 클럭의 차이이다. 프로세서의 클럭이 높아 질수록 메인 메모리와의 차이가 더 커진다. 메모리와의 반응 시간을 맞추기 위해 캐쉬 사이즈를 늘려야 하고, 메모리의 대역폭을 늘려야 하는 등의 디자인 이슈가 생기게 되었다. 둘째로는 전력 소모의 문제가 있다. CPU의 성능을 높이기 위해 CPU 의 클럭을 높이게 되면 발열과, 전력 소모에 대한 문제가 생기기 때문이다.

2. 멀티 코어 프로세서 사용의 장점
점유율이 높은 어플리케이션 두 개 동시 동작 시 확실한 이점을 얻을 수 있다. 예를 들어 바이러스 스캔이나, 고화질의 영상 컨텐츠 재생의 두 개의 작업이 있다고 가정했을 때 하나의 CPU에서 동시에 두 개의 어플리케이션을 실행할 경우 성능의 한계가 발생할 수 있다. 이 때 이런 작업들을 OS 가 두 개의 코어에 적절히 분배해 준다면 점유율 높은 두 개의 작업도 두 개의 코어에서 적절히 동작 될 수 있을 것이다.
듀얼 코어의 이점은 하드웨어적인 데에도 있다. 두 개의 코어를 하나의 시스템에서 구현함으로써 PCB 사이즈를 줄일 수 있고, 두 개의 코어가 하나의 회로에 있음으로써 캐시 일관성(Cache coherency)이 좀더 빠른 클럭으로 이루어 질 수 있는 이점도 있다.
멀티 코어 프로세서 성능의 하드웨어적 장점을 잘 활용하려면 OS의 구동 및 어플리케이션 알고리즘이 상당히 중요하다. 특히 여러 가지 작업을 각각의 코어로 분담하여 병렬 구조로 처리하는 OS 역할이 중요해 졌다. 각각의 코어는 메인 메모리 보다 속도가 빠른 코어 내부의 캐쉬를 사용함으로써 성능을 더 향상 시킬 수 있다. 하지만 기존의 어플리케이션은 병렬 구조의 처리의 알고리즘이 구현이 되어 있지 않다. Windows Embedded Compact 7 에서 멀티 코어의 기능을 사용하려면 새로 추가된 API를 사용하여 병렬 구조의 작업이 진행 될 수 있도록 다시 작성되어야 하겠다.

3. 멀티 코어 프로세스 트렌드
위에서 알아본 여러 가지 멀티 코어 프로세스의 이점으로 현재 실리콘 벤더의 추세는 멀티 코어 프로세스로 이동하고 있다. 특히 네트워크 디바이스나 고화질 영상화 처리 디바이스처럼 특정 스레드가 CPU 의 점유율이 많이 차지하는 디바이스에서는 멀티 코어 프로세스가 이미 대세가 되었다. Intel, AMD, Broadcom 등은 물론이고, ARM 계열에서도 Texas Instruments, Freescale, Nvidia 등이 이미 멀티 코어 프로세스를 개발 중이거나 개발을 완료했다. 

멀티 프로세싱
멀티프로세싱이란 두 개 혹은 그 이상의 CPU를 하나의 시스템에서 사용하는 방법을 말한다. 멀티프로세싱을 지원하는 OS란 멀티프로세싱을 지원 하는 커널 뿐만 아니라 멀티프로그래밍 모델을 위한 API 두 가지 모두를 지원해야 한다.
멀티프로세싱 시스템에서 CPU들은 BUS 레벨로 각각 연결되어 있고 메인 메모리를 공유하는 시스템(SMP)도 있고 각각의 독립적인 메모리를 갖는 시스템(NUMA)도 있다.
다양한 개념의 멀티프로세싱 시스템이 있는데 이번 출시된 Windows Embedded Compact 7은 메인 메모리를 공유하는 멀티프로세싱 시스템인 SMP를 지원한다.

Windows Embedded Compact 7에서 SMP 지원을 위해 추가된 변수
SMP 기능을 Windows Embedded Compact 7에 적용 하기 위해서는 OAL에 수정이 필요하다. 다음은 Windows Embedded Compact 7에서 제공되는 CEPC의 소스 코드를 참고하여 살펴보도록 하겠다.
SMP 기능을 활성화 하기 위해 Windows Embedded Compact 7은 OEMGLOBAL, NKGLOBAL 구조체에 새로운 함수와 변수들을 제공해 주고 개발자는 함수와 변수들을 선언해 줌으로써 Windows Embedded Compact 7에서 SMP 기능을 사용할 수 있다. OEMGLOBAL에서 추가된 변수들은 멀티 프로세서의 인터럽트처리를 위한 IPIs를 정의하고 처리하는 데에 관여하는 부분이 대부분이다.
Interprocessor Interrupts (IPIs)란 멀티프로세서 환경에서 하나의 프로세서가 다른 하나의 프로세서로 보내지는 인터럽트이며 주로 Cache coherency 동기화 시점에서 실행 된다.
다음은 OEMGLOBAL 에 SMP 를 지원하기 위해 추가된 변수들이다.


 
Windows Embedded Compact 7 의 커널에서 SMP 지원하기 위해서는 스핀록(Spin-locks)관련 함수를 지원한다. 스핀록이란 서로 다른 프로세서에서 실행 되는 스레드와 인터럽트 핸들러를 동기화하는 방법으로 경량의 고속 멀티프로세서 환경에서 경량의 뮤텍스, 세마포어로 생각할 수 있다. 기존의 단일 프로세서의 환경에서는 ISR의 리소스는 인터럽트의 Off 로 보호될 수 있다. 하지만 멀티 프로세서의 환경에서는 다른 프로세서가 동시의 같은 함수를 호출 할 수 있기 때문에 이 방법은 사용될 수 없다. 멀티프로세서 환경에서는 이러한 점을 보완하기 위해 스핀락을 사용하여 ISR 내의 리소스를 동기화 시킨다.



Windows Embedded Compact 7 에서 SMP 적용 하기
1. SMP 사용 여부 선언하기
OEM은 멀티프로세스를 사용할 수 있는 환경을 구성하고 있더라도 SMP기능을 선택적으로 사용할 수 있다. Config. bib에서 fMpEnable변수를 선언함으로써 커널의 SMP 사용여부를 결정할 수 있다.






2. OAL에 SMP 지원을 위한 OEMGLOBAL 함수 구현하기
위에서 살펴 보았던 OEMGLOBAL구조체에 새롭게 추가된 변수에 맵핑 되는 함수들을 각각 구현해 줘야 한다. 다음의 소스는 실제 Compact 7의 CEPC 에서 적용되어 있는 코드의 예이다. 


 
OEM들은 각각 위에서 선언된 함수의 Body 부분을 플랫폼 환경에 맞게 구현, 수정해야한다. 위의 작업이 완료가 되었다면, OS 상에서 SMP 지원을 위한 설정을 마쳤다. 다음은 SMP가 활성화된 OS 위에 어플리케이션을 작성하는 방법에 대해 알아보도록 하겠다.

Windows Embedded Compact 7에서 SMP 용 어플리케이션 작성하기
OS에서 SMP설정을 마쳤다면 어플리케이션에서 현재 플랫폼에서 활성화된 CPU 의 갯수를 알아볼 수 있다.

RETAILMSG (1,(TEXT("Processors=%drn"), CeGetTotalProcessors()));

다음으로 SMP가 플랫폼에 활성화 되었다면 어플리케이션에서 보다 많은 시나리오의 알고리즘을 구현하여 플랫폼의 SMP 기능을 활용할 수 있다.


1. 프로세서, 쓰레드의 CPU Affinity 동적으로 변경 시나리오
SMP 가 활성화된 플랫폼에서 어플리케이션의 특정 스레드, 프로세스를 어플리케이션이 실행 중에 개발자가 동적으로 CPU의 Affinity를 바꿀 수 있다. 만일 Affinity 를 개발자가 설정하지 않았다면, Windows Embedded Compact 7 커널이 임의적으로 Affinity 를 할당할 것이다. 각각 CPU의 점유율을 계산하여 임의적으로 점유율이 낮은 CPU에 특정 스레드, 프로세스를 할당하려는 시나리오에 적용할 수 있다.


아래의 그래프는 CPU의 점유율을 표시하는 그래프이다. 프로세서가 진행 중에 CPU Affinity 를 동적으로 설정 했을 때 CPU의 점유율이 달라 지는 것을 볼 수 있다.




2. 특정 CPU의 On/Off 시나리오
SMP 가 활성화된 플랫폼에서 특정 CPU를 개발자가 동적으로 On/Off 를 할 수 있다. 특정 단일 프로세스만 긴 시간 실행 될 때, 굳이 멀티 프로세싱의 환경이 필요하지 않을 때 이런 시나리오를 적용할 수 있다.
예를 들면 장시간 음악을 재생하거나, 장시간 대기 상태의 상태가 필요할 시 Master CPU를 제외한 CPU의 전원을 Off 함으로써 전력을 절약할 수 있다. 아래는 CPU의 전원과 관련된 API를 이용하여 드라이버에서 특정 CPU의 전원을 제어하는 구문이다.



Windows Embedded Compact 7 의 향상된 메모리 매니저
기존의 Windows Embedded CE 6.0에서는 커널에 등록할 수 있는 메모리의 최대치가 512MB였다. 그러나 이번 Windows Embedded Compact 7에서는 3GB까지 물리적 메모리를 커널에 등록하여 사용할 수 있다. 512MB 이상의 물리적 메모리를 사용하려면 OAL의 수정을 통해서 커널에 등록할 수 있다. 다음은 CEPC 에서 사용된 예를 이용하여 512MB 이상의 메모리 등록 방법에 대해 살펴보도록 하겠다.
512MB 이하의 메모리를 사용할 경우에는 기존의 방법 대로 OEMAddressTable 을 이용하여 메모리를 Cached 영역으로 등록하여 사용할 수 있다. 그리고 512MB 이상의 메모리를 추가적으로 등록하기 위해서는 이번에 Compact 7 에서 새로 추가된 두 개의 메모리 테이블을 이용하여 등록할 수 있다.

1. OEMRamTable
OEMAddressTable에 등록된 512MB 제외한 메모리는 OEMRamTable에 등록 되어져야 한다. 512MB이하의 RAM을 사용할 경우에는 OEMRamTable 을 사용하지 않아도 된다. 만약 연속적이지 않은 여러 개의 물리적 메모리가 존재 하더라도 Entry를 여러 개로 정의하여 등록을 할 수 있다. 단 이럴 경우에는 각각 메모리의 영역은 겹치지 않아야 한다. OEMRamTable에 등록된 메모리는 OEM AddressTable에 등록된 메모리와 마찬가지로 Virtual Alloc을 이용하여 페이지를 사용할 수 있다.
OEMRamTable을 사용할 때는 기존에 메모리 확장을 위해 쓰였던 OEMEnumExtensionDRAM와 OEMGet ExtensionDRAM는 사용할 수 없다.
OAL에 OEMRamTable 을 이용하여 메모리를 등록하는 절차는 다음과 같다.
 


메모리 등록 절차는 Windows Embedded Compact 7 의 BSP 중 CEPC 에 기본적으로 구현되어 있다.
C:WINCE700platformcommonsrcx86commonmemory 경로에서 메모리를 등록하는 절차를 확인 할 수 있다.  

 


위와 같은 절차로 등록된 메모리는 런타임상에서도 아래와 같이 확인 가능하다.


여기까지 Windows Embedded Compact 7 커널의 가장 큰 특징인 멀티 프로세싱을 지원하는 SMP 기능과 향상된 메모리 매니저에 대해 알아 보았다. 이런 특징들 외에 Compact 7의 커널은 ARMv7 컴파일러와 VFP, NEON 등의 향상된 기능을 지원한다. 기존 CE 6.0 에서 지원하지 못했던 부분을 Compact 7에서 대폭 지원 함으로써 개발자들은 성능 및 안정성에 있어 한층 업그레이드 된 커널을 사용할 수 있다. 

  
 MDS테크놀로지 chris@mdstec.com / MDS테크놀로지 홈페이지 : www.mdstec.com 
 윈도우 임베디드 솔루션 : www.embedsolution.com / 윈도우 임베디드 개발자 커뮤니티 : www.iwecom.co.kr

 
회원가입 후 이용바랍니다.
개의 댓글
0 / 400
댓글 정렬
BEST댓글
BEST 댓글 답글과 추천수를 합산하여 자동으로 노출됩니다.
댓글삭제
삭제한 댓글은 다시 복구할 수 없습니다.
그래도 삭제하시겠습니까?
댓글수정
댓글 수정은 작성 후 1분내에만 가능합니다.
/ 400
내 댓글 모음
저작권자 © 테크월드뉴스 무단전재 및 재배포 금지