[Kotlin ๊ธฐ์ดˆ] ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ์ดˆ (์“ฐ๋ ˆ๋“œ์™€ ์ฝ”๋ฃจํ‹ด)
๋ฐ˜์‘ํ˜•

 

 

 


 

 

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

 

  • ๋™๊ธฐ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ : ์ˆœ์„œ๋Œ€๋กœ ํ•˜๋‚˜์˜ ์ž‘์—…์”ฉ ์ˆ˜ํ–‰ํ•˜๋Š” ํ–‰์œ„ 
    - ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ž์„  ์ž‘์—…์— ์˜ํ–ฅ์„ ๋ฐ›์Œ
    - ์•ž์„  ์ž‘์—…์ด ๋๋‚˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋’ค์˜ ์ž‘์—…์€ ์˜์›ํžˆ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Œ
    - ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ์ž‘์—…์„ ๋ฉˆ์ถค
  • ๋”ฐ๋ผ์„œ ๊ผญ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ธฐ๋Šฅ์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š”๊ฒŒ ์ข‹์Œ
  • ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ์—ฌ๋Ÿฌ๊ฐ€์ง€์˜ ๋กœ์ง๋“ค์ด ์™„๋ฃŒ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์‹คํ–‰๋˜๋Š” ๋ฐฉ์‹
    - ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ›์ง€ ์•Š์•„๋„ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๋˜ ๋‹ค๋ฅธ ์ผ์„ ์ˆ˜ํ–‰
  • ์˜ˆ: 5GB ์˜์ƒ ๋‹ค์šด๋กœ๋“œ → ๋ฉ”์ผ์ „์†ก → ์•Œ๋ฆผ์˜ ์ˆœ์„œ๋ฅผ ๊ฐ€์ง„ ๋กœ์ง
  • ๋™๊ธฐ์ ์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด ๋‹ค์šด๋กœ๋“œ ์ค‘ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•˜์ง€๋ชปํ•˜๊ณ  ์•ฑ์ด ๋ฉˆ์ถ”๋Š” ๋“ฑ์˜ ๋ฌธ์ œ ๋ฐœ์ƒ
  • ๋”ฐ๋ผ์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ, ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•˜๊ณ ์žˆ๋‹ค๊ฐ€ ์˜์ƒ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋์„๋•Œ ์•Œ๋ฆผ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ

 

 


 

 

์“ฐ๋ ˆ๋“œ (Thread)

 

  • ํ”„๋กœ๊ทธ๋žจ์€ ํ•˜๋‚˜์˜ ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ(์‹คํ–‰ํ๋ฆ„)๊ฐ€ ์กด์žฌ
  • ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ:  fun main() ←— ๋ฉ”์ธํ•จ์ˆ˜
  • ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ ์œ„์—์„œ ๋กœ์ง์„ ์‹คํ–‰ํ•˜๋ฉด ๋™์‹œ์ฒ˜๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅ
  • ๋”ฐ๋ผ์„œ thread ํ‚ค์›Œ๋“œ๋กœ, ๋ณ„๋„์˜ ์ž์‹ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋™์‹œ์— ๋กœ์ง์„ ์‹คํ–‰
  • ์“ฐ๋ ˆ๋“œ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์˜ˆ์‹œ
    (1) ๋ชฌ์Šคํ„ฐ๋ฅผ ๊ณต๊ฒฉ / ์ฒด๋ ฅ ๋‹ณ์Œ / ํšจ๊ณผ์Œ ๋ฐœ์ƒ 3๊ฐœ๊ฐ€ ๋™์‹œ์— ๋ฐœ์ƒํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
    (2) ๊ฒฝ๋งˆ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ง๋“ค์ด ๋™์‹œ์— ์ถœ๋ฐœํ•ด์„œ ๊ฒฝ์Ÿํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

 

 

ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ์˜ ์ฐจ์ด

 

 

ํ”„๋กœ์„ธ์Šค(Process)

  • ํ”„๋กœ๊ทธ๋žจ์ด ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ€์„œ ์‹คํ–‰๋  ๋•Œ, ํ”„๋กœ์„ธ์Šค 1๊ฐœ
  • ๋ณดํ†ต ํ”„๋กœ๊ทธ๋žจ์„ ๋”๋ธ”ํด๋ฆญํ•˜๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ๊น€

 

