컴퓨터(Computer Science)/운영체제(Operation System)

동기화를 위한 하드웨어 지원, Hardware Support for Synchronization

게임이 더 좋아 2020. 6. 4. 21:33
반응형
728x170

임계구역 문제에 대한 소프트웨어 기반 해결책도 있지만 

 

이번엔 우선 하드웨어 기반 해결책을 보자

 


소프트웨어 기반 해결책이 최신 컴퓨터 아키텍쳐에서 작동하지 않을 수 있다는 점 때문에 알아보는 것이다.

 

임계구역 문제를 해결하기 위한 지원을 제공하는 세 가지 하드웨어 명령어를 알아보자

 

차례대로 알아보자

 

 

• Many systems provide hardware support for implementing the critical section code.

 

• All solutions below based on idea of locking
Protecting critical regions via locks

 

 

• Uniprocessors – could disable interrupts
    Currently running code would execute without preemption  

    Generally too inefficient on multiprocessor systems
        Operating systems using this not broadly scalable


• Modern machines provide special atomic hardware instructions
    //Atomic = non-interruptible
    Either test memory word and set value
    Or swap contents of two memory words

 

 


메모리 장벽:Memory Barriers

 

시스템은 명령어의 순서를 재정렬 할 수 있다는 것

이러한 정책이 신뢰할 수 없는 데이터 상태로 이어질 수 있다는 것을 알고 있어야 한다.

 

컴퓨터 아키텍쳐가 응용 프로그램에게 제공하는 메모리 접근 시 보장되는 사항을 결정한 방식을 메모리 모델이라고 한다.

 

일반적으로 2가지가 있다.

 

1. 강한 순서, Strongly ordered

한 프로세서의 메모리 변경 결과가 다른 모든 프로세서에 즉시 보인다.

 

2. 약한 순서, Weakly ordered

한 프로세서의 메모리 변경 결과가 다른 프로세서에 즉시 보이지 않는다.

 

 

++ 메모리 모델은 프로세서 유형에 따라 다르다

 

컴퓨터 아키텍쳐는 메모리의 모든 변경 사항을 다른 모든 프로세서로 전파하는 명령어를 제공해서 다른 프로세서에서 실행 중인 스레드에 메모리 변경 사항이 보이는 것을 보장한다. 

 

위 같은 명령어가 바로 메모리 장벽(Memory barriers)라고 하는 것이다.

 

 

메모리 장벽 명령어가 실행될 때, 시스템은 후속 적재 또는 저장 연산이 수행되기 전에 모든 적재 및 저장이 완료되도록 해야한다. 

 

그래서 명령이 재정렬되더라도 메모리 장벽은 향후 적재 또는 저장 작업이 수행되기 전에 저장 작업이 메모리에서 완료되어 다른 프로세서에 보이도록 해야한다. 

 

 

 

예를 들어서 보자

 

 

flag 값이 x 값보다 먼저 적재(assign)될 수 있게 보장한다.

 

 

다시 스레드 2에 메모리 장벽을 넣으면

 

flag에 배정하기 전에 x에 대한 배정을 먼저한다.

 

**메모리 장벽을 배치함으로 작업의 재정렬을 피할 수 있다. 

**메모리 장벽은 매우 낮은 수준의 연산이며 일반적으로 상호 배제를 보장하는 특수 코드 작성할 때 커널 개발자가 사용한다.

 

 

 

 


 

그 다음은 하드웨어 명령어(Hardware Instruction) 하드웨어 명령어를 알아보자

 

많은 기계들은 한 워드(word)의 내용을 검사하고 변경하거나, 두 워드의 내용을 원자적으로(atomically) 교환(swap)할 수 있는, 즉 인터럽트 되지 않는 하나의 단위로서, 특별한 하드웨어 명령어들을 제공한다. 

 

**이러한 특별한 하드웨어 명령어들을 통해 임계구역 문제를 해결할 수 있다.

 

 

2가지 명령어를 보면서 알아보려고 한다.

 

 

 

** 아까 원자적으로 라고 설명했지?? 

그래서 만일 2 개의 test_and_set() 명령어가 동시에 다른 코어에서 실행된다면, 얘네 둘은 어떤 임의의 순서로 순차적으로 실행될 것이다.

 

만약 기계가 test_and_set()을 지원한다면, false로 초기화되는 lock이라는 boolean 변수를 선언하여 상호 배제를 구현할 수 있다는 것이다.

 

 

 

 

그렇다면 다른 한가지를 보면서 복습해보자

 

 

 

줄여서 CAS라고 부르자.

 

CAS도 원자적인 연산을 하지만 두 워드 내용 교환에 기반을 둔 다른 기법을 사용한다.

CAS는 3개의 피연산자를 대상으로 연산을 한다. // 위에 보면 3개지?? 인수가?

 

피연산자 value는 오직 if문이 실행이 되어야 new_value로 지정된다. // 즉 if 조건이 참이어야

 

** 어떻게든 CAS는 value의 원래 값을 반환한다. // 보면 그렇다

 

따라서 얘네들도 2개의 명령이 동시에 각각 다른 코어에서 실행되더라도 임의의 순서로 순차적으로 실행된다.

 

CAS는 상호 배제를 어떻게 하냐?? 면

 

 

전역 변수(lock)이 선언되고 0으로 초기화된다. 

 

CAS를 호출한 첫 번째 프로세스는 lock을 1로 지정하고 lock의 원래 값이 expected 값과 같으므로 프로세스는 임계구역으로 들어간다.

 

 

이후 CAS의 호출은 현재 lock의 값이 기댓값 0과 같이 않기에 성공할 수 없다. 

// 프로세스가 임계구역을 빠져나올 때 lock을 0으로 변경해놔야 다른 프로세스가 들어갈 수 있다.

 

 


** 물론 여기 나온 애들은 상호 배제 조건을 만족시키지만 한정된 대기 조건을 만족시키지 못한다.

 

그렇지만 여기까지만 알아보고 다음에 알아보도록... 하자

 

20000

반응형
그리드형