쓰레드

황승현·2023년 12월 7일
0

코틀린 강의 정리

목록 보기
35/36
post-thumbnail

개요

로직을 동시에 실행할 수 있도록 하는 개념

프로그램은 하나의 메인 쓰레드(실행흐름)가 존재
하나의 메인 쓰레드는 —→ fun main() ←— 메인함수를 의미

기존 코드는 메인 쓰레드 내에서 순차적으로 실행됨(sync)

하지만 별도의 자식 쓰레드를 생성하면 동시에 로직을 실행하도록 바꿀 수 있음

코틀린은 thread 키워드로 쓰레드를 생성 가능

프로세스(Process)

컴퓨터에서 실행중인 프로그램

메모리에 올라가서 실행중인 프로그램을 의미한다.

프로세스는 여러 개의 쓰레드로 구성되어 있다.

쓰레드(Thread)

프로세스 내에서 실행되는 여러 흐름의 단위(작업 하나하나의 단위)

- 각 Thread 가 독립적인 **Stack 메모리 영역을 가**

프로세스 내부에 존재하는 더 작은 작업의 단위 (최소 1개의 메인 쓰레드는 반드시 존재)

각 쓰레드는 생성되서 어떤 작업을 수행할 때 독립된 Stack 메모리 영역을 가진다.
다시 말해, 쓰레드를 한 개 생성하면 스택(STACK)메모리의 일정 영역을 생성한 쓰레드가 차지한다는 말이다.

Context switching

운영체제 커널(OS kernel)에 의한 Context Switching을 통해 동시성을 보장

Blocking

다른 쓰레드가 끝날 때까지 기다리는 상태

  • 블로킹 (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작업이 진행되는 도중에 멈추지 않고 각각 동시에 실행

스케줄링 (Scheduling)

어떤 쓰레드를 먼저 실행해야할지 결정하는행위

쓰레드 사용 예시 (경주)

두 개의 쓰레드는 동시에 작업을 수행함

하나의 CPU 자원을 두고 경쟁한다.

import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlin.concurrent.thread

fun main() {
    thread(start = true) { //첫번째 쓰레드 생성
        for(i in 1..10) { //1에서 10까지
            println("Thread1: 현재 숫자는 ${i}") //현재 숫자 출력
            runBlocking { // 괄호 안의 내용이 끝날 때까지 기다리겠다.
                launch {
                    delay(1000) //1초 동안 기다림
                }
            }
        }
    }

    thread(start = true) { //두번째 쓰레드 생성
        for(i in 50..60) { //50에서 60까지
            println("Thread2: 현재 숫자는 ${i}") //현재 숫자 출력
            runBlocking { // 괄호 안의 내용이 끝날 때까지 기다리겠다.
                launch {
                    delay(1000)
                }
            }
        }
    }
}

참고자료

https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

0개의 댓글