[테크월드=정환용 기자] 실시간 운영체제(RTOS, Real-Time Operating System)는 우주항공 부품, 의료장비, 산업용 제어 시스템과 같이 높은 신뢰도와 안정성을 요구하는 시스템에 사용되는 운영체제다. MDS테크놀로지는 상용 실시간 운영체제인 NEOS RTOS를 독자 기술로 개발해 국방, 항공, IoT 등 다양한 산업에 실제 적용하고 있다. 임베디드 시스템의 성능을 높이기 위한 CPU의 클럭 경쟁은 2 GHz대에서 한계를 보이고 있다. 이에 대한 대안으로 하나의 칩에 프로세싱 코어를 여러 개 탑재해 CPU의 처리 성능을 올리는 멀티코어 기술이 자리잡고 있다. 이번 글에서는 MDS테크놀로지가 개발한 대칭형 멀티코어 CPU를 지원하는 실시간 운영체제 ‘NEOS’의 주요 기능과 특징에 대해 살펴보고자 한다.

 

대칭형 멀티코어 하드웨어의 구성
먼저 멀티코어 실시간 운영체제가 제어해야하는 중요한 하드웨어 장치가 멀티코어 프로세서에 대하여 간략히 살펴본다. 대칭형 멀티프로세싱(Symmetric Multi-Processing: SMP)은 하나의 프로세서에서 여러 개의 코어를 구성해 동시에 여러 개의 프로그램을 실행 시켜 시스템의 성능을 향상시키는 것을 목적으로 한다. [그림 1]은 대칭형 멀티프로세싱을 지원하는 하드웨어의 전형적인 구조다.

대칭형 멀티프로세싱 환경은 하드웨어적인 병렬 처리를 지원하므로 기존의 단일 프로세서 환경과는 다른 방식으로 소프트웨어가 동작하는데, 그 특징은 다음과 같다.

■여러 개 프로그램이 동시에 실행
단일 코어 프로세서의 경우, 한 시점에 실행되는 프로그램은 오직 하나다. 하지만 대칭형 멀티프로세싱 구조에서는 프로세서의 코어 수만큼 동시에 프로그램이 실행될 수 있다. 

■하나의 코어가 인터럽트를 처리하는 동안 다른 프로그램이나 인터럽트 처리
단일 코어 프로세서의 경우, 실행 우선순위가 가장 높은 인터럽트가 실행 중에 있을 때, 다른 인터럽트나 스레드에 의해 실행이 멈추지 않는다. 하지만 대칭형 멀티프로세싱 환경에서는 다른 스레드나 인터럽트가 동시에 처리될 수 있다. 

■CPU의 메모리를 공유
대칭형 멀티프로세싱 환경은 프로세서가 메모리와 입출력장치를 공유해 사용한다. 따라서 공유되는 자원을 안전하게 접근하기 위해서는 적절한 동기화 기법을 사용해야 한다.

[그림 1] 대칭형 멀티 코어의 시스템 구성
[표 1] 멀티코어 제어 함수

 

 

실시간 운영체제의 대칭형 멀티코어 지원
대칭형 멀티프로세싱 환경을 지원하는 NEOS 실시간 운영체제는 기존의 단일 코어를 지원하는 NEOS 실시간 운영체제와의 호환성을 유지하면서, 멀티코어 환경을 효과적으로 지원하고 성능을 최대화하기 위해 다음과 같은 다양한 기능들이 추가됐다.  
           
■ 멀티코어 제어 
NEOS 실시간 운영체제는 운영체제가 시스템을 초기화할 때 활성화 시켜야 하는 코어를 미리 지정할 수 있다. 초기에 지정된 코어는 커널의 초기화가 완료된 후, 사용자가 생성한 스레드를 실행할 수 있다.

[표 1]은 멀티코어 환경에서 사용할 수 있는 코어 정보와 동작하고 있는 코어 목록을 얻을 수 있는 함수들이다. 동작하지 않고 있는 코어는 KernelCpuEnable() 함수를 사용해 필요한 시점에 활성화해 사용할 수 있다.