์“ฐ๋ ˆ๋“œ(Thread)

  • ์“ฐ๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค๋ณด๋‹ค ๋” ์ž‘์€ ๋‹จ์œ„ (ํ”„๋กœ์„ธ์Šค ์•ˆ์—์„œ ๋” ์ž‘์€ ์ž‘์—…์˜ ๋‹จ์œ„ = ์“ฐ๋ ˆ๋“œ)
  • ์“ฐ๋ ˆ๋“œ๋Š” ์ƒ์„ฑ๋˜์„œ ์ˆ˜ํ–‰ํ• ๋•Œ ๊ฐ ๋…๋ฆฝ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ธ STACK ์„ ๊ฐ€์ง
  • ์ฆ‰ ์“ฐ๋ ˆ๋“œ๋ฅผ ํ•œ ๊ฐœ ์ƒ์„ฑํ•˜๋ฉด ์Šคํƒ๋ฉ”๋ชจ๋ฆฌ์˜ ์ผ์ • ์˜์—ญ์„ ์ฐจ์ง€

 

 

์‚ฌ์šฉ ์˜ˆ์‹œ

// ์ฝ”๋ฃจํ‹ด ์‚ฝ์ž… ํ›„ ๋นจ๊ฐ„ ๋ถ€๋ถ„ ํด๋ฆญํ•˜๊ณ  import ํ•ด์ฃผ๋ฉด ๋จ

fun main() {
    thread(start = true) { // 1๋ถ€ํ„ฐ 10๊นŒ์ง€ ์ถœ๋ ฅํ•˜๋Š” ์ฝ”๋“œ๋ฅผ 2๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๋กœ ๊ฒฝ์Ÿ
        for(i in 1..10) {
            println("Thread1: ํ˜„์žฌ ์ˆซ์ž๋Š” ${i}")
            runBlocking {
                launch {
                    delay(1000) // 1์ดˆ๋งˆ๋‹ค ์ž์›๊ฒฝ์Ÿ์„ ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋”œ๋ ˆ์ด ์ถ”๊ฐ€
                }
            }
        }
    }

    thread(start = true) {
        for(i in 50..60) {
            println("Thread2: ํ˜„์žฌ ์ˆซ์ž๋Š” ${i}")
            runBlocking {
                launch {
                    delay(1000)
                }
            }
        }
    }
}

// Thread1๊ณผ Thread2์˜ ์ˆœ์„œ๋Š” ๋ณด์žฅ๋˜์ง€ ์•Š๊ณ  ๊ฒฝ์Ÿ

 

 


 

์ฝ”๋ฃจํ‹ด (Coroutine)

 

  • ์ฝ”๋ฃจํ‹ด์˜ ์ •์˜: ๊ณต์‹๋ฌธ์„œ (๋งํฌ)
  • ์“ฐ๋ ˆ๋“œ๋ณด๋‹ค ๋”์šฑ ๊ฒฝ๋Ÿ‰ํ™”๋˜์–ด ๊ฐ€๋ณ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๋™๊ธฐ ๊ธฐ๋Šฅ
  • ์ตœ์ ํ™”๋œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ
  • ํ•˜๋“œ์›จ์–ด ์ž์›์˜ ํšจ์œจ์ ์ธ ํ• ๋‹น, ์•ˆ์ •์ ์ธ ๋™์‹œ์„ฑ
  • ๋กœ์ง๋“ค์„ ํ˜‘๋™ํ•ด์„œ ์‹คํ–‰ํ•˜์ž๋Š”๊ฒŒ ๋ชฉํ‘œ์ด๋ฉฐ ๊ตฌ๊ธ€์—์„œ ์ ๊ทน ๊ถŒ์žฅ
  • ์ฝ”๋ฃจํ‹ด์€ ๋นŒ๋”์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ

 

 

์ฝ”๋ฃจํ‹ด ๋นŒ๋”์˜ ์ข…๋ฅ˜ : launch (๊ฒฐ๊ณผ๊ฐ’ X), async (๊ฒฐ๊ณผ๊ฐ’ O)

 

  • launch๋Š” Job ๊ฐ์ฒด๋กœ ์ฝ”๋ฃจํ‹ด์„ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ, Job๊ฐ์ฒด๋Š” ๋‹ค์–‘ํ•œ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
    - join: ํ˜„์žฌ์˜ ์ฝ”๋ฃจํ‹ด์ด ์ข…๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆผ
    - cancel: ํ˜„์žฌ์˜ ์ฝ”๋ฃจํ‹ด์„ ์ฆ‰์‹œ ์ข…๋ฃŒ

 

  • ์ฝ”๋ฃจํ‹ด์€ ์Šค์ฝ”ํ”„๋กœ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ
    - GlobalScope: ์•ฑ์ด ์‹คํ–‰๋œ ์ดํ›„์— ๊ณ„์† ์ˆ˜ํ–‰๋˜์–ด์•ผํ• ๋•Œ ์‚ฌ์šฉ (์‚ฌ์šฉ ํ›„ ์ •๋ฆฌ X)
    - CoroutineScope: ํ•„์š”ํ•  ๋•Œ๋งŒ ์ž„์‹œ์ ์œผ๋กœ ์ƒ์„ฑ (์‚ฌ์šฉ ํ›„ ์ •๋ฆฌ ํ•„์š” O)

 

 

 

 

