공유메모리 세마포어 예제

Linux 시스템은 공유 메모리에 대해 레거시 시스템 V API와 최신 POSIX API의 두 가지 별도 API를 제공합니다. 그러나 이러한 API는 단일 응용 프로그램에서 혼합해서는 안 됩니다. POSIX 접근 방식의 단점은 기능이 아직 개발 중이며 코드 이식성에 영향을 주는 설치된 커널 버전에 따라 달라지는 것입니다. 예를 들어 POSIX API는 기본적으로 공유 메모리를 메모리 매핑 된 파일로 구현합니다. POSIX에서 공유 메모리는 백업 파일 없이 구성할 수 있지만 이식성에 영향을 미칠 수 있습니다. 내 예는 메모리 액세스 (속도) 및 파일 저장소 (지 속성)의 이점을 결합 하는 백업 파일과 POSIX API를 사용 합니다. 세마포어는 메시지 큐 및 공유 메모리와 마찬가지로 POSIX 및 System V 인터페이스 사양을 모두 갖습니다. 세마포의 두 버전 사이의 주요 차이점은 다음과 같습니다 : 세마포는 데이터의 일반적인 교환을 허용하지 않기 때문에, 이 장에서 논의 된 IPC의 다른 형태와 다르다. 즉, 세마포를 사용하여 응용 프로그램 별 정보를 한 프로세스에서 다른 프로세스로 전송할 수 없습니다. 대신 세마포어는 공유 리소스에 대한 액세스를 동기화하는 데 사용됩니다. 즉, 세마포는 충돌할 수 있는 공유 액세스의 타이밍을 제어합니다.

시스템 V 인터페이스는 POSIX 세마포보다 적은 기능을 사용합니다. semget() 함수는 sem_open()과 비교할 수 있으며 두 가지 주요 예외가 있습니다: semget()은 단일 세마포 집합을 반환하고 세마포를 0이 아닌 값으로 초기화하려면 두 번째 단계가 필요합니다. System V는 또한 세마포 세트를 삭제하고 세트에서 하나 이상의 세마포의 값을 설정하거나 검사하는 데 사용할 수 있는 단일 제어 함수 semctl()을 제공한다. 마지막으로, semop() 함수는 세마포의 값을 증분하고 감소시키는 데 모두 사용됩니다. 또한 POSIX 세마포와 달리 semop()는 프로세스가 임의의 정수를 값에 추가하거나 뺄 수 있도록 합니다. POSIX는 두 가지 유형의 세마포를 정의합니다: 명명및 명명되지 않은. 명명된 세마포어는 이름, oflag 및 모드의 표준 POSIX 인수를 사용하여 초기 서명되지 않은 정수 값과 함께 만들어집니다. 새 세마포를 만들 때 모드 및 값 매개 변수를 모두 포함해야 하며 기존 세마포에 연결할 때 둘 다 제외되어야 합니다. sem_wait() 및 sem_post() 함수는 세마포의 값인 감소(대기) 또는 증분(post)입니다. 값이 현재 0이면 sem_wait()를 호출하는 다른 프로세스에서 값이 변경될 때까지 sem_wait()가 현재 프로세스를 차단합니다.

sem_post()는 한 번에 하나의 프로세스만 차단을 해제합니다. 세마포에서 5개의 프로세스가 대기 중인 경우 sem_post()에 대한 5개의 호출을 사용하여 모든 프로세스를 차단 해제해야 합니다.