스레드란?
스레드는 프로세스 작업의 가장 작은 단위이다. 프로세스는 여러 개의 스레드를 가질 수 있다.
코드, 데이터, 스택, 힙을 모두 생성하는 프로세스와는 달리 스레드는 스택을 제외한 영역은 공유합니다.
멀티스레딩
멀티스레딩 프로세스 내 작업을 여러 개의 스레드로 처리하는 기법을 말한다. 하나의 프로그램에 동시에 여러 일을 수행할 수 있도록 해주는 것이다.
멀티스레딩을 사용하는 이유
프로세스로 동시에 처리하던 일을 멀티스레드로 처리할 경우 메모리 공간과 시스템 자원을 줄일 수 있다.
프로세스의 생성보다 쓰레드의 생성이 더욱 시간과 자원이 효율적으로 소비된다. 또한 쓰레드끼리는 스택을 제외한 영역을 공유하기 때문에 컨텍스트 스위칭이 프로세스의 경우보다 빠르다. 심지어 쓰레드는 프로세스와 달리 캐시클리어를 할 필요가 없기 때문에 시스템 처리량이 향상되며 자원의 소모가 줄어들어 프로그램의 응답 시간도 단축된다.
멀티스레딩 장점
- 응답성
어떤 스레드가 중단되거나 긴 작업을 수행하더라도 실행 중인 다른 스레드가 프로그램의 작업을 수행할 수 있다. 이는 사용자에 대한 응답성이 증가한다. - 경제성
스레드끼리는 서로 자원들과 메모리를 공유하기 때문에 시스템 자원과 메모리 공간의 소모가 줄어든다. 스레드 간 통신이 필요한 경우에 쉽게 데이터를 주고 받을 수 있으며 context switching은 캐시 메모리를 비울 필요가 없기 때문에 더 빠르다. - 멀티프로세서 활용
다중 CPU 구조에서는 각각의 스레드가 다른 프로세스에서 병렬로 수행 될 수 있어 병렬성이 증가한다.
공유 자원과 임계 영역
공유 자원이란?
시스템 안에서 프로세스나 스레드가 함께 접근할 수 있는 자원이나 변수 등을 의미한다. 경쟁 상태가 발생할 수 있다.
*경쟁 상태: 두 개 이상의 프로세스나 스레드가 동시에 읽거나 쓰는 상태를 말한다. 동시에 접근 시 순서나 타이밍에 따라서 결과값에 영향을 줄 수 있다.
임계 영역이란?
둘 이상의 프로세스나 스레드가 공유 자원에 접근할 때 순서 등의 이유로 결과가 달라질 수 잇는 코드 영역을 말한다. 이를 해결하기 위한 방법은 뮤텍스, 세마포어, 모니터 세 가지가 있다.
세 가지의 방법의 토대가 되는 매커니즘은 잠금(lock)이다. 잠금은 공유 자원을 하나의 프로세스나 스레드가 독점해서 사용할 수 있도록 하는 것이다. 사용 중일 때는 잠가서 다른 접근을 제한하고 사용이 끝나면 잠금을 풀어서 접근 제한을 해제한다.
세 가지 방법은 모두 상호 배제, 한정 대기, 융통성이란 조건을 만족한다.
- 상호 배제: 한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없다.
- 한정 대기: 특정 프로세스가 영원히 임계 영역에 들어가지 못하면 안 된다.
- 융통성: 한 프로세스가 다른 프로세스의 일을 방해해선 안 된다.
뮤텍스 (mutex)
뮤텍스는 lock()을 통해 잠그고 unlock()을 통해 잠금 해제하는 객체이다. 잠금이 설정되면 다른 프로세스나 스레드는 임계 영역에 접근할 수 없으며 잠금 해제되면 그와 반대이다. 뮤텍스는 잠금과 잠금 해제라는 상태만을 가진다.
세마포어 (semaphore)
세마포어는 일반화된 뮤텍스이다. 간단한 정수 값과 두 가지 함수 wait() 및 signal()로 공유 자원에 대한 접근 처리한다.
- wait(): 자신의 차례가 올 때까지 기다리는 함수
- signal(): 다음 프로세스로 순서를 넘겨주는 함수
프로세스나 스레드가 공유자원에 접근하면 세마포어가 wait() 작업을 수행하고 프로세스나 스레드가 잠금 해제를 하면 signal() 작업을 수행한다.
모니터
모니터는 둘 이상의 프로세스나 스레드가 공유 자원에 안전하게 접근 할수 있도록 공유 자원을 숨기고 해당 자원에 대한 인터페이스만 제공한다.
모니터는 큐 자료구조를 가진 모니터큐를 통해 공유 자원에 대한 작업들을 순차적으로 처리한다.
모니터는 세마포어보다 구현하기 쉬우며 세마포어와 달리 상호 배제를 명시적으로 구현해야할 필요가 없다.
교착 상태 (Deadlock)
두 개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태를 말한다.
예를 들어 프로세스 A가 프로세스 B의 자원을 요청할 때 프로세스 B도 프로세스 A의 자원을 요청하고 있는 것이다. 이에 대한 원인과 해결 방법은 다음과 같다.
교착 상태의 원인
교착상태는 시스템에서 다음 네 가지 조건을 만족할 때 발생한다. 이 중 1, 2, 3번 조건만 만족해도 교착 상태가 발생할 수 있다.
- 상호 배제
한 프로세스가 자원을 독점하고 있으며 다른 프로세스들은 접근이 불가능하다. - 점유 대기
특정 프로세스가 점유한 자원을 다른 프로세스가 요청한 상태 - 비선점
다른 프로세스가 점유하고 있는 자원을 강제로 가져올 수 없다. - 환형 대기
프로세스가 서로의 자원을 요구하는 상황
교착 상태 해결 방법
- 자원을 할당할 때 애초에 조건이 성립되지 않도록 한다.
- 교착 상태 가능성이 없을 때만 자원을 할당한다. 자원 할당 가능여부는 '은행원 알고리즘'을 사용한다.
- 교착 상태가 발생하면 사이클이 있는지 확인하고 관련된 프로세스를 지운다.
- 교착 상태가 발생하면 작업을 종료한다. 교착 상태는 매우 드물게 일어나기 때문에 이를 처리하는 비용이 더 크기 때문에 현대 운영체제는 이 방법을 채택했다.
*은행원 알고리즘: 총 자원의 양과 현재 할당한 자원의 양을 기준으로 '안정' 또는 '불안정' 상태로 나누고 안정 상태로 가도록 자원을 할당하는 알고리즘