리눅스 semaphore 예제

모든 POSIX 세마포 함수 및 유형은 semaphore.h에서 프로토타입또는 정의됩니다. 세마포 개체를 정의하려면 sem_t sem_name을 사용합니다. sem_open(3) 함수는 새 세마포를 만들거나 기존 명명된 세마포를 엽니다. 세마포를 연 후, sem_post(3) 및 sem_wait(3)를 사용하여 조작할 수 있다. 세마포를 사용하여 프로세스가 완료되면 sem_close(3)를 사용하여 세마포를 닫을 수 있습니다. 세마포를 사용하여 모든 프로세스가 완료되면 sem_unlink(3)를 사용하여 시스템에서 제거할 수 있습니다. 이 부분에서 볼 수 있는 스핀록 후 다음 동기화 기본은 세마포입니다. 우리는 이론적인 측면에서 시작하고 세마포가 무엇인지 배울 것입니다 그리고이 후, 우리는 우리가 이전 부분에서했던 것처럼 리눅스 커널에서 구현하는 방법을 볼 수 있습니다. 두 번째 변수는 웨이터가 semaphore.wait_list 목록의 항목을 나타냅니다: 다운 함수의 시작 부분에 플래그 변수의 정의 표시 될 수 있습니다. 이 변수는 포함/linux/spinlock.h 헤더 파일에 정의된 raw_spin_lock_irqsave 및 raw_spin_lock_irqrestore 매크로에 전달되고 여기에 지정된 세마포의 카운터를 보호합니다. 실제로 이 두 매크로는 spin_lock 및 spin_unlock 매크로와 동일하게 수행하지만 인터럽트 플래그의 현재 값을 저장/ 복원하고 인터럽트를 비활성화합니다. 세마포를 잠그거나 기다릴 수 있도록 sem_wait 함수를 사용할 수 있습니다: 일반적인 동기화 프리미티브와 마찬가지로 세마포는 변수를 기반으로 합니다. 이 변수는 증분 되거나 감소 될 수 있습니다 및 그것의 상태는 잠금을 획득 하는 기능을 나타냅니다.

변수의 값은 0과 1로 제한되지 않습니다. 세마포에는 두 가지 유형이 있습니다. 그것은 매우 쉽게 보이며 실제로 거의 동일합니다. 따라서 함수는 방금 본 __SEMAPHORE_INITIALIZER 매크로를 사용 하 여 주어진 된 세마포의 초기화를 실행 합니다. 이 장의 이전 부분에서 이미 설명했듯이 Linux 커널의 잠금 유효성 검사기와 관련된 항목을 건너 뜁니다. 세마포 구조 수 및 wait_list의 마지막 두 필드는 사용 가능한 리소스 및 빈 목록의 수를 나타내는 지정된 값으로 초기화됩니다. 세마포는 스레드가 서로 간섭하지 않고 함께 작업하는 데 사용되는 데이터 구조입니다. spinlock은 공유 리소스가 두 개 이상의 프로세스에 의해 수정되지 않도록 보호하기 위해 획득될 잠금을 만듭니다. 따라서 현재 잠금을 획득하려는 다른 프로세스가 중지됩니다(일명 “스핀 인플레이스” 또는 대기 중임). 교착 상태를 피하기 위해 선점을 사용하지 않도록 설정하면 컨텍스트 전환이 허용되지 않습니다. 따라서 매우 짧은 시간 동안만 잠금이 획득되는 경우에만 스핀록을 사용해야 하며, 그렇지 않으면 다른 프로세스에 의해 누적된 바쁜 대기량은 매우 비효율적인 작업으로 이어져 야 합니다. 비교적 오랜 기간 동안 획득해야 하는 잠금의 경우 세마포를 설정합니다.

이 장에서는 세마포와 내 코드로 작업하기 위한 C API를 제공합니다. 그리고 그것은 마지막 도전을 제시 : 당신은 뮤텍스 및 조건 변수를 사용하여 세마포의 구현을 작성할 수 있습니까? 값은 세마포의 값입니다.

Posted in Uncategorized.