[swift] 스레드의 동작 상태(ready, running, blocked 등)

프로그래밍에서 스레드(Thread)는 동시에 실행되는 프로세스의 작은 단위이며, 여러 스레드가 동시에 실행되면서 각각 동작 상태를 가집니다. 여기서는 스레드의 동작 상태에 대해 알아보겠습니다.

1. 준비(Ready) 상태

스레드가 생성되면 메모리에 필요한 자료구조가 할당되고, 실행 가능한 상태인 준비(Ready) 상태로 들어갑니다. 준비 상태의 스레드는 실행을 위해 대기하고 있는 상태를 의미합니다. 스케줄링 알고리즘에 의해 실행할 스레드가 선택되면 준비 상태의 스레드는 실행 상태로 전환됩니다.

2. 실행(Running) 상태

준비 상태의 스레드가 스케줄링 알고리즘에 의해 선택되면 실행(Running) 상태로 전환됩니다. 실행 상태의 스레드는 현재 CPU를 점유하고 있는 상태이며, 실제로 코드를 실행하고 작업을 수행합니다.

3. 차단(Blocked) 상태

스레드가 기다리는 동작이 끝나지 않아 더 이상 실행할 수 없는 상태를 차단(Blocked) 상태라고 합니다. 대표적인 예로는 특정 자원에 대한 락을 획득하기 위해 대기하는 경우입니다. 차단 상태의 스레드는 원하는 조건이 충족되면 다시 준비 상태로 전환됩니다.

4. 종료(Exit) 상태

스레드의 실행이 완료되거나 강제로 종료되면 종료(Exit) 상태로 전환됩니다. 종료 상태의 스레드는 더 이상 실행되지 않으며 제거됩니다.

다음은 Swift 언어를 사용하여 스레드의 동작 상태에 따라 코드를 작성한 예시입니다.

import Foundation

func task1() {
    print("Task 1 executed")
}

func task2() {
    print("Task 2 executed")
}

func main() {
    let thread1 = Thread(target: self, selector: #selector(task1), object: nil)
    let thread2 = Thread(target: self, selector: #selector(task2), object: nil)

    thread1.start() // 스레드 1이 준비 상태로 전환됨
    thread2.start() // 스레드 2가 준비 상태로 전환됨

    // 스레드의 동작 상태 확인
    print("Thread 1 state:", thread1.isExecuting) // 실행 상태일 경우 true 출력
    print("Thread 2 state:", thread2.isExecuting) // 실행 상태일 경우 true 출력
}

main()

위의 예시 코드에서는 task1()task2()라는 각각의 작업을 수행하는 두 개의 스레드를 생성하고 실행합니다. 스레드가 준비 상태로 전환되면 thread.isExecuting 속성을 통해 실행 상태인지 확인할 수 있습니다.

스레드의 동작 상태를 이해하는 것은 다중 스레드 프로그래밍의 중요한 개념입니다. 프로그램의 실행 순서나 경합 조건 등을 고려하여 스레드의 동작 상태를 적절히 관리해야 합니다.

참고 자료