쓰레드
프로세스 내에서 실제로 작업을 수행하는 주체를 의미합니다. 모든 프로세스는 한 개 이상의 쓰레드가 존재하며, 두 개 이상의 쓰레드를 가지는 프로세스를 멀티스레드 프로세스라고 합니다.
멀티 쓰레드
쓰레드들이 서로 스위칭 하면서 작업을 처리함으로써 CPU 사용률을 향상시켜주고, 자원을 보다 효율적으로 사용할 수 있습니다. 또한 사용자에 대한 응답성이 높고, 작업이 분리되어 코드가 간결해집니다. 하지만 여러 쓰레드가 같은 프로세스 내에서 자원을 공유하면서 작업하기 때문에 동기화, 교착상태 같은 문제를 조심해야 합니다.
쓰레드 구현
쓰레드 동기화
하나의 코드블록 또는 메소드를 한 순간에 하나의 쓰레드만이 이용하도록 보장하는 것으로 임계 영역에서 스레드들이 순서를 갖춰 자원을 사용하게 하는 것을 동기화라고 합니다.
쓰레드 동기화를 하지 않았을 때의 문제점과 해결 방법
임계 구역
멀티 쓰레드에 의해 공유자원이 서로 참조될 수 있는 코드의 범위를 말합니다. 즉, 한 쓰레드가 작업중 다른 쓰레드에 의해 간섭을 받지 않는 영역을 말합니다. 그리고 이 영역을 간섭하지 못하도록 하는 것을 동기화라고 합니다. 그리고 임계 구역에 대한 접근을 막기위해 Locking 매커니즘이 필요합니다.
임계 구역 문제 해결 방법
- 상호배제 (Mutual Exclusion)
오류가 발생하지 않기 위해 데이터에 대한 업데이트는 한 순간에 오직 한 쓰레드만이 진행할 수 있다는 의미입니다. - 진행 (Progress)
두 쓰레드 중 누가 먼저 작업을 수행할 것인지에 대한 결정이 유한 시간 내에 일어나야 한다는 의미입니다. - 유한대기 (Bounded Waiting)
쓰레드가 임계 구역에 유한 시간 내에 접근을 해야한다는 의미입니다.
세마포어
임계 구역에 여러 쓰레드가 들어갈 수 있습니다. counter를 두어서 동시에 리소스에 접근할 수 있는 허용 가능한 쓰레드 수를 제어합니다. 동작으로는 정수 값을 감소시키는 acquire() , 정수 값을 증가시키는 release() 가 있습니다.
정수는 초기에 1로 되어있고, 쓰레드가 들어오면 acquire()를 호출해서 정수 값을 감소시킵니다. 그럼 정수 값은 0이 됩니다. 정수 값이 0인 쓰레드는 임계 구역에서 작업을 수행하고 있음을 의미합니다. 그리고 쓰레드가 하나 더 임계구역에 접근하려고 하면 acquire()을 호출해서 세마포어에 들어오는 쓰레드의 정수 값이 -1이 됩니다. 정수 값이 0보다 작은 쓰레드는 대기 시킵니다. 그리고 처리되고 있던 0번 쓰레드가 작업이 끝나면 release()를 호출하면 다른 쓰레드들의 정수값을 모두 1증가시킵니다. 그러면 -1 이었던 쓰레드가 0이되고 그 쓰레드가 임계구역에 들어가서 작업을 수행하게 됩니다.
이런 식으로 쓰레드들이 임계구역을 사용할 수 있도록 합니다.
결론
멀티쓰레드가 어떻게 동작하는지 알아보았습니다.
멀티쓰레드를 사용할 때 동기화 문제가 생길 수 있고 이를 해결하기 위해 어떻게 해야하는지,
임계 구역이 무엇인지, 세마포어는 무엇인지 어떻게 동작하는지 알아보았습니다.
[참고]
2. 쓰레드의 개념
3. 쓰레드 동기화 문제
4. 세마포어
'Backend > OS' 카테고리의 다른 글
[OS] Memory Management (2) - 메모리 관리 방법 (0) | 2022.08.16 |
---|---|
[OS] Memory Management (1) - 메모리 관리 개념 (4) | 2022.08.09 |
[OS] Process Management (2) _ CPU 스케줄링 (0) | 2022.07.27 |
[OS] Process Management (1) _ 프로세스, 멀티프로그래밍 (0) | 2022.07.26 |
[OS] How OSs work in General (0) | 2022.07.22 |