[TIL]Kotlin 기본 문법 : 동시성 프로그래밍

지혜·2023년 12월 4일

Android_TIL

목록 보기
10/70

✏231204 월요일 TIL(Today I learned) 오늘 배운 것

📖 동기식, 비동기식 프로그래밍

1. 동기식 프로그래밍

  • 순서대로 한 가지씩 작업을 수행하는 행위 : 요청을 보내고 결과값을 받을 때까지 작업이 멈춘다.
    => 순차적으로 진행되기 때문에 만약 앞선작업이 끝나지 않았다면 뒷작업은 영원히 수행되지 않는다.
    +꼭 동기적으로 실행하지 않아도 되는 기능은 비동기적으로 실행하는게 좋다.

2. 비동기식 프로그래밍

  • 여러 가지의 로직들이 완료 여부에 관계 없이 실행 되는 방식 : 요청을 보내고 결과값을 받을 때까지 멈추지 않고 다양한 일을 한 번에 수행한다.

📖스레드 (Thread)

  1. 프로그램을 더블클릭하여 실행하면, 메모리에 올라가게 되는데 이것을 프로세스(Process)라고 한다.

  2. 이 프로세스 안에서 더 작은 작업의 단위를 스레드 (Thread)라고 한다.

  3. 각 스레드는 생성되어서 각 독립된 메모리 영역 스택(STACK)을 가지고 수행된다.
    => 스레드가 생성되면, 스택메모리의 일정 영역을 차지한다.

  4. thread 키워드로 생성하며, 10단계로 우선순위를 설정할 수 있다. (스케쥴링)

    • 스레드A 에서 Task1을 수행하는 동안, Task2의 결과가 필요하면, 프로세스에서 A를 블로킹(결과가 나올 때까지 해당 자원은 사용하지 못함)하고 B로 스위칭을 하여 Task2를 수행하고, 완료된 결과 값은 다시 A로 스위칭하여 반환한다.
    • 이 때, Task3과 Task4는 멈추지 않고 각 각 동시에 자신의 일을 수행한다.
    • 대부분 영역(코드, 데이터, 힙 등)은 공유 중이기 때문에, 컨텍스트 스위칭(문맥 교환)의 비용이 프로세스 스위칭에 비하면 적은편이지만, 잦아질 경우 비용이 커지기 때문에 최적화를 고려해야한다.
      => 컨텍스트 스위칭(Context Switching, 문맥교환)을 통해 동시성을 보장한다.

📖코루틴 (Coroutine)

  1. 최적화된 비동기 함수를 사용하여 스레드보다 더욱 가볍게(CPU자원 절약) 쓸 수 있다.
    => 스레드의 대체 기술은 아니고, 하나의 스레드를 잘게 쪼개서 사용하는 기술이다.

  2. launch와 async로 코루틴을 시작한다.

    • async : 결과 값이 있는 코루틴 빌더. 병렬처리에 (withContext보다 더) 유리하다.
      +await( ) 로 정지(차단)하여 결과값을 반환할 수 있다.
    • launch : 업데이트 등의 결과 값이 없는 코루틴 빌더.
      +job객체(join, cancel등의 다양한 함수를 가지고 있다.)로 코루틴을 관리한다.
  3. 스코프로 범위를 지정할 수 있다.

    • GlobalScope: 앱이 실행된 이후에도 계속 수행되어야할때 사용한다.
    • CoroutineScope: 필요할때만 생성하고 사용 후에는 정리 해야 한다.
  4. withContext( ) : 코루틴 실행 중에, 실행 환경을 바꾸고 싶을 때 사용한다.

    • async와 다르게 예외가 스코프에 전달되지 않는다.
    • Dispatcher간의 변환 작업에 유용하다
  5. Dispatcher를 통해 코루틴을 실행할 스레드를 지정할 수 있다.(코루틴 배분)

    • Dispatchers.Main: UI와 상호작용하기 위한 메인스레드
    • Dispatchers.IO: 네트워크나 디스크 I/O작업에 최적화되어있는 쓰레드
    • Dispatchers.Default: 기본적으로 CPU최적화되어있는 쓰레드
    • Coroutine Object : 작업 하나의 단위. 여러 작업에 각각 Object를 할당한다.
    • Task1(=object1)을 수행하다가 Task2(=object2) 수행 요청이 발생했을 때, object1이 결과를 기다리는 동안 Suspend(Non-Blocking)상태로 바뀌며, object2가 컨텍스트 스위칭 없이 object1과 동일한 스레드A에서 수행이 가능하다.
    • 이 때, 스레드 C에서도 여러 Task Object를 동시에 수행 할 수 있다.
    • OS의 관여 없이 소스 코드를 통해 Switchg 시점을 마음대로 정한다.
    • 중단이되거나 다른 스레드에서 재실행되어도 비용이 매우 적게 든다.
      => 프로그래머 스위칭(Programmer Switching, No-Context Switching)을 통해 동시성을 보장하며, 이는 컨텍스트 스위칭과 다르다.

✏오늘 발생 문제 및 해결

  • 코루틴 개념에 대해서 새로 알게 되었다. 스레드는 들어본적은 많이 있는데, 코루틴은 들어본 것도 처음이었다. 스레드 보다 작은 단위라는 점이 인상깊었다. 정리하면서 알아보니 코루틴에서 사용하는 함수와 Suspend개념에 대해 단순히 이론적으로 정리하는 것만으로는 아직 쉽게 이해가 가지않는다.
    => 안드로이드에서 최적화 개념과 앱 성능 향상 문제를 다룰 때 중요하다는 점은 알겠다. 지금은 main스레드 하나만 사용하기 때문에 쉽게 체감하기 어려우니, 나중에 좀 더 겪어본 후 코루틴에 대해서 제대로 정리하는 시간을 가져야겠다.
profile
파이팅!

0개의 댓글