본문 바로가기
Kotlin

코루틴이란? - 프로세스/ 스레드/ 코루틴

by Developer RyanKim 2021. 5. 16.

프로세스, 스레드, 코루틴

애플리케이션 시작 → 운영체제가 프로세스 생성 → 여기에 스레드 연결 → 메인스레드 시작

  • 프로세스 실행중인 애플리케이션의 인스턴스. 리소스를 여는 핸들, 프로세스 ID, 데이터, 네트워크 연결 등 상태를 가짐 위 상태에 내부 스레드가 액세스 가능
  • 스레드 실행스레드 - 프로세스가 실행할 일련의 명령을 포함. 따라서 프로세스는 최소 1이상 스레드 포함 보통 애플리케이션의 main() 이 진입점 → 메인 스레드 메인 스레드 종료시 프로세스 종료

각 스레드는 속한 프로세스의 리소스 액세스 가능. 또한 자체 스레드 로컬 스토리지도 가짐.

스레드 안에서 명령은 하나씩 수행 및 block 됨. 따라서 ux에 부정적인 영향을 미치는 스레드는 block 하지말자. 블로킹작업을 별도의 전용 스레드에 할당하자! → 홈 프로젝트에 webClient 용 스레드풀과, 헤비한 연산 및 블로킹이 포함된 스레드풀 따로 있는걸로 앎

이 책에서 메인스레드(UI스레드)와 백그라운드 스레드를 나누었다.

  • 코루틴 코틀린문서: 코루틴→경량 스레드
  • 프로세서가 실행할 명령어의 집합 실행을 정의
  • 스레드안에서 실행 : 스레드 하나에 많은 코루틴이 있을수 있지만, 주어진 시간에 1스레드 1명령만 실행 될 수 있음 EX) 한 스레드에 10개의 코루틴이 있음 → 특정시점에는 하나의 코루틴만 실행됨

스레드와 코루틴 차이

  • 코루틴은 빠르고 적은비용으로 생성가능

suspend fun craeteCoroutines(amount :Int){ val jobs = ArrayList<Job>() for (i in 1..amount){ jobs += launch { delay(1000) } } jobs.forEach{ it.join()} }

suspend fun craeteCoroutines(amount :Int){
	val jobs = ArrayList<Job>()
    for (i in 1..amount){jobs += launch { delay(1000) } }
    jobs.forEach{ it.join()} 
}

: amount 만큼 코루틴 생성, 각 코루틴 1초간 지연

amount=10_000 : 1,160ms
amount=100_000 : 1,649ms

→ 9만개 더만들어도 약 490ms 밖에 더 안걸림.

코틀린은 고정된 크기의 스레드풀코루틴을 배포 코루틴이 중단되는 동안 실행중인 스레드는 다른 코루틴을 실행

생성 스레드 수 amount=10_000 : 4개 amount=1 : 2개 → 애플리케이션 시작시 이미 두개 스레드가 있음. → 코루틴 생성을 위한 스레드 하나도 생성 안했음

코루틴은 특정스레드와 묶이지 않는다는 점을 이해하자!
코루틴의 일부를 특정스레드에서 실행하고, 실행 중지후 나중에 다른 스레드에서 계속 실행 가능!

위 예제 함수에 코드를 추가해서 확인해보면, 시작스레드 / 종료스레드가 다른경우가 많다.

코틀린으로 개발자가 코루틴 실행 스레드 지정, 제한 가능.


정리

1. 애플리케이션 → 하나이상의 프로세스로 구성 각 프로세스 → 하나이상의 스레드
2. 스레드 블록 → 사용자와 상호작용하는 스레드는 블록되지 않아야함
3. 코루틴 → 스레드안에 존재하지만, 특정 스레드에 얽매이지 않은 가벼운 스레드


* 특정 스레드 시점





책: 코틀린 동시성 프로그래밍

http://www.yes24.com/Product/Goods/90338766?OzSrank=1

댓글