[안드로이드] 프로세스와 스레드
- 프로그래밍 정보
- 2010. 8. 20.
반응형
읽기전에 손가락 한번 클릭~ >_<
고마워요 ~ Chu ~ ♥
어플리케이션의 컴포넌트들 중 하나가 실행될 때, 하나의 실행 스레드를 가지는 리눅스 프로세스가 실행되는데요, 기본값으로 모든 어플리케이션은 이런 프로세스와 스레드에서 실행됩니다.
[안드로이드] 컴포넌트
하지만 컴포넌트가 다른 프로세스에서 실행되도록 만들거나, 프로세스에 추가적인 스레드를 만들 수도 있지요.
그럼 어떤식으로 되는지 알아볼까요?
프로세스
컴포넌트가 실행되는 장소인 프로세스는 매니페스트 파일에 의해 제어됩니다.
컴포넌트가 가지는 엘리먼트인 <activity>, <service>, <receiver>, <provider> 는 실행 될 프로세스를 지정할 수 있는 속성이 있지요. 각각의 컴포넌트가 자신만의 프로세스에서 실행될 수도 있고, 하나의 프로세스를 공유할 수도 있으며, 동일한 프로세스에서 다른 어플리케이션의 컴포넌트가 실행되도록 할 수도 있습니다. ( 단, 동일한 리눅스 유저 ID와 권한을 가지고 있을때에만 가능 )
따라서, <application> 엘리먼트는 모든 컴포넌트가 값 설정을 위한 속성을 가지고 있습니다.
모든 컴포넌트는 지정된 프로세스의 메인 스레드에서 인스턴스화되며, 그 컴포넌트를 호출하는 시스템은 메인스레드로부터 시작됩니다. 주의할 점은 각각의 인스턴스별로 따로 스레드가 생성되지 않는다는 점입니다. 따라서, 사용자의 호출에 응답하는 메소드( 리스너 등 ) 는 메인스레드에서 실행됩니다.
이것은 곧 오래걸리는 작업( 네트워크 작업이나 오래걸리는 계산 등 ), 또는 잠시 사용이 중지될 수 있을만한 작업을 메인스레드에서 하면 안된다는 것을 뜻합니다.
왜냐하면 메인 스레드가 잠시 멈추면 사용자의 반응에 즉각적으로 대응하지 못하기 때문인데요,
어느 실험결과에 의하면 사용자의 대부분은 1초~0.5초 사이에 즉각반응이 없을 시에 답답함과 느리다는 반응을 느낀다고 합니다.
따라서, 별도의 스레드를 만들어서 따로 처리하거나 ( 이때 메인스레드는 사용가능 : 다중스레드 ) , 처리과정을 사용자에게 알리는 방식으로 ( AlertDialog 등 ) 사용자가 기다리게 해야되겠습니다.
안드로이드는 메모리가 부족하고 메모리가 더 요구될 때에 , 임의의 시점에 임의의 프로세스를 강제종료 할 수 있습니다. 또한 강제종료된 프로세스안에 있던 컴포넌트도 같이 종료되겠지요.
다시 시작하게되면, 그 프로세스는 다시 시작되는 것입니다.
어떤 프로세스를 종료할지의 결정은 우선 순위에 의해 결정되는데요,
현재 실행중인 액티비티에 대한 프로세스는 우선순위가 낮고, 사용되지 않는 액티비티의 프로세스는 우선순위가 높습니다. 이 우선 순위는 "컴포넌트 생명주기" ( 다음 포스팅에 할 예정 ^^ ) 에서의 컴포넌트 상태에 따라 결정됩니다.
스레드
사용자 인터페이스가 사용자의 반응에 즉각적으로 대응하기 위해선, 액티비티를 보유한 메인 스레드는 오래걸리는 작업을 포함해서는 안되겠죠.
따라서 오래걸리는 작업은 백그라운드에서 별도의 스레드에서 처리해야겠습니다.
스레드는 Java 의 표준 스레드 객체로 코드에서 생성됩니다. 안드로이드는 스레드 관리를 위해 루퍼(Looper : 메시지를 통한 루프 ) , 핸들러 ( Handler : 메시지처리 ) , 핸들러스레드 ( HandlerThread : 메시지 루프를 가진 스레드 ) 등을 제공합니다.
관련글
[안드로이드] - [안드로이드] 컴포넌트 #1 - 액티비티(Activity)
[안드로이드] - [안드로이드] 컴포넌트 #2 - 서비스
[안드로이드] - [안드로이드] 컴포넌트 #3 - 브로드캐스트 리시버
[안드로이드] - [안드로이드] 컴포넌트 #4 - 컨텐츠 프로바이더
[안드로이드] - [안드로이드] 컴포넌트 활성화 - 인텐트(Intent)
[안드로이드] - [안드로이드] 컴포넌트 종료하기
[안드로이드] - [안드로이드] 안드로이드 매니페스트 파일
반응형