[표 2] 스레드의 CPU 친화성 설정 함수
[표 3] 원자적 메모리 연산 함수

 

■대칭형 멀티코어 환경의 스레드 스케줄링 
NEOS 실시간 운영체제의 최소 실행 단위는 스레드이다. 스레드는 자원을 공유하는 실행 단위로 NEOS 운영체제가 CPU의 실행 시간을 분배하기 위해 우선순위 기반 선점형 멀티 스레드 스케줄링 방식으로 스레드를 스케줄링한다. NEOS실시간 운영체제는 단일 코어 환경의 경우, [그림 3]과 같이 시스템 내 하나의 스레드만 한번에 실행할 수 있다. 따라서 실행 우선순위가 낮은 스레드가 생성돼도 우선순위가 높은 스레드의 수행이 종료되거나 자원을 요구할 때와 같이 CPU를 반환하지 않는다면, 낮은 실행 우선순위의 스레드는 실행되지 못한다. 

대칭형 멀티프로세싱 환경의 경우, 단일 코어의 스레드 스케줄링 동작 환경과 같은 우선순위 기반의 선점형 멀티 스레드 스케줄링 정책에 따라 우선순위가 가장 높은 스레드가 항상 먼저 실행된다. 하지만 코어 개수만큼 동시에 스레드가 실행될 수 있기 때문에 시스템 내에 우선순위가 다음으로 높은 스레드가 다른 코어에 할당돼 동시에 실행된다.

[그림 2] 멀티코어를 지원하는 실시간 운영체제의 구성

■ 스레드의 CPU 친화성(Affinity)
기본적으로 모든 스레드는 모든 코어에서 실행될 수 있다. 하지만 선택된 스레드가 특정 코어에서만 실행되도록 스레드의 수행을 제어해 코어의 로드를 분산시킬 수 있는데, 이를 스레드의 CPU 친화성 (Affinity)이라고 한다. NEOS 실시간 운영체제는 생성된 스레드에 대한 CPU 친화성을 설정하는 함수를 지원해 스레드의 CPU 친화성을 설정할 수 있도록 한다. 스레드의 CPU 친화성을 설정하는 방법은 스레드가 생성된 후, 자신 혹은 지정한 스레드의CPU 친화성을 설정하는 방법, 스레드가 동작중인 스레드의 CPU 친화성을 변경하는 방법 두 가지다. [표 2]는 NEOS 운영체제가 스레드의 CPU 친화성을 설정하기 위해 지원하는 함수다.

■원자적 메모리 연산
원자적 메모리 연산은 멀티코어 프로세서의 기능을 활용해 메모리 연산을 수행할 때, 다른 코어가 동일한 메모리 영역에 연산을 수행하지 못하도록 방지하는 것을 말한다. 따라서 원자적 연산을 통해 공유 변수의 값을 읽거나 변경할 때 코어 간 상호 배제를 구현할 수 있다. 또한, 원자적 메모리 연산은 메모리 값에 대한 더하기, 빼기, 혹은 비트 연산을 수행할 경우, 다른 동기화 방법을 사용하지 않고 상호 배제를 구현할 수 있다. [표 3]은 원자적 메모리 연산을 위해 지원되는 함수다.

[그림 3] 단일 코어 프로세서의 스레드 수행 순서
[그림 4] 대칭형 멀티코어 환경의 스레드 수행 순서

 

■메모리 배리어(Memory Barrier)
메모리 배리어는 멀티코어 프로세서 명령어로 코어의 메모리 연산이 순차적으로 완료되는 것을 제어하기 위해 사용한다. 멀티코어 프로세서에서 코어들은 명령어를 효과적으로 처리하기 위해 명령어의 실행 순서를 프로그램에 나열된 순서로 실행하지 않고 변경해 실행한다. 이 경우 의도하지 않는 동작을 수행하거나 프로그램이 오동작할 수 있는데, 멀티코어 프로세서들은 메모리 배리어를 위한 명령어를 제공한다. NEOS 실시간 운영체제에서는 프로세서 독립적으로 구현하기 위한 다음과 같은 메모리 배리어 매크로를 제공한다.

