[ Critical ]섹션

Critical section

동시 프로그래밍에서는 공유 리소스에 대한 동시 액세스가 예기치 않거나 잘못된 동작을 일으킬 수 있으므로 공유 리소스에 액세스하는 프로그램의 일부를 동시 액세스를 방지하는 방식으로 보호해야 합니다.이를 위한 한 가지 방법은 크리티컬 섹션 또는 크리티컬 영역이라고 합니다.이 보호된 섹션은 한 번에 여러 프로세스 또는 스레드로 입력할 수 없습니다.다른 섹션은 첫 번째 프로세스가 크리티컬섹션을 벗어날 때까지 일시 정지됩니다.일반적으로 중요한 섹션은 데이터 구조, 페리페럴 디바이스, 네트워크 연결 등의 공유 리소스에 액세스합니다.이 [1]리소스는 여러 동시 액세스의 컨텍스트에서 올바르게 동작하지 않습니다.

중요한 섹션의 필요성

다른 코드 또는 프로세스는 읽기 또는 쓰기가 필요한 동일한 변수 또는 다른 리소스로 구성될 수 있지만, 그 결과는 작업이 수행되는 순서에 따라 달라집니다.예를 들어 변수가x프로세스 A에 의해 읽혀지고 프로세스 B는 같은 변수에 써야 합니다.x동시에 프로세스 A는 이전 값 또는 새로운 값 중 하나를 얻을 수 있습니다.x.

중요 섹션의 필요성을 나타내는 흐름 그래프

프로세스 A:

// 프로세스 A . . b = x + 5; // 명령이 시간 = Tx에 실행됨 . 

프로세스 B:

// 프로세스 B . . x = 3 + z; // 명령이 시간 = Tx에 실행됨 . 

세밀한 잠금 메커니즘이 필요하지 않은 경우에는 중요한 부분이 중요합니다.위의 경우 A가 갱신된 값을 읽을 필요가 있는 경우x프로세스 A와 프로세스B를 동시에 실행하면 필요한 결과가 나오지 않을 수 있습니다.이를 방지하기 위해 변수x중요한 섹션에 의해 보호됩니다.먼저 B는 섹션에 대한 접근권을 가집니다.B가 값 쓰기를 마치면 A는 중요한 섹션과 변수에 액세스할 수 있습니다.x읽을 수 있습니다.

크리티컬 섹션 내외에서 수정되는 변수를 신중하게 제어함으로써 공유 변수에 대한 동시 액세스를 방지할 수 있습니다.크리티컬 섹션은 일반적으로 멀티 스레드 프로그램이 개별 스레드 없이 관련 변수를 여러 개 업데이트해야 하는 경우 해당 데이터에 모순되는 변경을 가할 때 사용됩니다.관련된 상황에서는 프린터 등의 공유 리소스에 한 번에 한 프로세스에서만 액세스할 수 있도록 하기 위해 중요 섹션을 사용할 수 있습니다.

중요 섹션의 구현

중요한 섹션의 실장은 운영 체제에 따라 다릅니다.

크리티컬 섹션은 보통 한정된 [2]시간 내에 종료되며 스레드, 태스크 또는 프로세스는 입력될 때까지 일정한 시간 동안 대기해야 합니다(바운딩 대기).중요한 섹션을 독점적으로 사용하려면 프로그램 시작 및 종료 시 동기화 메커니즘이 필요합니다.

Critical 섹션은 상호 액세스 제외가 필요한 프로그램의 일부입니다.

여러 스레드의 잠금 및 중요 섹션

그림과 [3]같이 상호 제외(뮤텍스)의 경우 공유 리소스에 액세스해야 할 때 하나의 스레드가 잠금 기술을 사용하여 중요한 섹션을 차단하고 다른 스레드는 해당 섹션에 들어갈 차례가 올 때까지 기다려야 합니다.이렇게 하면 두 개 이상의 스레드가 동일한 메모리 공간을 공유하고 공통 [2]리소스에 액세스하려고 할 때 충돌이 방지됩니다.

중요 섹션을 구현하기 위한 의사 코드