์‹ค์Šต ํ™˜๊ฒฝ ์„ค์ •

 

fun main(args: Array<String>) {
    println("๋ฉ”์ธ์“ฐ๋ ˆ๋“œ ์‹œ์ž‘")
    var job = GlobalScope.launch {
        delay(3000)   // delay 3์ดˆ๋ฅผ ์ฃผ์—ˆ์ง€๋งŒ, main ํ•จ์ˆ˜์—์„œ "๋ฉ”์ธ์“ฐ๋ ˆ๋“œ ์ข…๋ฃŒ" ๋จผ์ € ์ถœ๋ ฅ๋˜๊ณ  ๋๋‚˜๋ฒ„๋ฆผ
        println("์—ฌ๊ธฐ๋Š” ์ฝ”๋ฃจํ‹ด...") 
    }
    println("๋ฉ”์ธ์“ฐ๋ ˆ๋“œ ์ข…๋ฃŒ")
}
  • ์•ˆ๋“œ๋กœ์ด๋“œ๋Š” ํ•ญ์ƒ ์•ฑ์ด ์ผœ์žˆ๋Š” ์ƒํƒœ์ง€๋งŒ, ์‹ค์Šตํ™˜๊ฒฝ์€ kt ํŒŒ์ผ์„ ์ด์šฉํ•ด ์‹คํ–‰ ํ›„ ์ข…๋ฃŒ๋˜๋Š” JVMํ™˜๊ฒฝ
  • ๋”ฐ๋ผ์„œ ์‹คํ–‰ํ•˜๋ฉด main์ด ๋จผ์ € ์ข…๋ฃŒ๋˜๊ธฐ ๋•Œ๋ฌธ์— 3์ดˆ ๋’ค ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋ฃจํ‹ด์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์—†์Œ

 

// ๊ธ€๋กœ๋ฒŒ ์Šค์ฝ”ํ”„ ํ™œ์šฉ

fun main(args: Array<String>) {
    println("๋ฉ”์ธ์“ฐ๋ ˆ๋“œ ์‹œ์ž‘")
    var job = GlobalScope.launch {
        delay(3000)
        println("์—ฌ๊ธฐ๋Š” ์ฝ”๋ฃจํ‹ด...")
    }
    runBlocking { // ์•„๋ž˜ job์ด ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ฒ ๋‹ค ๋ช…์‹œ
        job.join()
    }
    println("๋ฉ”์ธ์“ฐ๋ ˆ๋“œ ์ข…๋ฃŒ") // job.join() ์‹คํ–‰ ๋’ค์— ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒ
}
// ์ฝ”๋ฃจํ‹ด ์Šค์ฝ”ํ”„ ํ™œ์šฉ

fun main(args: Array<String>) {
    println("๋ฉ”์ธ์“ฐ๋ ˆ๋“œ ์‹œ์ž‘")
    var job = CoroutineScope(Dispatchers.Default).launch {
        delay(3000)
        println("์—ฌ๊ธฐ๋Š” ์ฝ”๋ฃจํ‹ด...")
    }
    runBlocking {
        job.join()
    }
    println("๋ฉ”์ธ์“ฐ๋ ˆ๋“œ ์ข…๋ฃŒ")
		job.cancel() // ์ฝ”๋ฃจํ‹ด์Šค์ฝ”ํ”„๋Š” ์ž„์‹œ๋กœ ์‚ฌ์šฉํ•œ ๊ฑฐ๋ผ, ์‚ฌ์šฉ ํ›„ ํ•ด์ œ ํ•ด์•ผ ํ•จ
}
  • ์‹ค์Šตํ™˜๊ฒฝ์—์„œ ๋™๊ธฐ์ ์œผ๋กœ ์ฝ”๋ฃจํ‹ด์˜ ๊ฒฐ๊ณผ๋ฅผ ์กฐํšŒํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด job์˜ join๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉ
  • ์•ˆ๋“œ๋กœ์ด๋“œ์™€ ๋‹ฌ๋ฆฌ ์•ฑ์ด ํ•ญ์ƒ ์ผœ์ ธ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— job์œผ๋กœ ์‹ค์Šต์„ ์ง„ํ–‰

 

 

 

