동기화 도구

피터슨의 해결책

피터슨의 해결책은 두 프로세스(P0와 P1)가 임계 구역을 안전하게 공유하도록 설계된 고전적인 소프트웨어 기반 알고리즘입니다. 이 해결책은 turn (누구의 차례인지 나타내는 정수)과 flag (각 프로세스가 임계 구역에 진입할 준비가 되었는지 나타내는 부울 배열)라는 두 개의 공유 변수를 사용합니다.

작동 방식:

프로세스 Pi가 임계 구역에 진입하려면 먼저 flag[i]를 true로 설정하여 진입 의사를 밝히고, turn을 j (상대방 프로세스)로 설정하여 상대방에게 양보합니다. 그 다음, flag[j]가 true이고 turn이 j인 동안 기다립니다. 이 조건이 거짓이 되면 Pi는 임계 구역에 진입합니다. 임계 구역에서 나올 때는 flag[i]를 false로 설정합니다.

장점:

  • 상호 배제: turn 변수와 flag 배열 덕분에 두 프로세스가 동시에 임계 구역에 진입하는 것을 효과적으로 방지합니다.

  • 진행: 임계 구역이 비어 있고 프로세스가 진입을 원하면, 무한정 기다리지 않고 진입이 허용됩니다.

  • 한정된 대기: 한 프로세스가 임계 구역 진입을 요청한 후, 상대방 프로세스는 최대 한 번만 임계 구역에 진입할 수 있습니다.

한계:

피터슨의 해결책은 이론적으로 유효하지만, 현대 컴퓨터 아키텍처에서는 제대로 작동하지 않을 수 있습니다. 이는 최신 프로세서와 컴파일러가 성능 최적화를 위해 명령어의 실행 순서를 재정렬할 수 있기 때문입니다. 예를 들어, flag와 turn 변수에 대한 쓰기/읽기 순서가 변경되면 상호 배제 조건이 깨질 가능성이 있습니다.


하드웨어 동기화 지원

소프트웨어 기반 해결책의 한계 때문에, 현대 컴퓨터 시스템은 임계 구역 문제를 해결하기 위한 특별한 하드웨어 명령어와 기능을 제공합니다.

1. 메모리 배리어 (Memory Barriers)

명령어 재정렬 문제를 해결하기 위해, 컴퓨터 아키텍처는 메모리 배리어 또는 **메모리 펜스(Memory Fences)**라고 불리는 명령어를 제공합니다. 이 명령어는 시스템이 모든 이전 로드(load) 및 저장(store) 작업이 완료된 후에만 다음 로드 또는 저장 작업을 수행하도록 강제합니다. 이는 공유 데이터를 사용하는 다중 스레드 환경에서 데이터 일관성을 보장하는 데 중요합니다. 메모리 배리어는 매우 낮은 수준의 작업으로, 주로 커널 개발자가 특수화된 코드를 작성할 때 사용됩니다.

2. 하드웨어 명령어 (Hardware Instructions)

많은 최신 컴퓨터 시스템은 워드의 내용을 원자적으로(atomically) 테스트하고 수정하거나, 두 워드의 내용을 원자적으로 교환하는 특별한 하드웨어 명령어를 제공합니다. '원자적'이라는 것은 해당 작업이 중단 불가능한 하나의 단위로 실행됨을 의미합니다.

  • test and set() 명령어: 대상 워드를 true로 설정하고 원래 값을 반환하는 명령어입니다. 이 명령어가 원자적으로 실행되면, lock 변수를 false로 초기화하고 test and set(&lock)을 사용하여 상호 배제를 구현할 수 있습니다.

  • compare and swap() (CAS) 명령어: 세 개의 피연산자(*value, expected, new_value)를 사용하여 작동합니다. *valueexpected와 같을 경우에만 *valuenew_value로 설정하고, 항상 *value의 원래 값을 반환합니다. 이 명령어는 원자적으로 실행되어 다중 스레드 환경에서 안전하게 lock 변수를 조작하는 데 사용될 수 있습니다.

3. 원자적 변수 (Atomic Variables)

compare and swap() 명령어는 직접적으로 상호 배제를 제공하기보다는, 카운터나 시퀀스 생성기와 같이 단일 변수를 업데이트하는 상황에서 경쟁 조건을 방지하는 데 사용되는 **원자적 변수(Atomic Variables)**와 같은 더 높은 수준의 도구를 구축하는 데 사용됩니다. 원자적 변수는 갱신 작업이 중단 없이 수행되도록 보장하여 데이터 일관성을 지킵니다. 하지만 모든 경쟁 조건을 완전히 해결하지는 못하며, 여러 변수가 관련된 복잡한 시나리오에는 더 정교한 도구가 필요합니다.

이러한 하드웨어 지원 동기화 메커니즘은 소프트웨어적 해결책의 한계를 보완하고, 다중 프로세서 시스템에서 효율적이고 신뢰할 수 있는 동기화를 가능하게 합니다.

Last updated