spin_lock 예제

개체에 더 많은 정보가 포함되어 있는 경우 정보를 안팎으로 복사하는 것으로는 충분하지 않을 수 있습니다. 이렇게 하면 두 가지 문제가 발생합니다. 동시성은 잠금이 일반적으로 보유되는 길이에 따라 달라집니다: 필요한 기간 동안 잠금을 유지해야 하지만 더 이상 보유하지 않아야 합니다. 캐시 예제에서는 항상 잠금이 유지되지 않고 개체를 만든 다음 목록에 삽입할 준비가 된 경우에만 잠금을 잡습니다. 이 예제에서는 객체가 만들어지면 객체(참조 개수 제외)가 변경되지 않는다고 가정했습니다. 이름을 변경하려면 세 가지 가능성이 있습니다: Spinlocks는 잠금이 오랫동안 유지되지 않는 상황에서 데이터를 잠그는 데 사용되어야 합니다. (긴 시간으로 간주되는 것에 대한 지침은 „규칙“ 사이드바를 참조하십시오.) 고맙게도, 스핀 록은 어디서나 사용할 수 있습니다. 그러나 스핀록을 들고 있는 동안 잠을 자는 것은 아무 것도 할 수 없습니다. 예를 들어, GFP_KERNEL 플래그가 있는 사용자 메모리, kmalloc(), 세마포 함수 또는 스핀록을 들고 있는 동안 일정 함수에 닿는 함수를 호출하지 마십시오. 경고를 받았습니다.

원자성 메서드의 다음 그룹은 개별 비트에서 작동하는 메서드입니다. 표준 C 데이터 형식에서 작동하기 때문에 정수 메서드보다 간단합니다. 예를 들어 void set_bit(int nr, void *addr)를 고려합니다. 이 함수는 애더가 가리키는 데이터의 „nr-th“ 비트1로 원자적으로 설정됩니다. 원자비트 연산자는 „함수 참조“ 사이드바에도 나열됩니다. 이름 매핑에 대한 숫자 캐시라는 간단한 예제를 살펴보겠습니다. 캐시는 각 개체가 사용되는 빈도를 유지하며, 개체가 가득 차면 가장 적게 사용되는 개체를 throw합니다. 우리는 두 가지 이유로 처음에 원자 연산을 다룹니다. 첫째, 커널 동기화에 대한 가장 간단한 접근 방식이므로 이해하고 사용하기가 가장 쉽습니다. 둘째, 복잡한 잠금 프리미티브가 구축됩니다. 이러한 의미에서 커널 잠금의 구성 요소입니다.

원자 연산자는 하나의 중단 없는 작업에서 수행되는 추가 및 빼기와 같은 작업입니다. i++의 이전 예제를 고려합니다. 우리가 i를 읽고, 그것을 증분하고 하나의 중단할 수없는 작업으로 메모리에 다시 쓸 수 있다면 위에서 설명 한 경주 조건은 문제가되지 않을 것입니다. 원자 연산자는 이러한 무정전 작업을 제공합니다. 정수에서 작동하는 메서드와 비트에서 작동하는 메서드의 두 가지 유형이 있습니다. 정수 작업은 다음과 같이 작동합니다: 설명: 시스템은 다른 스레드에서 잠금이 사용 중인 동안(예: pthread_spin_lock() 호출에서 사용되는 동안 스핀 잠금을 초기화하거나 파괴하려는 시도를 감지했습니다.