크리티컬 섹션 내의 프로세서 제어 변경을 방지하는 가장 간단한 방법은 세마포 구현입니다.유니프로세서 시스템에서는 크리티컬섹션 진입 시 인터럽트를 디세블로 하여 섹션 내에서 컨텍스트스위치를 일으킬 수 있는 시스템콜을 회피하고 종료 시 인터럽트를 이전 상태로 되돌리면 됩니다.이 실장에서는 시스템 내의 임의의 중요한 섹션에 들어가는 실행 스레드가 있으면 인터럽트를 포함한 다른 스레드에는 CPU 상의 처리시간이 부여되지 않습니다.따라서 원래 스레드가 크리티컬섹션을 벗어날 때까지 다른 크리티컬섹션이나 코드를 입력할 수 없습니다.

세마포어를 사용하면 이 무차별적인 접근 방식을 개선할 수 있습니다.중요한 섹션을 입력하려면 스레드가 세마포를 가져와야 합니다.세마포는 섹션을 종료할 때 해제됩니다.다른 스레드는 원래 스레드와 동시에 크리티컬 섹션에 들어갈 수 없지만 CPU를 제어하고 다른 세마포어로 보호되는 다른 크리티컬 섹션을 포함하여 다른 코드를 실행할 수 있습니다.세마포어 잠금에는 단일 프로세스에 의해 무제한 시간 동안 잠금이 취득되어 크리티컬 섹션에 의해 보호되는 공유 리소스를 사용해야 하는 다른 프로세스가 지연되는 교착 상태를 방지하기 위한 시간 제한도 있습니다.

중요 섹션의 사용

커널 수준의 중요한 섹션

일반적으로 중요한 섹션은 프로세서 간의 스레드 및 프로세스 이행과 인터럽트 및 기타 프로세스 및 스레드에 의한 프로세스 및 스레드의 프리엠프션을 방지합니다.

중요한 섹션에서는 종종 네스트가 허용됩니다.네스트 기능을 사용하면 여러 개의 중요한 섹션을 적은 비용으로 출입할 수 있습니다.

스케줄러가 크리티컬섹션에서 현재 프로세스 또는 스레드를 중단하면 스케줄러는 현재 실행 중인 프로세스 또는 스레드가 크리티컬섹션의 완료까지 실행되도록 허용하거나 프로세스 또는 스레드를 다른 완전한 퀀텀으로 스케줄링합니다.스케줄러는 프로세스 또는 스레드를 다른 프로세서로 이행하지 않으며 현재 프로세스 또는 스레드가 중요한 섹션에 있는 동안 다른 프로세스 또는 스레드를 실행하도록 스케줄링하지 않습니다.

마찬가지로 크리티컬 구간에서 인터럽트가 발생하면 향후 처리를 위해 인터럽트 정보를 기록하고 크리티컬 [4]구간에서 프로세스 또는 스레드로 실행한다.크리티컬 섹션이 종료되고 스케줄링된 퀀텀이 완료되면 보류 중인 인터럽트가 실행됩니다.스케줄링 퀀텀의 개념은 "라운드 로빈" 및 유사한 스케줄링 정책에 적용됩니다.

중요한 섹션은 입력된 프로세서에서만 실행할 수 있으므로 실행 중인 프로세서 내에서만 동기화가 필요합니다.이를 통해 중요한 섹션의 출입을 거의 비용 없이 수행할 수 있습니다.프로세서간 동기화는 필요 없습니다.명령 스트림[5] 동기화만 필요합니다.대부분의 프로세서는 현재 실행 상태를 중단하는 간단한 동작으로 필요한 양의 동기화를 제공합니다.이것에 의해, 대부분의 경우, 중요한 섹션은 입력된 중요한 섹션의 프로세서별 카운트에 지나지 않습니다.

성능 향상에는 모든 중요한 섹션의 종료 시 보류 중인 인터럽트를 실행하고 모든 중요한 섹션의 종료 시 스케줄러를 실행할 수 있는 기능이 포함됩니다.또한 보류 중인 인터럽트를 다른 프로세서로 전송하여 실행할 수 있다.

중요 섹션을 장기간 지속되는 잠금 프리미티브로 사용하지 마십시오.중요한 섹션은 하드웨어 및 스케줄러에서 중단 없이 입력, 실행 및 종료할 수 있도록 충분히 짧게 유지해야 합니다.

커널 레벨의 중요한 섹션은 소프트웨어 록아웃 문제의 기초가 됩니다.

