세마포어의 물리적 의미는 무엇입니까? 초기 값은 어떻게 설정해야 합니까?
1. 세마포어의 정의: 세마포어라고도 하는 세마포어는 멀티 스레드 환경에서 사용되는 기능으로, 다양한 스레드가 올바르게 작동할 수 있도록 조정하는 역할을 합니다. 리소스 세마포어는 단일 값과 다중 값의 두 가지 유형으로 구분됩니다. 전자는 하나의 스레드로만 얻을 수 있고 후자는 여러 스레드로 얻을 수 있습니다.
2. 주차장 운영을 예로 들어보자. 단순화를 위해 주차장에 주차 공간이 3개만 있고 처음에는 3개의 주차 공간이 모두 비어 있다고 가정합니다. 이때, 5대의 차량이 동시에 오면 문지기는 그 중 3대가 직접 진입하도록 허용한 후, 나머지 차량은 입구에서 기다려야 하고, 뒤따르는 차량도 입구에서 기다려야 한다.
3. 이때 차가 주차장에서 나간 뒤 문지기가 차문을 열고 차를 바깥에 댔다. 차가 두 대 더 남으면 두 대를 넣을 수 있었다. 더 많은 자동차 등등. 이 주차장 시스템에서는 주차 공간이 주요 자원이며, 각 차량은 스레드와 같으며 게이트키퍼는 세마포어 역할을 합니다.
4. 추상적으로 말하면 세마포어의 특징은 다음과 같습니다. 세마포어는 음수가 아닌 정수(주차장 수)이며, 이를 통과하는 모든 스레드/프로세스(차량)는 정수를 감소시킵니다. 하나씩(pass 물론 리소스를 사용하기 위한 것입니다.) 해당 정수 값이 0이면 이를 전달하려는 모든 스레드가 대기 상태가 됩니다.
5. 세마포어에는 Wait(대기) 및 Release(해제)라는 두 가지 작업을 정의합니다. 스레드가 대기 작업을 호출하면 리소스를 획득하고 세마포어를 1씩 감소시키거나 세마포어가 1보다 크거나 같을 때까지 기다립니다.
6. 실제로는 주차장을 떠나는 차량에 해당하는 세마포어에 대한 추가 작업을 수행합니다. 이 작업을 "릴리스"라고 부르는 이유는 세마포어에 의해 보호된 리소스가 해제되기 때문입니다.
7. 중요한 코드 섹션에 들어가기 전에 스레드는 중요한 코드 섹션이 완료되면 세마포어를 해제해야 합니다. 이 중요한 코드 섹션에 들어가려는 다른 스레드는 첫 번째 스레드가 세마포어를 해제할 때까지 기다려야 합니다. 이 프로세스를 완료하려면 세마포어 VI를 생성한 다음 각 키 코드 세그먼트의 시작과 끝 부분에 AcquireSemaphoreVI 및 ReleaseSemaphoreV를 배치해야 합니다. 이 세마포어 VI가 원래 생성된 세마포어를 참조하는지 확인하십시오.