세마포어의 물리적 의미
세마포어의 물리적 의미는 다음과 같습니다.
세마포어 S>0일 때 S의 값은 특정 유형의 사용 가능한 리소스 수를 나타냅니다. 는 자원 단위 할당을 신청한다는 의미이며, S≤0인 경우에는 사용 가능한 자원이 없음을 의미하며, S의 절대값은 세마포어 S의 블로킹 큐에 있는 프로세스 수를 나타냅니다. V 작업을 수행한다는 것은 자원 단위를 해제하는 것을 의미합니다.
세마포어라고도 하는 세마포어는 멀티 스레드 환경에서 사용되는 기능으로 두 개 이상의 키 코드 세그먼트가 동시에 호출되지 않도록 하는 데 사용할 수 있습니다. 중요한 코드 섹션을 입력하기 전에 스레드는 세마포어를 획득해야 합니다. 중요한 코드 섹션이 완료되면 스레드는 세마포어를 해제해야 합니다.
이 중요한 코드 섹션에 들어가려는 다른 스레드는 첫 번째 스레드가 세마포어를 해제할 때까지 기다려야 합니다. 이 프로세스를 완료하려면 세마포어 VI를 생성한 다음 각 중요한 코드 섹션의 시작과 끝 부분에 세마포어 획득 VI와 세마포 해제 VI를 배치해야 합니다. 이 세마포어 VI가 원래 생성된 세마포어를 참조하는지 확인하십시오.
주차장 운영을 예로 들어보자. 단순화를 위해 주차장에 주차 공간이 3개만 있고 처음에는 3개의 주차 공간이 모두 비어 있다고 가정합니다. 이때, 5대의 차량이 동시에 오면 문지기는 그 중 3대가 직접 진입하도록 허용한 후, 나머지 차량은 입구에서 대기해야 하며, 후속 차량도 대기해야 합니다. 입구.
이때, 차량 한 대가 주차장에서 나갔다는 사실을 확인한 문지기는 차문을 열고 차를 밖에 두 대 정도 더 주차할 수 있었다. , 등등. 이 주차장 시스템에서 주차 공간은 공공 자원이며 각 차량은 스레드와 같으며 게이트키퍼는 세마포어 역할을 합니다.
추상적으로 말하면 세마포어의 특징은 다음과 같습니다. 세마포어는 음수가 아닌 정수(주차 공간 수)이며, 이를 전달하는 모든 스레드/프로세스(차량)는 정수를 다음과 같이 감소시킵니다. 1(물론 이를 전달하는 것은 리소스를 사용하는 것임), 정수 값이 0이면 이를 전달하려는 모든 스레드가 대기 상태가 됩니다. 세마포어에는 Wait(대기) 및 Release(해제)라는 두 가지 작업을 정의합니다.
스레드가 대기 작업을 호출하면 리소스를 획득하고 세마포어를 1씩 감소시키거나 세마포어가 1보다 크거나 같을 때까지 기다립니다(블로킹 큐에 배치하는 것을 참조). Release는 실제로 주차장을 떠나는 차량에 해당하는 세마포어에 추가 작업을 수행하는 작업입니다. 이 작업을 "릴리스"라고 부르는 이유는 세마포어가 보호하고 있는 리소스가 해제되기 때문입니다.