Home 프로세스와 쓰레드
Post
Cancel

프로세스와 쓰레드

프로세스

실행중인 프로그램. 프로그램을 실행하면 OS로부터 실행에 필요한 자원(메모리)을 할당받아 프로세스가 된다.

프로세스 = 데이터,메모리등의 자원 + 쓰레드 쓰레드 = 프로세스의 자원을 이용해 실제로 작업을 수행하는 것

모든 프로세스에는 최소한 하나 이상의 쓰레드가 존재하며 둘 이상의 쓰레드를 가진 프로세스를 멀티쓰레드 프로세스라고 한다.

멀티쓰레딩

현재 대부분의 OS는 멀티태스킹을 지원하기 때문에 여러 개의 프로세스가 동시에 실행될 수 있다.

이와 마찬가지로 멀티쓰레딩은 하나의 프로세스 내에서 여러 쓰레드가 동시에 작업을 수행하는 것이다. CPU의 코어가 한 번에 단 하나의 작업만 수행할 수 있으므로, 실제로 동시에 처리되는 작업의 개수는 코어의 개수와 일치한다.

하지만 처리해야하는 쓰레드의 수는 언제나 코어의 개수보다 훨씬 많다. 각 코어가 아주 짧은 시간동안 여러 작업을 번갈아 가며 수행함으로써 여러 작업들이 모두 동시에 수행되는 것처럼 보이게 한다.

  • 장점:
    1. CPU의 사용률 향상
    2. 자원의 효율적인 사용
    3. 사용자에 대한 응답성 향상
    4. 작업이 분리되어 코드가 간결해짐
  • 단점:
    1. 여러 쓰레드가 같은 프로세스 내에서 자원을 공유하며 작업을 하기 때문에 동기화 문제 발생 가능
    2. deadlock 문제

싱글쓰레드와 멀티쓰레드

하나의 쓰레드로 두 개의 작업을 수행하는 경우와 두 개의 쓰레드로 두 개의 작업을 수행하는 경우 작업 수행 시간은 오히려 후자가 더 오래 걸린다. 쓰레드간의 스위칭에 시간이 걸리기 때문이다.

물론 동시에 실행하는 것 처럼 보이는 장점은 있다. 따라서 싱글코어에서 단순히 CPU만을 사용하는 계산작업이라면 오히려 멀티 쓰레드보다 싱글 쓰레드로 프로그래밍하는 것이 더 효율적이다.

쓰레드의 동기화

싱글쓰레드 프로세스의 경우 프로세스 내에서 단 하나의 쓰레드만 작업하기 때문에 프로세스의 자원을 가지고 작업하는데 별 문제가 없다.

하지만 멀티쓰레드 프로세스의 경우 여러 쓰레드가 같은 프로세스 내의 자원을 공유해서 작업하기 때문에 서로의 작업에 영향을 줄 수 밖에 없다.

쓰레드A가 작업하던 도중 다른 쓰레드B에게 제어권이 넘어갔을 때, 쓰레드 A가 작업하던 공유데이터를 쓰레드 B가 임의로 변경했다면 다시 쓰레드 A가 그 데이터로 작업을 완료했을 때 원하던 결과가 나오지 않을 수 있다.

이러한 일이 발생하는 것을 방지하기 위해 한 쓰레드가 특정 작업을 마칠때까지 다른 쓰레드에 의해 방해받지 않도록 하는 것이 필요한데 이 때 필요한 개념이 임계영역(Critical section), 락(lock) 이다.

공유 데이터를 사용하는 코드 영역을 임계영역으로 지정해놓고, 공유 데이터가 가지고 있는 lock을 획득한 단 하나의 쓰레드만 영역 내의 코드를 수행할 수 있게 한다. 그리고 해당 쓰레드가 임계 영역 내의 모든 코드를 수행하고 벗어나서 lock을 반납해야만 다른 쓰레드가 반납된 lock을 획득하여 임계영역의 코드를 수행할 수 있게 된다.

이처럼 한 쓰레드가 진행중인 작업을 다른 쓰레드가 간섭하지 못하도록 막는 것을 쓰레드의 동기화(synchronization) 라고 한다.

교착상태 (deadlock)

둘 이상의 프로세스가 서로 남이 가진 자원을 요구하면서 양쪽 모두 작업을 수행할 수 없이 대기상태로 놓이는 상태를 뜻한다.

A라는 task가 대기상태에 있을 때 B라는 task도 A의 종료후에 실행을 종료시키는 상태에 있으면 모두 대기상태가 되어 언제까지나 실행이 시작되지 않아 deadlock 상태에 빠지게 된다.

This post is licensed under CC BY 4.0 by the author.