[Kotlin] Concurrency Programming

sundays·2022년 11월 21일
0

kotlin

목록 보기
14/19

동시성 프로그래밍

Synchronous 수행

  • 순서대로 작업을 수행하여 하나의 루틴을 완료한 후 다른 루틴을 실행하는 방식
  • 다양한 기능이 한꺼번에 일어나는 다중 실행 환경에서는 성능상 제약이 있음
    • UI, 데이터 다운로드를 동시에 대응해야 하는 경우

Asynchronous 수행

  • 다양한 기능을 동시에 수행할 수 있는 방식
  • 스레드를 사용
  • Third-party library RxJava, Reactive
  • 코틀린에서는 코루틴을 기본으로 제공

코루틴 (coroutines)

  • 먼저 하나의 개별적인 작업을 루틴 이라고 하는데 여러개의 루틴들(routines)이 협력한다는 의미의 (co)를 붙인 합성어
  • non-blocking 또는 비동기 코드를 일반적인 동기 코드 처럼 쉽게 작성하면서도 비동기 효과를 낼 수 있다
  • 스레드처럼 분리된 코드가 아닌 순차적인 코드처럼 사용할 수 있다

협력형 멀티태스킹 (cooperative multitasking)

  • 코루틴 개념을 사용하면 전통적인 스레드 개념을 만들지 않고 상위 레벨에서 좀 더 쉽게 여러개의 협력형 태스크들을 만들어 낼 수 있다
  • 스레드와 달리 문맥 교환이 없고 최적화된 비동기 함수를 통해 비선점형으로 작동하는 협력형 멀티태스킹을 구현할 수 있습니다.

블로킹 동작

  • 또 다른 요청이 완료 될때까지 기다리거나, 선점당해서 잠을 자고 있는 상태
  • I/O 과정이 수행 될때 코드가 더이상 진행되지 않고 내부 메모리 영역에서 해당 작업이 마무리 될때까지 코드가 멈추는 상황을 블로킹 하고 있다 합니다

넌 블로킹 동작

  • 넌 블로킹 형태의 프로세스에서는 입출력 요청을 하더라도 운영체제에 의해 EAGAIN과 같은 시그널을 태스크 A가 받아서 실행을 재개할 수 있습니다
  • 이때 태스크 A는 다른 루틴을 수행하다 내부적으로 입출력 완료 시그널을 받은 후 콜백 루틴등을 통해 호출해 완료된 이후의 일을 처리할 수 있습니다
  • 보통은 OS 스케줄러가 concurrency 처리를 하는데 CPU의 개수대로 시 분할 방식으로 처리
  • 특정일을 하다가 응답을 기다리지않고 다른 일을 할 수 있게 하는 것

프로그램 동작과정

  • 프로그램이 2차 저장소에 저장되어 있다
  • 실행파일이 로드되어 주 메모리 (RAM) 에 올라가면 프로세스가 RUN 이 된다.
  • Process 내부에서 여러개의 태스크들이 동작한다.
  • 스레드들이 태스크라고 하기도 하고 태스크를 프로세스라고 하기도 한다 (범용성을 가짐)
  • 태스크는 OS의 스케줄링 정책에 의해 CPU 메모리(Register) 에서 연산된다
  • CPU CORE안에서 실행되는 명령(Instruction) 한줄을 patch하고 실행하는 단계를 프로그램이 실행되었다고 한다.

프로세스와 스레드의 개념

  • 프로세스는 실행되는 메모리, 스택 열린 파일들을 모두 포함하기 때문에 context-switching 비용이 크다
  • 스레드는 자신의 스택만 독립적으로 가지고 나머지는 대부분 공유하여 문맥 교환 비용이 낮아 프로그래밍에서 많이 사용
  • 다만 여러개의 스레드를 구성하면 코드가 복잡하다.

문맥 교환

  • 하나의 프로세스나 스레드가 CPU를 선점하는 상황에서 다른 프로세스나 스레드가 CPU를 사용하도록 하기 위해 이전의 프로세스의 상태를 보관하고 새로운 프로세스의 상태를 적재하는 과정

Reference

  • 황영덕 - 코틀린 프로그래밍 (동시성 프로그래밍 6-1)
profile
develop life

0개의 댓글