공유 메모리 세마포어 예제

우리가 지금 논의 하는 신호의 형태는 더 일반적 이며 응용 프로그램 자체 사용자 지정 이벤트를 정의할 수 있습니다. 즉, 세마포어를 사용하면 프로세스가 다른 프로세스에 어떤 일이 발생했으며 해당 응용 프로그램에만 중요한 사용자 지정 이벤트라는 것을 알릴 수 있습니다. 이러한 유형의 시그널링은 일반적으로 전송되는 각 신호에 시스템 호출이 필요하므로 IPC 모델을 전달하는 메시지를 따르는 것으로 간주됩니다. 시스템 V 인터페이스는 POSIX 세마포보다 적은 기능을 사용합니다. semget() 함수는 sem_open()과 비교할 수 있으며 두 가지 주요 예외가 있습니다: semget()은 단일 세마포 집합을 반환하고 세마포를 0이 아닌 값으로 초기화하려면 두 번째 단계가 필요합니다. System V는 또한 세마포 세트를 삭제하고 세트에서 하나 이상의 세마포의 값을 설정하거나 검사하는 데 사용할 수 있는 단일 제어 함수 semctl()을 제공한다. 마지막으로, semop() 함수는 세마포의 값을 증분하고 감소시키는 데 모두 사용됩니다. 또한 POSIX 세마포와 달리 semop()는 프로세스가 임의의 정수를 값에 추가하거나 뺄 수 있도록 합니다. POSIX 이름없는 세마포는 세마포를 만들고 사용하기위한 가벼운 접근 방식을 제공합니다. 특히 sem_open()이 새로 할당된 세마포에 대한 포인터를 반환하는 경우 sem_init(sem_init)은 현재 프로세스의 메모리 공간 내에 이미 할당된 세마포 변수(sem_t로 선언됨)를 참조하고 세마포를 값으로 설정합니다. 전달. 세마포가 초기화되면 명명된 세마포(예: sem_post() 및 sem_wait())에 대해 지정된 다른 함수를 사용할 수 있습니다.

AFAIK 세마포는 실제로 단지 핸들이며, 열리는 프로세스에 유효합니다. 실제 세마포 정보는 커널 메모리에 있습니다. 세마포가 동기화 메커니즘으로 작동하는 방식을 검토하는 것으로 시작해 보겠습니다. 일반적인 세마포는 증분될 수 있는 값(일반적으로 0으로 초기화)을 가지므로 계수 세마포라고도 합니다. 자전거를 대여하는 가게를 고려해 보시면, 그 중 100개가 입고되어 서기가 대여하는 데 사용하는 프로그램을 고려해 보십시오. 자전거를 빌릴 때마다 세마포는 하나씩 증가합니다. 자전거가 반환되면 세마포가 하나씩 감소합니다. 임대는 값이 100에 도달하면 계속 될 수 있지만 적어도 하나의 자전거가 반환 될 때까지 중단해야하므로 세마포를 99로 감소시입니다.

첫 번째 예제는 터미널 접근 방식을 취합니다. 코드 예제는 내 웹 사이트의 ZIP 파일에서 사용할 수 있습니다. 공유 메모리를 사용 하 여 주장 하는 경우, 그것은 확실히 가능. 많은 경우에 프로세스가 무기한 차단되지 않고 세마포의 상태를 확인할 수 있습니다. 예를 들어, 한 프로세스가 세마포를 사용하여 몇 가지 중요한 작업을 완료했음을 알리는 것으로 가정합니다. 다른 프로세스에서는 작업이 완료되었는지 여부를 확인할 수 있지만 이벤트가 아직 발생하지 않은 경우에도 계속 처리해야 합니다. sem_wait()로 세마포를 다운하면 이벤트가 발생할 때까지 프로세스가 차단되므로 작동하지 않습니다. 대신 POSIX는 세마포를 기다리는 두 가지 대체 함수를 제공합니다. sem_trywait()를 사용하면 프로세스가 세마포를 아래로 내려갈 수 있습니다.

그러나 세마포의 현재 값이 0이면 sem_trywait()는 차단 대신 오류를 반환합니다.

Comments are closed.