프로세스, 스레드, 코루틴
애플리케이션 시작 → 운영체제가 프로세스 생성 → 여기에 스레드 연결 → 메인스레드 시작
- 프로세스 실행중인 애플리케이션의 인스턴스. 리소스를 여는 핸들, 프로세스 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. 코루틴 → 스레드안에 존재하지만, 특정 스레드에 얽매이지 않은 가벼운 스레드
* 특정 스레드 시점
책: 코틀린 동시성 프로그래밍
'Kotlin' 카테고리의 다른 글
Kotlin 용어, 키워드 간단정리 (일급함수, Higher-Order Functions, inline) (0) | 2022.03.06 |
---|---|
코루틴- 동시성 / 병렬 (0) | 2021.05.16 |
(Kotlin) Kotlin vs Java (+ 추가기능, 코틀린 컴파일 과정) (0) | 2020.08.23 |
(Kotlin) 코틀린이란? Kotlin 소개 (0) | 2020.08.16 |
댓글