공부/OS

크리티컬 섹션(Critical Section)이란?

셩잇님 2023. 6. 10. 18:02
반응형

 

 

1. 크리티컬 섹션이란?

크리티컬 섹션은 공유 데이터에 액세스하는 코드 섹션입니다. 컴퓨터 프로그래밍에서 크리티컬 섹션은 원자 단위로 실행되어야 하는 코드 섹션 또는 프로그램의 일부를 의미합니다. 또한 두 개 이상의 스레드가 동시에 동일한 공유 데이터에 액세스하려고 하면 경쟁 조건이 발생할 수 있습니다. 그러므로 다른 스레드나 프로세스의 동시 실행으로 인해 중단되지 않아야 합니다. 크리티컬 섹션은 한 번에 하나의 스레드 또는 프로세스만 공유 리소스나 변수에 액세스하고 수정할 수 있도록 하여 경합 상태를 방지하고 데이터 무결성을 유지합니다. 만약 이를 유지하지 않을 경우 오류 및 예기치 않은 동작이 발생할 수 있습니다.

 

크리티컬 섹션은 한 번에 하나의 스레드만 실행하도록 설계된 코드 섹션입니다. 이렇게 하면 공유 데이터에 액세스할 때 경쟁 조건이 발생하지 않습니다. 뮤텍스, 세마포어, 배리어를 사용하는 등 여러 가지 방법으로 중요 섹션을 구현할 수 있습니다.

 

2. 크리티컬 섹션의 특징
공유 리소스: 중요 섹션은 여러 스레드 또는 프로세스에서 동시에 액세스하고 수정하는 공유 데이터 구조, 변수, 파일 또는 I/O 장치와 같은 공유 리소스를 보호하는 데 사용됩니다.

상호 제외: 중요 섹션의 주요 목적은 상호 제외를 제공하여 주어진 시간에 하나의 스레드만 중요 섹션을 실행할 수 있도록 하는 것입니다. 이렇게 하면 공유 리소스에 대한 동시 액세스로 인해 일관되지 않거나 잘못된 동작이 발생하는 것을 방지할 수 있습니다.

동기화 메커니즘: 중요 섹션은 일반적으로 잠금, 세마포어 또는 뮤텍스와 같은 동기화 메커니즘을 사용하여 구현됩니다. 이러한 메커니즘은 하나의 스레드만 중요 섹션과 관련된 잠금 또는 세마포를 획득할 수 있도록 보장하여 액세스를 효과적으로 직렬화합니다.

진입점 및 출구점: 중요 섹션에는 진입 지점과 종료 지점이 있습니다. 공유 리소스에 액세스해야 하는 스레드 또는 프로세스는 먼저 관련 잠금 또는 세마포를 획득하여 중요 섹션에 진입해야 합니다. 일단 들어가면 공유 리소스에 대한 작업을 안전하게 수행할 수 있습니다. 작업이 완료되면 잠금 또는 세마포어를 해제하여 중요 섹션을 종료하고 다른 스레드가 진입할 수 있도록 합니다.

데이터 일관성: 중요 섹션은 공유 리소스에 대한 동시 액세스를 제한함으로써 데이터 일관성을 유지하고 경쟁 조건을 방지하는 데 도움이 됩니다. 공유 데이터에 대한 작업이 직렬화되도록 하여 데이터 손상이나 불일치를 초래할 수 있는 충돌을 방지합니다.

성능 영향: 중요 섹션은 동기화 및 데이터 무결성을 제공하지만, 성능 오버헤드를 유발할 수 있습니다. 여러 스레드가 중요 섹션에 액세스하기 위해 경합하는 경우 일부 스레드가 대기해야 할 수 있으며, 이로 인해 병목 현상이 발생하고 병렬 처리가 저하될 수 있습니다. 전반적인 성능을 개선하기 위해 중요한 섹션의 지속 시간과 빈도를 최소화하려면 신중한 설계와 최적화가 필요합니다.

교착 상태 및 리브락: 중요 섹션을 부적절하게 사용하거나 잘못 구현하면 교착 상태 또는 리브락과 같은 문제가 발생할 수 있습니다. 교착 상태는 두 개 이상의 스레드가 서로가 보유한 리소스를 무기한 대기할 때 발생하며, 그 결과 프로그램이 정지됩니다. 교착 상태는 스레드가 진전 없이 서로의 동작에 계속 응답하느라 바쁠 때 발생합니다. 이러한 상황을 피하려면 잠금 및 동기화 전략을 신중하게 고려해야 합니다.

 

3. 크리티컬 섹션의 장점
경합 조건 방지: 중요 섹션은 한 번에 하나의 스레드만 공유 데이터에 액세스할 수 있도록 하여 경쟁 조건을 방지합니다. 이렇게 하면 공유 데이터가 항상 일관된 상태를 유지할 수 있습니다.


성능 향상: 중요 섹션은 공유 데이터에 액세스하는 횟수를 줄임으로써 성능을 향상시킬 수 있습니다. 한 번에 하나의 스레드만 공유 데이터에 액세스하면 되므로 데이터에 대한 경합이 줄어들기 때문입니다.


코드 간소화: 중요 섹션은 멀티스레드 프로그램의 동작을 더 쉽게 추론할 수 있도록 하여 코드를 간소화할 수 있습니다. 중요 섹션은 공유 데이터에 액세스하는 코드 섹션을 명확하게 하여 경쟁 조건을 방지하는 데 도움이 될 수 있기 때문입니다.

 

4. 크리티컬 섹션의 단점
병목 현상이 발생할 수 있습니다: 중요 섹션은 멀티스레드 프로그램에서 병목 현상을 일으킬 수 있습니다. 한 번에 하나의 스레드만 공유 데이터에 액세스할 수 있기 때문에 다른 스레드가 진행하지 못할 수 있기 때문입니다.


사용하기 어려울 수 있습니다: 중요한 섹션을 올바르게 사용하기 어려울 수 있습니다. 중요한 섹션에서는 한 번에 하나의 스레드만 실행되도록 하는 것이 중요하기 때문입니다. 여러 스레드가 동시에 중요한 섹션에 들어가면 경쟁 조건이 발생할 수 있습니다.


비용이 많이 들 수 있습니다: 중요 섹션은 사용 비용이 많이 들 수 있습니다. 운영 체제에서 어떤 스레드가 중요 섹션에 있는지 추적하고 다른 스레드가 중요 섹션에 들어가지 못하도록 방지해야 하기 때문입니다.

 

5. 결론

크리티컬 섹션은 스레드 안전과 데이터 무결성을 보장하기 위해 동시 프로그래밍에서 필수적입니다. 중요 섹션은 동기화 메커니즘으로 공유 리소스를 보호함으로써 조정된 액세스를 허용하여 경쟁 조건을 방지하고 일관된 프로그램 동작을 유지합니다. 하지만 병목 현상과 복잡성을 유발할 수 있으므로 신중하게 사용해야 합니다.

 

 

 

반응형