sundays.log
로그인
sundays.log
로그인
[Kotlin] Concurrency Programming
sundays
·
2022년 11월 21일
팔로우
0
kotlin
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)
sundays
develop life
팔로우
이전 포스트
[Kotlin] Coroutines 3
다음 포스트
코루틴의 비동기 사용 하는 방법
0개의 댓글
댓글 작성