본문 바로가기
Android

안드로이드 하드웨어 서비스 01 안드로이드 하드웨어 서비스 (3)

by OKOK 2021. 5. 19.

1.4 ITC(Inter Thread Communication)

쓰레드의 공유 객체를 이용하는 방법. UI 작업은 main 쓰레드에서 그 이외의 시간이 오래 걸리는 작업은 worker 쓰레드에서 처리하여 main 쓰레드가 블록 상태에 빠져 ANR이 발생하는 것을 방지함. 쓰레드는 프로세스의 자원을 공유하지만, 독립적으로 실행되므로 여러 가지 작업이 동시에 실행되어야 하는 경우 각 작업을 쓰레드에 분담시켜 동시에 처리할 수 있음. 안드로이드의 자바 앱은 멀티 쓰레드를 지원함. 멀티 쓰레드 간 통신을 위해 핸들러와 루퍼를 제공함. 루퍼 기반의 핸들러를 이용하여 통신할 수 있음. 하나의 핸들러는 하나의 루퍼에 연결될 수 있음. 루퍼는 여러 개의 핸들러를 가질 수 있으며 메시지를 정확하게 목적지 핸들러에 전달할 수 있음. 바인더는 외부의 프로세스와 RPC 작업을 수행하기 위해 준비되는 쓰레드임. 안드로이드에서 쓰레드를 생성하는 방법은 크게 2가지로 Thread 클래스를 상속하는 방법과 Runnable 인터페이스를 구현하는 방법임. 

 

1.4.2 안드로이드 ITC 모델

동기 데이터 전송은 이벤트 송/수신을 위해 블로킹되어야 하는 문제점이 있어 효율성이 떨어짐. 수신자는 이벤트 큐를 도입함으로써 동기 데이터 전송과 달리 송신자로부터 이벤트를 수신할 수 있으므로 many-to-one 통신이 가능함. 

메시지 : 메시지는 데이터를 전송하기 위한 컨테이너이다. 메시지는 전송할 데이터는 물론 어떤 핸들러에 전송할지 명시하고 있음

메시지 큐 : main 쓰레드의 UI 객체가... 송신된 메시지는 FIFO 방식의 메시지 큐에 쌓이게 되며...

루퍼 : 루퍼는 메시지 큐에 도착한 메시지를 꺼내는 디스패쳐 역할을 수행함. 무한 루프를 돌면서 메시지가 메시지 큐로 도착할 때까지 대기하며 메시지가 도착했을 때 해당  메시지가 처리되어야 할 핸들러로 디스패치함. 루퍼는 쓰레드당 하나만 존재할 수 있음.

메시지 핸들러 : 루퍼에 의해서 디스 패치된 메시지는 메시지에 명시된 핸들러에 보내진 다음 핸들러에 의해서 처리됨. 

쓰레드 간 통신은 메시지를 매개체로 이루어짐. main 쓰레드는 worker 쓰레드에 메시지를 이용하여 필요한 데이터를 전송하거나 Runnable 객체를 보내 worker 쓰레드가 특정 작업을 대신하도록 명령할 수 있음.

ANR(Application Not Responding) 앱이 5초 이상 사용자의 입력 이벤트에 반응하지 않는 경우. 브로드캐스트 리시버가 10초 이내로 리턴하지 않는 경우. 

 

1.4.3. 메시지

what : 메시지를 수신하는 핸들러가 식별할 수 있는 사용자 정의 메시지 ID, 핸들러는 이 멤버 변수를 참조하여 어떠한 처리를 요청하는 메시지인지 구별할 수 있음.

arg1, arg2 간단한 정수 값을 저장할 수 있는 멤버 변수. 메시지 클래스는 두 개의 정수를 저장할 수 있는 arg1, arg2를 포함함

obj : 메시지를 수신하는 목적지 핸들러에 보낼 임의의 객체.

target : 메시지가 전달될 목적지 핸들러

callback : 핸들러에 의해 처리될 때 실행되어야 할 Runnable 객체

메시지 풀로부터 메시지를 획득하는 과정임

 

1.4.4 루퍼

메시지는 핸들러에게 보내진 다고 해서 곧바로 처리되지 않음. 핸들러에 보내진 메시지는 쓰레드의 메시지 큐에 저장되고 메시지 큐에 있는 메시지는 무한 루프를 돌며 ... 루퍼는 이벤트 루프와 메시지 큐의 레퍼런스를 가지고 있는 클래스로 쓰레드가 메시지 큐에 접근할 수 있는 수단을 제공함. Looper 클래스의 생성자 코드는 Looper 객체가 생성디면 MessageQueue 객체도 함께 생성됨. 루퍼와 메시지 큐가 결합되면서 쓰레드 간에 메시지를 송/수신할 수 있는 기반이 마련됨. 메시지 큐로부터 디스패치하는 루퍼가 없으면 핸들러를 생성해도 아무런 메시지를 받을 수 없기 때문임. 메시지를 수신할 핸들러의 dispatchMessage() 호출하여 메시지 수신 핸들러가 메시지를 처리할 수 있도록 트리거함

 

1.4.5 핸들러

핸들러 인스턴스를 생성할 때 핸들러 인스턴스는 현재 쓰레드에 소속되어 있는 루퍼의 레퍼런스르 알고 있음. 핸들러가 처리하는 대상은 메시지와 런어블 객체이며 단일 쓰레드에 단 하나의 루퍼와 메시지 큐가 존재하지만, 핸들러는 다수 존재 가능함. sendMessage() 메시지를 메시지 큐에 Delay 시간 없이 바로 삽입하는 동작임.

 

1.4.6 핸들러 쓰레드

Java.lang.Thread는 기본적으로 메시지 큐와 루퍼를 포함하지 않기 때문에 안드로이드는 루퍼를 포함한 쓰레드를 만드는 방법을 제공하는데 이것이 바로 HandlerThread 클래스임. 

 

1.5 데몬 서비스 분석

여러 클라이언트의 요청을 처리하기 위해 백그라운드에서 실행하는 서버 프로그램임. 데몬은 시스템 시작 시 생성되고 데몬은 시스템이 셧다운 될 때까지 실행된다. 백그라운드에서 동작하며 터미널을 통해 제어하지 못함. 부모 프로세스의 작업 디렉토리는 자식 프로세스인 데몬 프로세스에 상속되므로 부모 프로세스가 죽은 뒤, 데몬 프로세스의 작업 디렉토리가 소속된 파일 시스템을 OS가 언마운트하려고 시도할 때 데몬 프로세스가 해당 작업 디렉토리를 사용하고 있어 언마운트에 실패하는 경우가 발생함. 이를 방지하기 위해 데몬 프로세스가 생성될 때 현재 작업 디렉토리를 루트 디렉토리로 설정하여 언마운트 되지 않는 곳으로 옮김.

댓글