[표 4] 메모리 배리어 매크로

■스레드 간 상호 배제
NEOS 실시간 운영체제는 스레드 간 상호 배제를 구현하기 위해 세마포어, 뮤텍스, 스레드 선점 금지, 프로세서 인터럽트 금지와 같은 방법을 제공한다. 대칭형 멀티프로세싱 환경에서는 하드웨어 병렬 처리 방식으로 스레드가 수행된다. 이 때문에 단일 코어 환경에서 사용되던 프로세서 인터럽트 금지나 스레드 선점을 금지 하는 방식으로 스레드 간 공유 데이터에 대한 접근 제어를 수행하는 것은 더이상 유효하지 않다. 스레드의 선점 금지나, 프로세서 인터럽트의 금지는 해당 코어에서만 동작하며 다른 코어의 스레드 선점이나 인터럽트에는 영향을 주지 않는다. 

따라서 대칭형 멀티 프로세싱 환경에서는 세마포어나 뮤택스를 사용해 스레드 간 상호 배제를 수행해야 한다. 하지만 멀티코어 환경에서 짧은 구간의 상호 배제를 위해 세마포어나 뮤택스를 사용하는 것은 시스템에 많은 부하를 줄 수 있다. 이와 관련하여 NEOS 운영체제는 멀티코어 환경에서 효율적인 상호 배제를 위해 스핀락(Spinlocks)를 제공한다.

 


■스핀락(Spinlock)
스핀락은 대칭형 멀티프로세싱 환경에서 코어 간의 짧은 동기화 혹은 상호 배제를 구현하는 데 사용한다. 스핀락은 그 이름이 나타내듯이 상호 배제를 구현할 때 세마포어와 같이 요청한 스레드가 대기 상태에서 세마포어 획득을 기다리는 방식으로 동작하지 않고, 스핀락을 획득한 스레드나 인터럽트 헨들러가 스핀락을 반환할 때까지 계속 획득 가능 여부를 확인한다. 따라서 스레드나 인터럽트 핸들러를 실행하고있던 코어는 유휴 상태가 되지않고 다른 작업을 수행하지 못한다. 

NEOS 실시간 운영체제는 시스템의 효율적 사용을 위해 ISR 스핀락(Spinlock) 대칭형 멀티프로세싱 환경에서 인터럽트와 인터럽트, 인터럽트와 스레드 사이의 상호 배제를 구현하기 위해 사용되며, 스레드 스핀락(Spinlock) 스레드 사이의 스핀락을 지원한다. 인터럽트에 대한 스핀락을 지원하지 않는 대신 스레드 간의 좀더 효율적인 스핀락을 제공한다.

[표 5] 스핀락 함수

스핀락 사용에서 주의할 사항
멀티코어 환경에서 사용되는 스핀락은 동작 특성상 사용 시 다음과 같이 주의를 기울여야 시스템의 오동작을 막을 수 있다. ▲아주 짧은 구간에서 스핀락을 획득하고 바로 반환해야 한다. ▲ISR과 스레드 간에는 반드시 ISR 스핀락을 사용해야 한다. ▲스레드나 인터럽트 핸들러는 하나의 스핀락을 획득해야 한다. 

지금까지 NEOS 실시간 운영체제의 대칭형 멀티코어 환경을 지원하기 위한 주요 기능에 대해 살펴 봤다. 대부분의 프로세서들은 성능을 향상시키기 위해 멀티코어를 탑재하는 방향으로 발전하고 있다. 따라서 효율적인 멀티코어 제어는 시스템 소프트웨어에서 필수 요소로 자리 잡고 있다.

작성: 황성연 | MDS 테크놀로지 NT 개발실 부장

이 기사를 공유합니다
저작권자 © 테크월드뉴스 무단전재 및 재배포 금지