[전 삼성전자] 서주영님의 블로그에서 가져온 글입니다. 좀 오래된 글이지만, 도움이 되실 것 같아, 올립니다.
※ 이벤트 → 상황(event), 콜백 → 반응함수(call back) 등으로 수정하여 사용
http://egloos.zum.com/seoz/v/3827472
안녕하세요? 천재태지 서주영입니다.
이번 포스트에서는 EFL의 핵심중 하나인 ecore main loop[1]에 대해서 알아보겠습니다.
여느 GUI 프로그래밍과 마찬가지로 EFL로 작성한 GUI 프로그램도 상황 반응(event driven) 방식으로, 프로그램은 상황(event)을 점검(check)/처리하는 주기(routine)를 반복합니다. 이 반복되는 구문을 EFL에서는 ecore main loop이라고 합니다. 말 그대로 ecore라는 library(자료집)에 포함되어 있으며 프로그램의 main이 되는 loop입니다. fd handling, event handling, timing handling 등 모든 일 처리가 ecore main loop에서 시작됩니다. 그러므로 ecore main loop은 EFL GUI 프로그램의 핵심이라 할 수 있습니다.
반복적으로 상황(event)를 점검(check)하고 처리하는 주기(routine)는 [대기 <---> 처리]를 반복합니다. 처리할 상황(event)이 없으면 가만히 대기하고 있다가 처리를 해야 할 상황(event)이 있을 때 이를 처리하는 방식입니다. 그러므로 대기중에는 CPU를 소모하지 않아 효율적입니다. 이 대기중인 상태를 idle 상태라고 합니다.
core main loop을 시작하려면 ecore_main_loop_begin() API를 호출하면 되며 elementary의 elm_run()이 ecore_main_loop_begin()의 wrapper입니다. ecore main loop을 종료하려면 ecore_main_loop_quit() API를 호출하면 되며 elementary의 elm_exit()이 ecore_main_loop_quit()의 wrapper입니다. 보통 elementary로 응용프로그램(application)을 작성하면 elm_run()과 elm_exit()을 사용합니다.
ecore main loop의 전체적인 구조는 아래와 같습니다. 복잡해 보이지만 알고 보면 어렵지 않습니다.
그럼, 하나 하나 나누어서 설명 드리겠습니다.
1. idle(대기) 상태
idle 상태와 관련된 내용은 크게 idle enter, idle, idle exit으로 나눌 수 있습니다.
- idle enter는 대기 상태에 진입하는 것을 의미하고,
- idle은 실제 대기 상태를 의미하고,
- idle exit은 대기 상태에서 빠져 나오는 것을 의미합니다.
1.A idle enter
idle 상태에 진입하는 상태를 말합니다. ecore_idle_enterer에 등록되어 있는 반응함수(call back)를 호출합니다. 그런데 이 때, evas의 rendering과 관련된 주기(routine)도 idle enterer를 사용하기 때문에 이 부분에서 rendering이 발생하게 됩니다. 그 후, app, library 개발자가 추가한 기타 다른 ecore_idle_enterer 반응함수(call back)가 불립니다.
1.B idle
이제 idle 상태가 되기 바로 직전입니다. 이 때 여러 조건에 따라서 구체적인 동작이 달라집니다.
1.B.a 상황(event) 존재
만약 처리해야할 상황(event)이 존재하는 경우 시간만료(time out)가 0.0인 select만 호출하고 idle 상태에서 그냥 빠져 나갑니다.
1.B.b idler 존재
만약 처리해야할 상황(event)은 없는데, ecore_idler에 등록된 반응함수(call back)가 있다면, 해당 반응함수(call back)를 호출하고 idle 상태에서 빠져나갑니다.
1.B.c select
처리해야할 상황(event)도 없고 호출할 ecore_idler 반응함수(call back)도 없다면 진정한 idle 상태에 빠지게 됩니다. 이 때, select() 함수를 호출하여 상황(event)이 발생하기를 기다립니다.
1.C idle exit
1.B 상태에서 빠져 나온 상태를 의미합니다. 이 때, ecore_idle_exiter에 등록되어 있는 반응함수(call back)가 호출됩니다.
2. fd handling
fd(file descriptor)를 처리하는 부분입니다. socket이나 pipe를 처리하는 주기(routine)가 이에 해당하는데요, ecore_con, ecore_pipe, ecore_ipc 등이 있습니다. fd handler가 등록된 것만 처리합니다.
3. sig to event
시스템 신호(system signal)를 ecore event로 변경해주는 부분입니다. SIGUSR1, SIGHUP, SIGQUIT 등의 시스템 신호(system signal)를 ECORE_EVENT_SIGNAL_USER, ECORE_EVENT_SIGNAL_HUP, ECORE_EVENT_SIGNAL_EXIT 등의 ecore event로 변환합니다.
4. event handling
ecore event를 처리하는 주기(routine)입니다. 여기서 말한 event는 키보드나 마우스 등의 일반적인 상황(event)이 아니라 ecore 내부적으로 사용하는 ecore_event를 말합니다. ecore_event_handler_add()를 이용하여 handler가 등록된 event를 처리합니다. 대표적인 예로는 ecore_job이 있습니다. ecore_job은 library(자료집)나 응용프로그램(application)에서 event를 사용하기 쉽게 미리 정의해둔 job 형태(type)의 상황(event)입니다. 그러므로 ecore_job은 내부적으로는 ecore_event를 사용하고 있으며, 다른 ecore_event와 같은 대기줄(큐, queue)를 사용하고 있어 FIFO(First In First Out) 방식으로 처리됩니다.
5. timing handling
ecore timer를 처리하는 주기(routine)입니다. 사용자가 추가한 ecore_timer 혹은 ecore_animator, ecore_poller와 관련된 반응함수(call back)를 호출합니다. ecore_animator와 ecore_poller는 내부적으로 ecore_timer를 사용하고 있습니다.
6. sig to event
3번과 동일한 작업이 일어납니다.
Ecore main loop은 위의 6가지 작업을 수행하며 한 loop을 구성합니다. 이 loop이 while 문 안에서 계속 반복되면서 ecore main loop이 완성됩니다.
이렇게 간단하게 ecore main loop에 대해서 알아보았습니다. 하지만 이 내용이 다가 아닙니다. 하나의 글(posting)에 모든 것을 다 담을 수는 없으므로 위에 있는 각 항목 혹은 중요한 내용별로 별도의 글(posting)을 올릴 생각입니다.
그리고 Ecore Main Loop에 대한 Overview를 간단하게 Prezi[2]로 만들어보았습니다.
프리젠테이션에 재미있는 효과가 들어가 있으니 한번 살펴보세요 ^^
'Toolkit_(with_Video_Tutorials) > TIZEN' 카테고리의 다른 글
[동영상] (2) 타이젠 스튜디오설치, 라즈베리파이 3B+ 환경설정 - 서울하드웨어해커톤 탑메이커편, 타이젠(Tizen) 1일차 (8.18) (0) | 2019.08.22 |
---|---|
[동영상] (1) 워크숍 & 해커톤 소개, 시료배포, 참가팀 소개 - 서울하드웨어해커톤 탑메이커편, 타이젠(Tizen) 1일차 (8.18) (0) | 2019.08.22 |
[동영상] 서울하드웨어해커톤 탑메이커편, 타이젠(Tizen) 2일차 (8.18) (0) | 2019.08.18 |
(기술워크숍) 타이젠 + 제어컨트롤러 [총 8시간] (0) | 2019.08.18 |
[동영상] (맛보기 워크숍) 리눅스기반 고성능 하드웨어 플랫폼 TIZEN, 예제를 중심으로 (0) | 2019.08.18 |
[동영상] 서울하드웨어해커톤 탑메이커편, 타이젠(Tizen) 1일차 (8.17) (0) | 2019.08.17 |
[자막번역] Tizen Native App Fundamentals 타이젠 앱개발 기본사항 (0) | 2019.08.17 |
[동영상] (맛보기 워크숍) 리눅스기반 고성능 하드웨어 플랫폼 TIZEN, 예제를 중심으로 (0) | 2019.08.08 |