ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Android Process와 Thread
    안드로이드 학습/Android 기술면접 대비 2023. 5. 22. 16:22

    차례:

    1. Process

    2. Android Process

    3. Thread

    4. Main Thread

    5. Worker Thread

    6. UI 작업을 UI / Main Thread에서만 하는 이유?

    Process :

    • 메모리에 올라와 실행되고 있는 프로그램의 인스턴스 혹은 실행중인 프로그램을 의미한다.
    • (프로그램(Program)은 어떤 작업을 위해 실행할 수 있는 파일을 말한다)
    • 운영체제로부터 시스템 자원을 할당받는 작업의 단위

     

    인스턴스란??

    더보기

    객체와 인스턴스

     

    OOP적 관점에서 객체와 인스턴스의 차이점으로는 객체는 선언, 인스턴스는 실체화를 의미한다.

    클래스의 타입으로 선언 되었을 때 객체라고 부르며, 그 객체가 메모리에 할당되어 실제 사용될 때는 인스턴스라고 부른다.

     

    즉 프로그램이 메모리에 할당되는 것이 프로그램의 인스턴스라고 할 수 있다.

     

    • 특징:
      • 프로세스는 각각 독립된 메모리 영역 (Code, Data, Stack, Heap의 구조)을 할당받는다. 
      • 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있다.
      • 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다. 
      • 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 한다. Ex. 파이프, 소켓 등을 이용한 통신 방법 이용

    • 프로세스(process)의 메모리 구조
      • Code 영역 : 컴파일된 소스 코드가 저장되는 영역
      • Data 영역 : 전역변수, static 변수의 할당.
      • Heap 영역 : 동적할당을 위한 메모리 영역.
      • Stack 영역 : 지역변수, 함수 호출시 전달되는 인자(파라미터)를 위한 메모리 영역. (높은 주소부터 할당)

    함수를 실행하게 되면 함수의 결과가 리턴될 주소가 스택에 저장되고, 함수의 지역 변수들이 차례로 스택에 쌓이게 된다.

     

    함수가 다 실행되고 나면 스택에 있던 데이터들이 차례로 삭제되고, 스택에 저장되어 있던 리턴될 주소 또한 지워지면서 그 주소로 이동하게 된다.

     

    Android Process부분 : 

    기본적으로 같은 애플리케이션의 모든 구성 요소는 같은 프로세스와 스레드에서 실행된다.

    하지만 AndroidManifest에서 각 구성요소들 <activity>, <service>, <receiver>, <provider> 를 선언할 때 android:process 값을 넣어서 실행될 프로세스를 지정할 수 있다. (지정하지 않으면 main process에서 실행됨)

     

    이 속성에 할당된 이름이 (":")으로 시작하면 app전용 새 프로세스가 만들어지고 여기서 활동이 실행된다.

    이름이 소문자로 시작하면 그 이름으로 전역 프로세스에서 실행된다. (권한 필요)

     

    이렇게 해서 어떤 activity와 어떤 activity 몇개만 다른 프로세스에서 실행하게 한다던지 할 수가 있다.

    또한, android:process를 설정하여 다른 app 의 구성 요소를 동일한 프로세스에서 실행할 수도 있다고 한다. (단, 이는 App이 동일한 Linux 사용자 ID를 공유하고 동일한 인증서로 서명되었을 경우에 한함)

     

    프로세스 어떤상황에서 왜 분리하는가 (멀티프로세스를 사용하는 이유)

    참고 1

    참고 2

     

    Thread

    • 사전적 의미
      • 프로세스 내에서 실행되는 여러 흐름의 단위
        프로세스의 특정한 수행 경로
        프로세스가 할당받은 자원을 이용하는 실행의 단위

     

    • 특징
      • 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
      • 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유한다. 반면에 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다.
      • 각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.
      • 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있다.

     

    • 프로세스 구조
      • Code 영역 : 프로그램을 실행시키는 실행 파일 내의 명령어들이 올라갑니다.
      • Data 영역 : 전역변수, static 변수의 할당. 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸합니다.
      • Heap 영역 : 동적할당을 위한 메모리 영역. (자바 : new ~~)
      • Stack 영역 : 
        • 지역변수, 함수의 파라미터를 위한 메모리 영역.
        • 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸합니다.
        • LIFO

     

    안드로이드 Thread 부분 :

    • Main Thread
    • Worker Thread

    Main Thread 

    안드로이드에서 기본적으로 실행되는 thread는 main thread (혹은 UI thread라고 한다). 메인 스레드는 UI 관련 된 것들을 맡기 때문에 일반적으로 UI thread라고 불린다

     

    안드로이드를 사용하다 보면 Multi Thread를 사용하는 경우가 많다. 단일 스레드로 개발해서 네트워크 액세스나 데이터베이스 쿼리 같은 긴 작업을 UI Thread에서 전부 수행한다면 전체 UI Thread 가 차단되고, 이러면 사용자에게는 App이 멈춘것처럼 보이게된다. (이렇게 되면 서비스에 큰 지장을 초래할 것이다...)

     

    만약에 UI 스레드가 몇 5초 이상 차단되면 사용자에게 ANR 다이얼로그도 뜨게된다. 그렇게 되면 앱이 강제종료 하게 된다. 

     

    그래서 네트워크 액세스나 데이터베이스 같은 긴 작업 할경우 새로운 thread를 생성해주는데 일반적으로  'Worker Thread' 라고 불린다.

     

    Worker Thread

    위에서 본것처럼 UI 스레드를 차단하면 안되기 때문에 네트워크 통신이나 DB조작 같은 일들은 반드시 별도의 스레드에서 수행을 해야한다. 

     

    안드로이드에서는 UI 스레드나 main thread를 제외한 다른 thread에서는 UI를 바로 업데이트하는 것을 막아 두었다. 

     

    그러나 네트워크 통신이나 DB에서 내용을 받아와서 UI를 업데이트 해야하는 경우는 분명히 있기 때문에 외부 thread에서 UI thread 에 액세스하는 몇가지 방법이 제공된다.

    • Handler와 Looper.getMainLooper()를 이용한 방법 
    • Activity.runOnUiThread를 이용한 방법 
    • View.post를 이용한 방법
    • AsyncTask 클래스

     

    UI 작업을 UI / Main Thread에서만 하는 이유?

    • UI작업을 비동기적으로 처리한다면 반드시 동기화 문제에 마주치게 된다.

    Handler가 없다면 누구의 setText가 될지???

    • 안드로이드는 이런 문제를 막기위해 병렬 동작하는 Main Thread와 Working Thread 사이에 Handler를 두고 UI 작업은 모두 Main Thread로 전달하게 하였다.

    Handler 사용시

    • Main Thread 무거운 작업을 X : Main Thread에서 UI 작업이 이루어진다. 시간이 오래 걸리는 작업을 메인 스레드에서 하게 되면 UI 처리가 늦어진다.

     

    Handler :  내용이 길어 질것 같아서 url로 대체!!!

    https://from-android-to-server.tistory.com/18

     

    Handler와 Looper

    UI 업데이트를 메인 스레드에서만 허용한다. 하지만 워커 스레드 내에서 UI 처리를 해야 한다면 해당 스레드와 UI 스레드를 이어주는 것이 handler이다. UI 작업을 UI / Main Thread에서만 하는 이유? UI작

    from-android-to-server.tistory.com

     

     

    멀티 프로세스와 멀티 쓰레드의 차이

     

    '안드로이드 학습 > Android 기술면접 대비' 카테고리의 다른 글

    ANR이란  (0) 2023.06.12
    Android Service  (0) 2023.06.12
    Android 런타임 ART 및 Dalvik  (0) 2023.06.05
    안드로이드 참고할한 링크들  (0) 2023.05.29
    ViewHolder (RecyclerView & ListView)  (0) 2023.05.25
Designed by Tistory.