본문 바로가기
Kotlin

코루틴- 동시성 / 병렬

by Developer RyanKim 2021. 5. 16.

코루틴 동시성/ 병렬

동시성은 애플리케이션이 동시에 한개이상의 스레드에서 실행될때 발생
스레드간의 통신과 동기화가 되어야 애플리케이션이 정상동작 가능

동시성에 대해

  • 올바른 동시성 코드
  • 결정론적인 결과를 가짐
  • 실행순서에는 약간의 가변성 허용 : 이를 위해 서로 다른 부분이 독립성이 있어야 하고 조정이 필요함
  • 비동시성 코드
fun getProfile(id : Int) : Profile { 
	val basicUserInfo = getUserInfo(id)
    val contactInfo = getContactInfo(id)
    return createProfile(basicUserInfo,contactInfo) 
 }

→ 사용자정보 return 전까지 연락처정보 요청하지 않음

장점

  • 정확한 실행순서를 알수있음
  • 사이드 이펙트 예측 용이함

단점

  • 동시성 코드에 비해 성능 저하
  • 코드가 실행되는 하드웨어를 제대로 활용하지 못함

getUserInfo() : 1초 소요
getContactInfo() : 1초 소요

→ getProfile() 항상 2초이상 소요

getUserInfo - getContactInfo 의존적이지 않아보임 → 동시호출로 전체 실행시간 반으로 단축가능


  • 동시성 코드
suspend fun getProfile(id :Int){
	val basicUserInfo = asyncGetUserInfo(id)
    val contactInfo = asyncGetContactInfo(id)
	return createProfile(basicUserInfo.await(),contactInfo.await()) 
}

asyncGetUserInfo() asyncGetContactInfo() 서로 다른 스레드에서 실행되도록 작성
→ 코루틴이라면 같은 스레드 일 수도? 동시에 실행된다고 가정

→ 둘중 어느 함수가 먼저 완료되어 반환되든지 상관없이,
await()을 통해 둘다 반환 된 후 실행된 createProfile의 결과는 같다. → 결정론적임을 보장

순서에 상관없이 결과가 결정적임을 보장하는 것이 동시성의 까다로운 부분!

동시성은 병렬성이 아니다

두개의 코드가 동시에 실행된다는 점에서는 비슷함.

위 동시성 예제 → createProfile()은 asyncGetUserInfo() asyncGetContactInfo() 둘중 어느 함수와도 중복되지 않음

차이점
병렬성 : 두 스레드가 정확히 같은 시점에 실행될 때 발생
필요: 2개이상 코어, 2개이상 스레드
ex) 2개코어 컴퓨터: 코어 1 → asyncGetUserInfo() 코어 2 → asyncGetContactInfo()

동시성: 두개이상의 알고리즘의 실행시간이 겹쳐질 때 발생
필요: 2개이상 실행 스레드
ex) 단일코어 컴퓨터: 지정된 시점에 둘중 하나만 실행 됨. 전체일정은 겹침.
단일코어가 서로 다른 스레드의 명령을 교차배치하여 효율적으로 실행

병렬은 동시성을 의미 동시성은 병렬성이 없어도 발생

댓글