임계구역 문제에 대한 소프트웨어 기반 해결책도 있지만
이번엔 우선 하드웨어 기반 해결책을 보자
소프트웨어 기반 해결책이 최신 컴퓨터 아키텍쳐에서 작동하지 않을 수 있다는 점 때문에 알아보는 것이다.
임계구역 문제를 해결하기 위한 지원을 제공하는 세 가지 하드웨어 명령어를 알아보자
차례대로 알아보자
• 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
'컴퓨터(Computer Science) > 운영체제(Operation System)' 카테고리의 다른 글
Paging, 페이징, 불연속 메모리 할당 [운영체제] (0) | 2020.06.08 |
---|---|
Memory Management, 메모리 할당 방식 [운영체제] (0) | 2020.06.06 |
Segmentation, 세그먼트, 불연속 메모리 할당 [운영체제] (0) | 2020.06.03 |
Memory Management, 메모리 관리 기본 개념 [운영체제] (0) | 2020.06.03 |
동기화, 세마포 : Synchronization, Semaphores [운영체제] (0) | 2020.06.03 |