2012-05-03 2 views
3

나는 (그것을 알고 분들을위한) "운영 시스템 개념"의 세마포어에 대해 읽고있다, 그리고 나는이 구절 읽을 때까지 완전히 세마포어를 이해 생각 :이해 세마포어

세마포어의 중요한 측면을 그들이 실행 된 것은 원자 적입니다. 두 프로세스가 동시에 대기를 실행하고 동일한 세마포어에서 신호 작업을 수행 할 수 없음을 보장해야합니다.

또한 :

하드웨어가 특별한 원자 지침을 제공하지 않는 경우, 우리는 중요한 부분이 대기의 구성 및 중요 섹션 문제에 대한 소프트웨어 솔루션 중 하나를 채택 할 수 신호 절차.

이 통로 Signal에 얼굴을 참조하여 동작 Wait 원자이어야한다. 나는 세마포어의 모든 목적이 주어진 시간에 임계 영역에서 하나의 프로세스 만 허용한다고 생각했습니다. 다른 알고리즘 (예 : 베이커리 알고리즘)을 사용해야 할 경우 세마포어가 필요한 이유는 무엇입니까?

나는 내 질문에 혼란을 느낄 수 있습니다. 그렇다면 주제가 나에게 아직도 모호하기 때문에 질문을하는 것조차 어렵습니다. 이 세마포어의 구현이 아니라 자신의 사용에 대해 이야기

답변

4

세마포어와 뮤텍스를 구별하는 데 문제가 있다고 생각합니다. 바이너리 세마포어는 뮤텍스와 같은 방식으로 구현 될 수 있지만 실제로는 다른 용도로 사용됩니다. 세마포어는 리소스를 보호하지만 뮤텍스는 코드 블록을 엄격하게 보호합니다. 구별은 종종 미묘합니다.

세마포어를 사용하면 세마포어 계산과 같은 변형이 생기므로 하나의 프로세스 만 리소스에 액세스 할 수 있다는 생각은 항상 사실이 아닙니다. 하나의 프로세스 또는 스레드에 대한 쓰기를 차단할 수 있지만 다중 (읽기/쓰기 잠금)에서 읽기를 허용 할 수 있습니다.

위 주제에 대한 위키 백과 문서를 살펴 보시기 바랍니다. 사실 꽤 좋습니다.
http://en.wikipedia.org/wiki/Semaphore_(programming)

1

은 ... 어떤 해명을 읽고 싶어요. 하드웨어가 세마포어와 같은 원 자성 연산을 지원하면 사용자가 Signal/Wait을 호출 할 때 사용됩니다. 하드웨어가이를 지원하지 않으면 세마포어 구현 자체가 동일한 기능을 보장하는 다른 방법을 찾게됩니다.

SignalWait을 호출 할 때 그러한 지원이없는 시스템이 더 오래 걸린다는 점을 제외하면 이것은 사용자에게 투명합니다. (대부분의 현대 하드웨어 플랫폼이 세마포어의 원자 적 연산을 지원하지는 않는 한 대부분).

상호 배제를 원할 경우 얻을 수있는 메커니즘은 원자 적이어야합니다.

3

원 자성은 상호 배제를 구현하는 방법입니다. 한 번에 하나의 스레드 만 코드의 중요한 섹션에 들어가기를 원한다고 가정 해보십시오. 어떻게 그걸합니까? 글쎄, 당신은 "잠금/잠금 해제"표시기가 있습니다. 그리고 코드가 임계 영역에 들어가기 전에 스레드가 지시기를 "잠금 해제 됨"에서 "잠금"으로 변경하도록합니다.

그러나 두 스레드가 표시기가 "잠기지 않음"(동시에 잠김 상태로 전환됨)과 동시에 중요한 코드 섹션을 동시에 실행하는 것을 모두 보지 못하게하는 것은 무엇입니까? 그리고 대답은 "unlocked"에서 "locked"로 전환하는 작업이 원자 적이어야한다는 것입니다. 즉, 즉시 수행해야하므로 두 개의 스레드가 표시기를 "잠김"으로 변경하는 데 성공할 수 없습니다.

+1

내가 당신이 잠금을 구축 한 다음 "잠금을 잠금"이다 혼동 일까지 ... – yotamoo

-3

나는이 같은 질문을 학급의 교수에게 물었고 그의 대답은 "세마포어를 망치로 생각하면 망치가 생기면 많은 것들을 할 수있다. Peterson 또는 Bakery와 같은 상호 배타에 대한 하드웨어 또는 소프트웨어 솔루션은 제한적입니다. " 나이트 클럽에서 세마포어로 경비원

0

생각합니다. 한 번에 클럽에 전용 인원이 허용됩니다. 클럽이 꽉 차 있다면 아무도 들어갈 수 없지만 한 사람이 떠나면 곧 다른 사람이 들어올 수 있습니다.

이것은 단순히 특정 리소스에 대한 소비자 수를 제한하는 방법입니다. 예를 들어 응용 프로그램에서 데이터베이스에 대한 동시 호출 수를 제한합니다.

Source: