THREAD_RUNNING, /* Running thread. */
THREAD_READY, /* Not running but ready to run. */
THREAD_BLOCKED, /* Waiting for an event to trigger. */
THREAD_DYING /* About to be destroyed. */
thread_block()
: Running Thread -> Blocked Thread
thread_unblock()
: Blocked Thread -> Ready Thread
thread_yield()
: Running Thread -> Ready Thread
schedule()
: Ready Thraed -> Running Thread
thread_exit()
: Running Thread -> Dying Thread
운영체제에서 다중 프로세스나 다중 스레드 환경에서 실행되는 작업들을 관리하고, CPU나 다른 시스템 리소스를 효율적으로 할당하는 작업으로, 시스템의 성능에 큰 영향을 끼치기에 현대 OS에서 매우 중요한 개념이다. 이는 작업들 간의 실행 순서, 우선순위, 자원 사용 여부등을 결정하는 알고리즘과 방법론을 포함한다.
간단한 스케줄링 정책인 FIFO부터 최단 작업 우선(SJF), 최소 잔여시간 우선(STCF)부터, 타임 슬라이싱이라고도 불리는 라운드 로빈(RR) 방식, 가장 완성형에 가까운 멀티 레벨 피드백 큐(MLFQ)까지.. 알아야 할 점은 각각의 장단점이 존재하기에, 작업의 길이를 미리 알 길이 없는 일반적인 운영체제에서는 만병통치약은 없다는 것! 각각의 스케줄링 방식에 대해 알아두자.
운영체제가 다른 작업으로 제어를 넘기는 과정을 의미하며, 실행하던 프로세스 or 스레드의 상태를 보관하고, 다음 실행될 프로세스나 스레드의 상태를 복원하는 작업을 일컫는다.
다중 프로세서/스레드 환경에서는 필수적인 기능이며, 이외에도 인터럽트 발생 시 이를 처리하는 작업에서도 컨텍스트 스위칭이 이루어진다.
컨텍스트 스위칭 시, 제어를 넘겨주는 프로세스 or 스레드의 실행 상태는 PCB 라고 하는 자료구조에 저장된다. PCB는 레지스터 상태, 스케줄링 정보, 메모리 관련 정보, 입출력 상태 등을 포함한다.
락(Lock), 세마포어(Semaphore), 뮤텍스(Mutex), 모니터(Monitor)는 모두 상호 배제(mutual exclusion)를 구현하기 위한 동기화 기법
보다 일반적인 용어로, 상호 배제를 구현하는 동기화 기법을 가리킨다.
락은 임계 영역에 진입하기 전에 락을 점유하고, 작업을 완료한 후에 잠금을 해제하여 다른 스레드가 접근할 수 있도록 한다.
락은 보통 뮤텍스나 세마포어와 같은 구체적인 동기화 기법의 일반적 용어로 사용되는데에 유의
세마포어는 동시에 접근할 수 있는 자원의 수를 나타내는 정수 변수다.
세마포어 값을 감소시키고, 자원에 접근하는 스레드를 블록하는 P
연산과, 세마포어 값을 증가시키고 블록된 스레드를 깨워 자원에 접근하도록 하는 V
연산으로 구성된다.
뮤텍스는 공유 자원에 대한 접근을 막고 한 번에 하나의 스레드만이 접근할 수 있도록 한다.
뮤텍스는 잠금(Lock) 상태와 해금(Unlock) 두 가지 상태를 가진다.
보통 위의 락(Lock)이라는 용어와 유사하게 사용된다.
모니터는 객체지향적 프로그래밍에서 사용되는 동기화 기법이다.
보다 발전된 락의 개념으로, 상호 배제와 조건 변수를 함께 제공하여 스레드 간의 동기화를 단순화하는 추상적인 개념이다.
세마포어와 뮤텍스와는 달리 공유자원에 접근하기 위한 키 획득과 자원 사용후 해제를 모두 처리한다.
실행 중인 프로그램의 인스턴스로, 메모리에 할당된 독립적인 주소 공간을 가지고 있다.
운영체제로부터 자원을 할당받아 독립적으로 실행된다.
자체적으로 실행 상태, 스케줄링, 메모리, 파일 등의 리소스를 관리한다.
최소한 하나의 스레드를 가지며, 추가적인 스레드를 생성할 수도 있다.
다른 프로세스와 독립적으로 실행되며, 각 프로세스는 자신만의 주소 공간과 자원을 가지기 때문에 서로 영향을 주지 않는다.
프로세스 내에서 실행되는 작업의 단위로, 프로세스의 자원을 공유한다.
하나의 프로세스에는 여러 개의 스레드가 있을 수 있으며, 이들은 동시에 실행될 수 있다.
스레드는 프로세스의 주소 공간을 공유하므로, 같은 프로세스 내의 스레드는 동일한 변수, 자원, 파일 등을 공유한다.
스레드는 프로세스 내에서 스케줄링되며, 각 스레드는 독립적인 실행 경로를 가지고 있다.
여러 스레드는 동시에 실행될 수 있으며, 이로 인해 병렬 처리와 멀티태스킹을 구현할 수 있다.
하나의 스레드에서 발생한 오류나 예외는 다른 스레드에 영향을 줄 수 있으므로, 스레드 간의 동기화와 상호 배제가 중요하다.
Atomic을 이해하려면 원자(Atom)을 떠올리면 좋다. 원자가 물질을 이루는 가장 작은, 그러니까 더 쪼갤 수 없는 단위인 것처럼, Atomic한 연산은 다른 연산들에 의해 중간에 중단 될 수 없는 연산을 의미한다. Atomic은 데이터의 일관성과 동시성 제어를 보장하는 중요한 개념이므로, 꼭 알아두자.