์ฝ”๋ฃจํ‹ด ์‚ฌ์šฉ ์˜ˆ์‹œ

 

	println("๋ฉ”์ธ์“ฐ๋ ˆ๋“œ ์‹œ์ž‘")
    var job = CoroutineScope(Dispatchers.Default).launch {
        var fileDownloadCoroutine = async(Dispatchers.IO) { // async ์ด์šฉ, 10์ดˆ
            delay(10000)
            "ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ ์™„๋ฃŒ"
        }
        var databaseConnectCoroutine = async(Dispatchers.IO) {
            delay(5000)
            "๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์™„๋ฃŒ"  // async ์ด์šฉ, 5์ดˆ
        }
        println("${fileDownloadCoroutine.await()}")
        println("${databaseConnectCoroutine.await()}")
    }
    runBlocking {
        job.join()
    }
    println("๋ฉ”์ธ์“ฐ๋ ˆ๋“œ ์ข…๋ฃŒ") // ๋ฉ”์ธ์“ฐ๋ ˆ๋“œ ์‹œ์ž‘, (10์ดˆ ๋’ค ํ•œ ๋ฒˆ์—) ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ ์™„๋ฃŒ, ์—ฐ๊ฒฐ ์™„๋ฃŒ, ๋ฉ”์ธ์“ฐ๋ ˆ๋“œ ์ข…๋ฃŒ
    job.cancel()
  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฝ”๋ฃจํ‹ด์„ ์œ„์™€ ๊ฐ™์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•จ
  • ์ฝ”๋ฃจํ‹ด์˜ ๊ฒฐ๊ณผ๊ดŽ์„ ๋ฆฌํ„ด ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ
  • ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฆฌํ„ด ๋ฐ›์•„์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—, await๋Š” ์ผ์‹œ์ค‘๋‹จ์ด ๊ฐ€๋Šฅํ•œ ์ฝ”๋ฃจํ‹ด์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅ

 

 


 

์“ฐ๋ ˆ๋“œ์™€ ์ฝ”๋ฃจํ‹ด ๋น„๊ต

 

  • ๋‘˜ ๋‹ค ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ๊ธฐ์ˆ 
  • ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ ์€ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(๋ฌธ๋งฅ ๊ตํ™˜)์ด ์ค‘์š”ํ•œ ๊ฐœ๋… (๋งํฌ)
  • ์ฝ”๋ฃจํ‹ด์€ ์“ฐ๋ ˆ๋“œ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ธฐ์ˆ ์ด ์•„๋‹ˆ๋ฉฐ, ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ๋”์šฑ ์ž˜๊ฐœ ์ชผ๊ฐœ์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ (๊ฐ์ž์˜ ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฆ„)
  • ์ฝ”๋ฃจํ‹ด์€ ์“ฐ๋ ˆ๋“œ๋ณด๋‹ค CPU์ž์›์„ ์ ˆ์•ฝํ•˜๊ธฐ ๋•Œ๋ฌธ์— Light-Weight Thread๋ผ๊ณ ๋„ ๋ถˆ๋ฆผ
  • ๊ตฌ๊ธ€์—์„œ๋Š” ์ฝ”ํ‹€๋ฆฐ์˜ ์ฝ”๋ฃจํ‹ด ์‚ฌ์šฉ์„ ์ ๊ทน ๊ถŒ์žฅ

 

 

 