데이터 구조의 중요 섹션

병렬 프로그래밍에서는 코드가 스레드로 분할됩니다.읽기/쓰기 충돌 변수는 스레드 간에 분할되며 각 스레드에 해당 변수가 복사됩니다.링크 리스트, 트리, 해시 테이블 의 데이터 구조스레드 간에 분할할 수 없는 데이터 변수를 가지고 있기 때문에 병렬 처리를 구현하기가 매우 어렵습니다.[6]삽입, 삭제, 검색과 같은 여러 작업을 병행하여 데이터 구조 구현의 효율성을 향상시켜야 합니다.이러한 작업을 수행하는 동안 동일한 요소가 한 스레드에 의해 검색되고 다른 스레드에 의해 삭제되는 경우가 있습니다.이 경우 출력이 잘못될 수 있습니다.요소를 검색하는 스레드는 히트할 수 있지만 다른 스레드는 그 시간 직후 삭제할 수 있습니다.이러한 시나리오는 잘못된 데이터를 제공함으로써 실행 중인 프로그램에서 문제를 일으킬 수 있습니다.이를 방지하기 위해 데이터 구조 전체를 중요한 섹션 아래에 유지하여 한 번에 하나의 작업만 처리할 수 있도록 하는 방법이 있습니다.다른 방법은 다른 작업에서 동일한 노드를 사용하지 않도록 critical 섹션에서 사용 중인 노드를 잠그는 것입니다.따라서 critical 섹션을 사용하면 코드가 예상된 [6]출력을 제공할 수 있습니다.

주변기기에 관한 중요한 섹션

중요한 섹션은 I/O 디바이스 등 외부 주변기기를 조작하는 코드에서도 발생합니다.페리페럴의 레지스터는 특정 시퀀스의 특정 값으로 프로그래밍해야 합니다.두 개 이상의 프로세스가 디바이스를 동시에 제어하면 잘못된 동작이 발생합니다.어느 프로세스도 디바이스가 필요한 상태가 되지 않습니다.

복수의 출력 조작을 발행하는 것으로, 출력 디바이스상에서 정보의 복잡한 단위를 생성해야 하는 경우는, 다른 프로세스가 출력의 비트를 인터리브 해 데이텀을 손상시키지 않게, 배타적 액세스가 필요합니다.

입력방향에서는 복수의 다른 입력동작을 통해 복합데이터를 읽을 때 다른 프로세스가 일부를 소비하여 파손을 일으키는 것을 방지하기 위해 배타적 접근이 필요하다.

스토리지 디바이스는 메모리의 한 형태를 제공합니다.중요 섹션의 개념은 메인 메모리의 공유 데이터 구조와 동일한 방식으로 관련이 있습니다.파일에 대해 여러 액세스 또는 업데이트 작업을 수행하는 프로세스는 적절한 파일 잠금 메커니즘으로 보호해야 하는 중요한 섹션을 실행합니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Raynal, Michel (2012). Concurrent Programming: Algorithms, Principles, and Foundations. Springer Science & Business Media. p. 9. ISBN 978-3642320279.
  2. ^ a b Jones, M. Tim (2008). GNU/Linux Application Programming (2nd ed.). [Hingham, Mass.] Charles River Media. p. 264. ISBN 978-1-58450-568-6.
  3. ^ Chen, Stenstrom, Guancheng, Per (Nov 10–16, 2012). "Critical Lock Analysis: Diagnosing Critical Section Bottlenecks in Multithreaded Applications". High Performance Computing, Networking, Storage and Analysis (SC), 2012 International Conference: 1–11. doi:10.1109/sc.2012.40. ISBN 978-1-4673-0805-2. S2CID 12519578.
  4. ^ "RESEARCH PAPER ON SOFTWARE SOLUTION OF CRITICAL SECTION PROBLEM". International Journal of Advance Technology & Engineering Research (IJATER). 1. November 2011.
  5. ^ Dubois, Scheurich, Michel, Christoph (1988). "Synchronization, Coherence, and Event Ordering in Multiprocessors". Survey and Tutorial Series. 21 (2): 9–21. doi:10.1109/2.15. S2CID 1749330.
  6. ^ a b Solihin, Yan (17 November 2015). Fundamentals of Parallel Multicore Architecture. ISBN 9781482211184.

외부 링크