자바어로 뮤텍스와 세마포어가 뭐죠?주된 차이점은 무엇입니까?
자바어로 뮤텍스와 세마포어가 뭐죠?주된 차이점은 무엇입니까?
불행하게도 모든 사람들은 세마포와 뮤텍스의 가장 중요한 차이인 "소유권"의 개념을 놓쳤다.
세마포어는 소유권에 대한 개념이 없습니다.즉, 어떤 스레드라도 세마포어를 해방할 수 있습니다(이는 그 자체로 많은 문제를 일으킬 수 있지만 "사망 감지"에 도움이 됩니다).반면 뮤텍스는 소유권 개념이 있습니다(즉, 획득한 뮤텍스만 릴리스할 수 있습니다).
동시 시스템의 안전한 프로그래밍을 위해서는 소유권이 매우 중요합니다.항상 세마포보다 뮤텍스를 사용하는 것이 좋습니다(단, 퍼포먼스에 영향이 있습니다).
뮤텍스는 priority 상속(priority inversion 문제에 도움이 될 수 있음)과 재귀(일종의 교착 상태 제거)도 지원할 수 있습니다.
또한 "이진수" 세마포어와 "계수/일반" 세마포어가 있다는 점도 지적해야 합니다.Java의 세마포어는 카운트 세마포이므로 1보다 큰 값으로 초기화할 수 있습니다(단, 지적한 바와 같이 뮤텍스는 개념적으로 1의 카운트밖에 할 수 없습니다).이것의 유용성은 다른 게시물에서 지적되었다.
요약하면 관리할 리소스가 여러 개 없는 한 세마포어보다 뮤텍스를 항상 권장합니다.
세마포어는 셀 수 있지만 뮤텍스는 1까지만 셀 수 있습니다.
클라이언트 접속을 받아들이는 스레드가 실행되고 있다고 가정합니다.이 스레드는 10개의 클라이언트를 동시에 처리할 수 있습니다.그런 다음 각 새 클라이언트는 10이 될 때까지 세마포를 설정합니다.Semaphore에 10개의 플래그가 있으면 스레드가 새 연결을 받아들이지 않습니다.
뮤텍스는 보통 물건을 지키는 데 사용됩니다.10개의 클라이언트가 시스템의 여러 부분에 액세스할 수 있다고 가정합니다.그런 다음 뮤텍스를 사용하여 시스템의 일부를 보호할 수 있으므로 1개의 클라이언트가 해당 서브시스템에 연결되어 있을 때 다른 누구도 액세스 할 수 없습니다.이 용도로 세마포를 사용할 수도 있습니다.뮤텍스는 "상호 제외 세마포어"입니다.
뮤텍스는 기본적으로 상호 배타적입니다.한 번에 하나의 스레드만 리소스를 가져올 수 있습니다.한 스레드가 리소스를 획득하면 리소스를 소유하는 스레드가 해제될 때까지 다른 스레드는 리소스를 획득할 수 없습니다.리소스 획득을 대기 중인 모든 스레드가 차단됩니다.
세마포어는 실행되는 스레드 수를 제어하는 데 사용됩니다.고정된 자원 집합이 있을 것이다.스레드가 동일한 소유권을 가질 때마다 리소스 수가 감소합니다.세마포 수가 0에 도달하면 다른 스레드는 리소스를 가져올 수 없습니다.스레드는 리소스를 소유하는 다른 스레드가 릴리스할 때까지 차단됩니다.
요컨대, 주요 차이점은 리소스를 동시에 획득할 수 있는 스레드 수입니다.
- Mutex --그것은 ONE입니다.
- Semaphore -- 그 DEFINED_COUNT(세마포 수만큼)
뮤텍스는 리소스에 대한 직렬 액세스에 사용되는 반면 세마포는 리소스에 대한 액세스를 설정된 수까지 제한합니다.뮤텍스는 액세스카운트가 1인 세마포라고 생각할 수 있습니다.리소스가 차단되기 전에 스레드가 리소스에 액세스할 수 있는 세마포 수를 설정하는 항목입니다.
세마포는 계수 동기 메커니즘이지만 뮤텍스는 그렇지 않습니다.
뮤텍스는 종종 바이너리 세마포어로 알려져 있습니다.세마포어는 0이 아닌 임의의 카운트로 작성할 수 있지만 뮤텍스는 개념적으로 상한 카운트가 1인 세마포어입니다.
세마포어:
을 유지합니다.개념적으로 세마포는 일련의 허용을 유지합니다. ★★
acquire()
는 필요에 따라 허용이 사용 가능하게 될 때까지 차단한 후 가져옵니다. ★★release()
는 허가증을 추가하여 차단 취득자를 해방할 수 있습니다.그러나 실제 허용 개체는 사용되지 않습니다. 세마포어
세마포어는 일부(물리적 또는 논리적) 리소스에 액세스할 수 있는 스레드 수를 제한하기 위해 자주 사용됩니다.
Java에는 Mutex API가 내장되어 있지 않습니다.그러나 바이너리 세마포어로 구현할 수 있습니다.
1개로 초기화된 세마포는 최대 1개의 허가만 사용할 수 있도록 사용되며 상호 제외 잠금으로 사용할 수 있습니다.이것은 일반적으로 바이너리 세마포라고 불리는데, 이는 사용 가능한 허용과 사용 가능한 허용의 두 가지 상태만 있기 때문입니다.
이렇게 사용하면 바이너리 세마포는 소유자가 아닌 스레드에 의해 "잠금"을 해제할 수 있는 속성을 가집니다(세마포는 소유권에 대한 개념이 없기 때문에).이는 데드록 복구 등 일부 특수한 컨텍스트에서 유용합니다.
Semaphore와 Mutex의 주요 차이점은 다음과 같습니다.
세마포어는 throughg가 허용하는 리소스에 액세스하는 스레드 수를 제한합니다.Mutex는 하나의 스레드만 리소스에 액세스할 수 있도록 허용합니다.
세마포어하려면 , 「 수」를 호출합니다.
acquire()
★★★★★★★★★★★★★★★★★」release()
.뮤텍스는 잠금을 유지하는 스레드에 의해서만 잠금을 해제해야 합니다.조건 변수와 함께 뮤텍스를 사용하는 경우 프로그램의 어느 부분이 보호되고 있는지 명확하게 알 수 있는 암묵적인 괄호가 있습니다.이는 동시 프로그래밍의 시작이라고 할 수 있는 세마포의 경우에는 반드시 해당되지 않습니다.세마포는 강력하지만 구조화되지 않은 방법으로 사용하기에는 너무 쉽습니다.
동기 Semaphore 오브젝트는 클래식한 신호등을 구현합니다.신호등은 카운터가 공유하는 자원에 대한 접근을 제어합니다.카운터가 0보다 크면 액세스가 허용되고 0인 경우 액세스가 거부됩니다.카운터는 공유 리소스에 대한 액세스를 허용하는 권한을 카운트합니다.그런 다음 리소스에 액세스하려면 스레드가 신호등으로부터 허가를 받아야 합니다.일반적으로 트래픽 신호를 사용하려면 공유 리소스에 액세스하려는 스레드가 허용을 얻으려고 합니다.트래픽 신호 카운트가 0보다 클 경우 스레드는 허가를 취득하고 트래픽 신호 카운트는 감소합니다.그렇지 않으면 권한을 얻을 때까지 스레드가 잠깁니다.스레드가 공유 리소스에 액세스할 필요가 없어지면 권한이 해제되므로 트래픽라이트 수가 증가합니다.허가를 대기하고 있는 다른 스레드가 있는 경우, 그 시점에서 허가를 취득합니다.Java의 Semaphore 클래스는 이 메커니즘을 구현합니다.
Semaphore에는 2개의 빌더가 있습니다.
Semaphore(int num)
Semaphore(int num, boolean come)
num은 허용의 초기 카운트를 지정합니다.그런 다음 num은 지정된 시간에 공유 리소스에 액세스할 수 있는 스레드 수를 지정합니다.num이 1인 경우 한 번에 한 스레드씩 리소스에 액세스할 수 있습니다.설정이 true가 되면 대기 중인 스레드에 요청된 순서대로 권한이 부여되도록 보장할 수 있습니다.
비교할 수 없는 것을 비교해 보면, 기술적으로 세마포와 뮤텍스는 아무런 차이가 없습니다. 말이 안 됩니다.Mutex는 응용 프로그램 로직의 다른 이름과 마찬가지로 중요한 이름입니다. 즉, 세마포를 "1"로 초기화하면 일반적으로 리소스 또는 보호 변수를 보호하여 상호 배제를 보장할 수 있습니다.
뮤텍스는 바이너리 세마포어입니다.선착순 원칙이 충족되도록 1로 초기화해야 합니다.이것은 각 뮤텍스의 다른 특별한 특성으로 이어집니다. 즉, 다운된 사람이 업한 사람이어야 합니다.에르고 우리는 어떤 자원에 대해 상호 배제를 얻었다.
뮤텍스는 일반적인 세마포의 특수한 경우임을 알 수 있습니다.
언급URL : https://stackoverflow.com/questions/771347/what-is-mutex-and-semaphore-in-java-what-is-the-main-difference
'programing' 카테고리의 다른 글
Ajax를 사용하여 PDF 파일 다운로드 및 열기 (0) | 2023.01.01 |
---|---|
스프링 부트 - 클래스 경로 리소스에 정의된 'dataSource' 이름의 콩을 만드는 동안 오류가 발생했습니다. (0) | 2023.01.01 |
JavaScript에서 스택과 큐를 구현하려면 어떻게 해야 합니까? (0) | 2023.01.01 |
SQL Chemy IN 조항 (0) | 2023.01.01 |
Mac OS 10.6(Snow Leopard), 10.7(Lion), 10.8(Mountain Lion)에서 PHP와 MySQL을 활성화하는 가장 쉬운 방법은 무엇입니까? (0) | 2023.01.01 |