쓰레드
프로세스 내에서 실제로 작업을 수행하는 주체를 의미합니다. 모든 프로세스는 한 개 이상의 쓰레드가 존재하며, 두 개 이상의 쓰레드를 가지는 프로세스를 멀티스레드 프로세스라고 합니다.
멀티 쓰레드
쓰레드들이 서로 스위칭 하면서 작업을 처리함으로써 CPU 사용률을 향상시켜주고, 자원을 보다 효율적으로 사용할 수 있습니다. 또한 사용자에 대한 응답성이 높고, 작업이 분리되어 코드가 간결해집니다. 하지만 여러 쓰레드가 같은 프로세스 내에서 자원을 공유하면서 작업하기 때문에 동기화, 교착상태 같은 문제를 조심해야 합니다.
쓰레드 구현
[Java] Thread
Thread 하드디스크에 있는 '프로그램'이 실행되어 메모리에 올라가면 '프로세스'가 됩니다. CPU는 프로세스를 처리합니다. 프로세스를 처리할 때 CPU의 실행 단위는 쓰레드입니다. 즉 쓰레
lakelight.tistory.com
쓰레드 동기화
하나의 코드블록 또는 메소드를 한 순간에 하나의 쓰레드만이 이용하도록 보장하는 것으로 임계 영역에서 스레드들이 순서를 갖춰 자원을 사용하게 하는 것을 동기화라고 합니다.
쓰레드 동기화를 하지 않았을 때의 문제점과 해결 방법
[Java] Thread Synchronization
Thread Synchronization 두 개의 쓰레드가 동일한 객체에 접근을 하려고 할 때 공유 자원을 lock하여 다른 쓰레드가 접근하지 못하게 합니다. 그래서 두 개의 쓰레드가 공유자원에 동시에 접근하여 발생
lakelight.tistory.com
임계 구역
멀티 쓰레드에 의해 공유자원이 서로 참조될 수 있는 코드의 범위를 말합니다. 즉, 한 쓰레드가 작업중 다른 쓰레드에 의해 간섭을 받지 않는 영역을 말합니다. 그리고 이 영역을 간섭하지 못하도록 하는 것을 동기화라고 합니다. 그리고 임계 구역에 대한 접근을 막기위해 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 |