동기화를 통해 여러 프로세스나 쓰레드가 동시에 같은 자원에 접근할 때 발생할 수 있는 오류나 비정상적인 결과를 방지할 수 있습니다.
Synchronization 포스팅에 앞선 선수 지식에 대한 포스팅입니다.
1. 멀티 태스킹 방식
프로세스는 CPU의 자원이 있어야만 일을 수행할 수 있습니다.
멀티 태스킹 환경에서
프로세스1과 프로세스2는 Context Switch를 통해 CPU 자원을 번갈아가며 얻어가면서 각각의 코드 실행과 대기를 반복하게 됩니다.
2. 멀티 프로세서 방식
멀티 프로세서 환경에서
하나의 프로세스에는 하나의 CPU 자원이 할당되게 되어 코드를 동시에 실행하게 됩니다.
3. 멀티 쓰레딩 방식
프로세스는 메모리 내에서 작업하는 하나의 작은 단위인데요
하나의 프로세스 내에서 여러개의 쓰레드(실행 흐름)로 나뉩니다.
이 때 각각의 쓰레드들 또한 CPU 자원이 있어야되기 때문에
하나의 프로세스 안의 각각의 쓰레드들은 CPU를 번갈아가며 얻어가는 방식으로 진행됩니다.
4. 공유 자원 동시 접근 문제
프로세스 상세 과정 | COUNT 변수의 값 |
프로세스1이 count를 메모리에서 Load | 0 |
INC (increase)로 값 증가시킴 | 0 |
Context Switch로 CPU가 프로세스2로 넘어감 | 0 |
프로세스2가 count를 메모리에서 Load | 0 |
DEC (decrease)로 값 감소시킴 | 0 |
프로세스2가 메모리에 STORE | -1 |
Context Switch로 CPU가 프로세스1로 넘어감 | -1 |
프로세스1이 메모리에 STORE | 1 |
최종값 | 1 |
이처럼 공유자원(count)에 여러개의 프로세스가 접근하려할 때
실행결과가 접근이 발생한 실행순서에 의존하는 것을 '경쟁 상태(Race Condition)'라고 합니다.
'경쟁 상태'가 발생할 수 있는 구역을 '임계 구역(Critical Section)'이라고 합니다.
여기서는 count변수에 접근하는 코드가 끝나는 코드가 임계 구역이라고 할 수 있습니다.
5. 멀티 쓰레딩 방식에서의 경쟁 상태
지역변수 저장을 위한 Stack영역은 쓰레드별로 갖지만 프로세스 데이터들은 물리적으로 같은 영역을 참조하게 됩니다.
앞선것과 같이 여러개의 쓰레드들이 공유 데이터에 접근하는 순간 '경쟁 상태'가 발생하게 됩니다.
6. 멀티 태스킹 방식에서의 경쟁 상태
멀티 태스킹 방식에서는 커널 내부 데이터에 접근할 때 '경쟁 상태'가 발생 할 수 있습니다.
예를 들어,
프로세스1이 유저모드로 진행하다가 커널모드로 진입하여 count라는 커널 내부 데이터에 접근하려고 할 때
Context Switch가 일어나서
프로세스2가 CPU 점유권을 얻게 되었습니다. 프로세스2 또한 count라는 커널 내부 데이터에 접근하여 수정하였습니다.
이렇게 '경쟁 상태'가 발생하였습니다.
7. 멀티 프로세서 방식에서의 경쟁 상태
멀티 프로세서 환경에서는 CPU가 두개 이상으로 동시에 실행되지만
실행 속도가 더 빠른 프로세스2가 연산을 마치고 메모리에 저장하게 되면 '경쟁 상태'가 발생합니다.
또한, 프로세스가 공유 메모리 기법(Shared Memory)을 활용하는 경우
물리적으로 같은 메모리 영역을 공유하게 되므로 '경쟁 상태'가 발생하게 됩니다.
다음 포스팅에서는 이러한 '경쟁 상태'를 해결하는 동기화 기법인 Mutex(뮤텍스)와 Shemaphore(세마포어)에 대해서 알아보겠습니다.
2024.09.16 - [Programming/OS[운영체제]] - [OS/운영체제] Synchronization(동기화)
[OS/운영체제] Synchronization(동기화)
2024.09.16 - [Programming/OS[운영체제]] - [OS/운영체제] 공유자원 경쟁상태 (Synchronization 사전 지식) [OS/운영체제] 공유자원 경쟁상태 (Synchronization 사전 지식)동기화를 통해 여러 프로세스나 쓰레드가
tete-all.tistory.com
'Programming > OS[운영체제]' 카테고리의 다른 글
[OS/운영체제] Synchronization(동기화) (1) | 2024.09.16 |
---|