์“ฐ๋ ˆ๋“œ

  • ์ž‘์—… ํ•˜๋‚˜ํ•˜๋‚˜์˜ ๋‹จ์œ„ : Thread
    • ๊ฐ Thread ๊ฐ€ ๋…๋ฆฝ์ ์ธ Stack ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๊ฐ€์ง
  • ๋™์‹œ์„ฑ ๋ณด์žฅ ์ˆ˜๋‹จ : Context Switching
    • ์šด์˜์ฒด์ œ ์ปค๋„์— ์˜ํ•œ Context Switching ์„ ํ†ตํ•ด ๋™์‹œ์„ฑ์„ ๋ณด์žฅ
    • ๋ธ”๋กœํ‚น (Blocking)
      • Thread A๊ฐ€ Thread B ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘
      • ์ด ๋•Œ, Thread A๋Š” ๋ธ”๋กœํ‚น ์ƒํƒœ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Œ
      • A๋Š” Thread B ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๋•Œ ๊นŒ์ง€ ํ•ด๋‹น ์ž์›์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•จ
  • Thread A๊ฐ€ Task 1์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ Task 2 ์˜ ๊ฒฐ๊ณผ๊ฐ€ ํ•„์š”ํ•˜๋ฉด Thread B๋ฅผ ํ˜ธ์ถœ
  • ์ด๋•Œ Thread A๋Š” ๋ธ”๋กœํ‚น ๋˜๊ณ  Thread B๋กœ ํ”„๋กœ์„ธ์Šค๊ฐ„์— ์Šค์œ„์นญ์ด ์ผ์–ด๋‚˜ Task 2์„ ์ˆ˜ํ–‰
  • Task 2๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด Thead A๋กœ ๋‹ค์‹œ ์Šค์œ„์นญํ•ด์„œ ๊ฒฐ๊ณผ ๊ฐ’์„ Task 1์—๊ฒŒ ๋ฐ˜ํ™˜
  • ์ด๋•Œ Task 3, Task 4๋Š” A, B์ž‘์—…์ด ์ง„ํ–‰๋˜๋Š” ๋„์ค‘์— ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๊ฐ๊ฐ ๋™์‹œ์— ์‹คํ–‰๋จ
  • ์ด๋•Œ ์ปดํ“จํ„ฐ ์šด์˜์ฒด์ œ ์ž…์žฅ์—์„œ๋Š” ๊ฐ Task๋ฅผ ์ชผ๊ฐœ์„œ ์–ผ๋งˆ๋‚˜ ์ˆ˜ํ–‰ํ• ์ง€๊ฐ€ ์ค‘์š”
  • ๊ทธ๋ž˜์„œ ์–ด๋–ค ์“ฐ๋ ˆ๋“œ๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•ด์•ผํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ํ–‰์œ„๋ฅผ ์Šค์ผ€์ฅด๋ง์ด๋ผ๊ณ  ํ•จ
  • ์ด๋Ÿฌํ•œ ํ–‰์œ„๋ฅผ ํ†ตํ•ด ๋™์‹œ์„ฑ์„ ๋ณด์žฅ

 

 

์ฝ”๋ฃจํ‹ด

  • ์ž‘์—… ํ•˜๋‚˜ํ•˜๋‚˜์˜ ๋‹จ์œ„ : Coroutine Object
    • ์—ฌ๋Ÿฌ ์ž‘์—… ๊ฐ๊ฐ์— Object ๋ฅผ ํ• ๋‹น
    • Coroutine Object ๋„ ์—„์—ฐํ•œ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— JVM Heap ์— ์ ์žฌ (์ฝ”ํ‹€๋ฆฐ ๊ธฐ์ค€)
  • ๋™์‹œ์„ฑ ๋ณด์žฅ ์ˆ˜๋‹จ : Programmer Switching (No-Context Switching)
    • ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด Switching ์‹œ์ ์„ ๋งˆ์Œ๋Œ€๋กœ ์ •ํ•จ (OS๋Š” ๊ด€์—ฌํ•˜์ง€ ์•Š์Œ)
    • Suspend (Non-Blocking)
      • Object 1์ด Object 2์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆด ๋•Œ Object 1์˜ ์ƒํƒœ๋Š” Suspend๋กœ ๋ฐ”๋€œ
      • ๊ทธ๋ž˜๋„ Object 1์„ ์ˆ˜ํ–‰ํ•˜๋˜ Thread๋Š” ๊ทธ๋Œ€๋กœ ์œ ํšจ
      • ๊ทธ๋ž˜์„œ Object 2๋„ Object 1๊ณผ ๋™์ผํ•œ Thread์—์„œ ์‹คํ–‰
  • Task 1์„ ์ˆ˜ํ–‰ํ•˜๋‹ค๊ฐ€ Task 2์˜ ์ˆ˜ํ–‰์š”์ฒญ์ด ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •
  • ์‹ ๊ธฐํ•˜๊ฒŒ๋„ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ ์—†์ด ๋™์ผํ•œ Thread A์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ
  • Thread C์ฒ˜๋Ÿผ ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ์—์„œ ์—ฌ๋Ÿฌ Task Object๋“ค์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ
  • ์ด๋Ÿฌํ•œ ํŠน์ง•๋•Œ๋ฌธ์— ์ฝ”๋ฃจํ‹ด์„ Light-Weight Thread๋ผ๊ณ  ๋ถ€๋ฆ„

 

 

 

 

๋ฐ˜์‘ํ˜•
 ๐Ÿ’ฌ C O M M E N T