세마포어의 사용 및 구현 (초 세부 사항) (z)

http://c.biancheng.net/view/1232.html에서 전송

PV 조작은 조작 후, 즉 자원 마이너스 1의 개수 P 애플리케이션 리소스의 역할이며, 리소스의 개수가 0보다 작다는 0보다 작은 경우 현재의 자원리스트 자체 차단 여부를 판단 원자 동작이다.
V 액션 동작은 자원 하나씩 증가 요구 된 자원의 수를 반환하고 전류 차단 자원 현재 자원 목록의 웨이크 업 과정에서 설명 된 프로세스 0 이하가 있다면 리소스의 개수가 0보다 작거나 같은지 여부를 확인한다.

뮤텍스는, 우리가 토론 한, 일반적으로 가장 간단한 동기화 도구로 간주됩니다. 이 섹션은 뮤텍스 같은 역할을, 더 나은 도구를 논의 할 것이다,하지만 프로세스가 활동을 동기화 할 수 있도록 그것은 더 진보 된 방법을 제공 할 수있다.

세마포어 S는 정수 변수 인 통해서만 개의 표준 초기화 동작 원자 이외에의 액세스 대기 ()와 신호를 () :

  • 원래 P (네덜란드 proberen 시험) 라 동작 대기 ();
  • 조작 신호 ()는 원래 V (네덜란드 verhogen, 증가) 함;


대기 ()를 다음과 같이 정의 할 수 있습니다 :

  1. 기다려 (들 ) {
  2. 반면 (S <= 0 )
  3. ; // 통화 중 대기
  4. S -;
  5. }

신호 ()를 다음과 같이 정의 할 수 있습니다 :

  1. 신호 (S ) {
  2. S ++;
  3. }

대기 () 및 신호 () 동작에서, 세마포어의 정수 값 불가분 실행될 수정. 즉, 프로세스가 세마포어의 값을 변경하면, 다른 프로세스가 동시에 동일한 세마포어의 값을 수정할 수있다. 중단 될 수 없다 - 또한, 시험 대기 (S)에 대해, S는 정수 값 (S <0) 및 변형 (캔톤 S)이다.

첫째, 우리는 세마포어를 사용하는 방법을 살펴.

세마포어를 사용하여

운영 시스템은 일반적으로 세마포어 이진 세마포어를 계산 차별화. 세마포어의 카운트 값은 한정되지 않지만, 이진 신호를 0 또는 1의 양이되지 않는다. 따라서, 바이너리 세마포어 뮤텍스 비슷합니다. 사실, 뮤텍스를 제공하지 않는 시스템은 바이너리 세마포어 뮤텍스를 제공하기 위해 사용될 수있다.

그리고 여러 인스턴스를 갖는 자원에 대한 액세스를 제어하기 위해 세마포어를 계산. 사용 가능한 자원의 수의 초기 값을 세마포어. 처리 자원의 사용을 필요로하는 경우, 대기 () 연산 세마포어 (세마포어의 카운트를 감소)을 수행한다. 프로세스가 리소스를 해제 할 때, 신호 () 오퍼레이션 (세마포어 카운트 증가) 상기 신호의 양을 수행한다. 세마포어 카운터가 0이면, 모든 리소스 사용에 있습니다. 카운트가 0보다 클 때까지 그 후, 프로세스의 자원을 사용할 필요가 차단됩니다.

우리는 또한 다양한 동기화 문제를 해결하기 위해 세마포어를 사용할 수 있습니다. 예를 들어, 종래의 2 개 동시에 실행되는 프로세스 : 명령문 S1과 P1과 P2는 성명 S2있다. 요건 만 S1 S2 실행 이후에 수행 될 수 있다고 가정하면. 우리는 쉽게이 요구 사항을 달성 할 수있다 : P1 및 P2 공유 같은 세마포어 동기화하자, 0으로 초기화.

프로세스 P1에서 문을 삽입 :

(S1);
신호 (동기);

프로세스 P2에서 문을 삽입 :

(싱크) 기다려;
S2;

동기가 P1에서 0, 단지 호출 신호 (싱크)로 초기화되어 있기 때문에 문이 S1을 실행 된 후, 즉, P2는 S2를 수행한다.

세마포어 구현

그 뮤텍스 구현이 바쁜 대기를 가지고 기억합니다. 세마포어 연산 방금 설명한 대기 () 및 신호 ()에도 동일한 문제가있다.

필요 바쁜 대기를 극복하기 위하여, 동작은 정의되어, 세마포어 대기 () 및 신호 ()를 수정할 수있다 : 방법 ()가 동작 대기를 행하고, 신호 크기가 양성으로 발견되지 않은 경우, 대기한다. 그러나이 과정은 바쁜 대기가 아니라 자신을 차단. 세마포어 대기 큐와 연관된 동작으로 블로킹 처리하고, 대기 상태로의 상태를 전환하는 방법. 그런 다음 제어는 다른 프로세스를 수행하기 위해 선택하는 CPU 스케줄러에 전달합니다.

다른 프로세스 ()의 동작 신호를 수행 한 후, 세마포어 S 폐색 기다리는 프로세스는 재실행되어야한다. 다시 실행 프로세스가 운영 웨이크 업 ()에 의해 수행되고,이 상태를 기다릴 준비 상태에서 프로세스를 변경합니다. 그러나, 프로세스가 준비 큐에 추가됩니다. (CPU 스케줄링 알고리즘에 따라 CPU가하거나 새로운 준비 프로세스 실행중인 프로세스 전환하지 않을 수도있다)

는 다음과 같이 신호의 이러한 규정 량을 달성하기 위해, 우리는 신호의 크기를 정의한다 :

  1. 타입 정의의 구조체 {
  2. int 값 ;
  3. 구조체 프로세스 *리스트 ;
  4. 세마포어} ;

각 세마포어는 정수 값 및 프로세스리스트 목록을 갖는다. 프로세스가 세마포어를 기다려야 할 때,이 프로세스 목록에 추가됩니다. 조작 신호 ()는 대기리스트 공정에서 공정으로부터 제거되고, 깨어나.

다음 세마포어 동작 대기 ()이 정의 될 수있다 :

  1. 기다려 ( 세마포어 * S ) {
  2. S -> 값 -;
  3. 경우 (S -> 값 < 0 ) {
  4. 추가 이 과정 S -> 목록 ;
  5. 블록 ();
  6. }
  7. }

다음과 같이 정의 세마포어 동작 신호 () :

  1. 신호 ( 세마포어 * S ) {
  2. S -> 값 ++;
  3. 경우 (S -> 값 <= 0 ) {
  4. 공정 P 제거 으로부터 S ->리스트 ;
  5. 웨이크 (P );
  6. }
  7. }

동작 블록 () 해당 프로세스를 중단 호출합니다. 동작은 웨이크 업 (P) P는 차단 프로세스의 실행을 다시 시작. 두 작업은 기본 시스템 호출로 운영 체제에서 제공된다.

비지 고전 정의 기다려 세마포어를하면서 세마포어의 값이 마이너스로 구현 될 수 있음을 유의 세마포어는 제외 될 수 없다. 세마포어의 값이 음수이면, 그것은 대기 프로세스 수의 절대 값이다. 이 동작 대기 ()를 실행 및 테스트를 내림차순의 순서를 바꿀 때부터 발생한다.

각 과정을 통해 링크 필드의 제어 블록 PCB는 목록을 대기하는 과정을 쉽게 달성 될 수있다. 각 세마포어 연결리스트 포인터 정수와 PCB가 포함되어 있습니다. 그리고 유한은 세마포어는 큐 헤더와 꼬리 포인터를 포함하는 FIFO 큐를 대기하는 방법을 보장하기 위해 목록 삭제 프로세스를 증가시킵니다. 그러나 일반적으로 목록은 대기 정책을 사용할 수 있습니다. 세마포어의 적절한 사용은 특정 대기 정책의 세마포어 연결리스트에 의존하지 않습니다.

키 원자 세마포어 연산이 수행되어야한다는 것이다. 우리는을 보장하여야한다 : 같은 세마포어를, 두 개의 프로세스가 실행되지 수있는 작업은 동시에 () 및 신호 ()를 기다립니다. 이것은 중요한 문제 영역입니다.

동작 대기 () 및 신호 ()를 수행하는 동안 단일 프로세서 환경에서는, 당신은 단순히 인터럽트를 비활성화 할 수 있습니다. 이 프로그램은 인터럽트를 사용하지 않으면, 다른 프로세스 지침이 얽혀 없습니다 때문입니다, 단일 프로세서 환경에서 작업 할 수 있습니다. 인터럽트가 다시 활성화 될 때까지 만 현재 실행중인 프로세스가 실행 된 스케줄러는 제어를 되 찾는다.

멀티 프로세서 환경에서, 각각의 프로세서가 인터럽트를 비활성화해야하고, 그렇지 않으면, 프로세스는 임의의 다른 방식으로 서로 다른 프로세서에서 수행 다른 인터리빙을 실행할 수도있다. 각 프로세서는 성능에 심각한 영향을 미칠 것이다 금지를 중단하는 것은 매우 어려울 것이다. 따라서, SMP 시스템은 대기 () 신호 ()는 원자를 수행하도록 예컨대 compare_and__swap () 또는 스핀 잠금과 같은 다른 체결 방법을 제공한다.

운영자가 기다리는 () 및 신호 () 여기에 정의 된, 우리는 완전히 바쁜 대기를 제거하지 않은 것이 중요합니다. 우리는 중요한 지역에서 지역으로 이동 그저 바쁜 기다리고. 또, 작업 대기 () 및 (합리적인 의해 코딩 등, 그들은 10 개 지시를 초과하지 않는) 상대적으로 짧은 영역 신호 ()를 제한하기 위해 중요한 영역에서 바쁜 대기 할 것이다. 따라서, 중요한 영역이 거의 차지하지 바쁜 대기는 거의 발생하지 않으며, 필요한 시간이 매우 짧습니다. 애플리케이션의 경우, 중요한 지역 (분 또는 시간) 매우 긴 또는 거의 항상 점유 할 수있는 완전히 다른 상황에있다. 이 경우, 매우 바쁜 비효율적 기다리고.

교착 상태와 기아

세마포어 구현 대기 큐가 그러한 상황을 초래할 수로 : 이벤트 무한정 대기 프로세서를 2 개 이상, 상기 이벤트는 이러한 대기 프로세스 중 하나에 의해 생성 될 수있다. 그러한 조건이 발생할 경우, 이러한 프로세스는 교착됩니다.

세마포어 1 개의 초기 값이 두 프로세스 P0과 P1, 각 액세스 공유 세마포어 S 및 Q를 구비 한 시스템이있다 가정 설명하기 :

P 0 P 1
(S) 기다려;  (Q) 기다려;
(Q) 기다려;   (S) 기다려;
신호 (S); 신호 (Q);
신호 (Q); 신호 (S);


가정하자 P 0  실행 P이어서 대기 (S) . 1  행한다는 (Q)을 기다린다. P 때 0  (Q)을 기다려 실행되고, 그것은 P까지 기다려야한다 . 1 개  행한다 신호 (Q)를. 마찬가지로, P . (1)가  수행되는 대기 (들)는 P까지 기다려야 0  수행 신호 (S). 두 동작 신호 ()가 수행 될 수 없기 때문에, 그래서 P 0  과 P . 1  교착.

그룹의 각 프로세스가 이벤트를 기다리고, 이벤트 만 그룹 내의 다른 프로세스에 의해 제조 할 수있다 : 우리는 교착 상태에있는 프로세스의 그룹이 있다고 말한다. 여기에 이벤트 주요 관심사 획득하고 리소스를 해제하는 것입니다. 그러나 사건의 다른 유형은 교착 상태가 발생할 수 있습니다.

무제한 교착 상태와 관련된 또 다른 문제는, 무한 세마포어를 기다리는 프로세스를 차단 기아된다. 추가 공정을 삭제하여 세마포어 관련 LIFO 순서 목록 경우 무제한 막힘을 발생할 수 있습니다.

우선 순위 반전

높은 우선 순위 프로세스를 읽거나 커널 데이터를 수정해야하고, 커널 데이터는 현재 우선 순위가 낮은 프로세스에 의해 액세스되는 경우, 스케줄링 문제가있을 것입니다 (이 시리즈 이상의 프로세스를 포함 할 수있다). 커널 데이터는 일반적으로 잠금 장치에 의해 보호되기 때문에, 더 높은 우선 순위 프로세스는 자원이 부족하기 위해 우선 순위가 낮은 프로세스를 기다려야 할 것이다. 우선 순위가 낮은 프로세스가 더 높은 우선 순위 프로세스를 선점 할 경우, 상황은 더 복잡해진다.

예를 들어, 세 개의 프로세스 L, M 및 H, 자신의 우선 순위가있는 가정한다  L<M<H. H 프로세스가 자원 R을 요구한다고 가정하여, R L의 프로세스는 현재 액세스되고있다. 일반적으로, 과정은 H L R. 자원이 고갈 대기 하지만 지금은 과정 L.을 미리 비우는, M 실행 가능한 프로세스를 가정 간접적으로, 낮은 우선 순위 처리에 M, H는 프로세스가 얼마나 오래 기다려야 자원에게 R. L을 해제하는 과정을 만들 영향

이 문제는 우선 순위 역전으로 알려져있다. 그것은 단지 두 개 이상의 우선 순위 시스템에서 발생하므로 솔루션은 두 개의 우선 순위 레벨입니다. 그러나, 대부분의 범용 운영 체제에 충분하지 않습니다. 일반적으로 이러한 시스템은 문제 해결에 우선 순위 상속 프로토콜을 사용합니다.

그들이 관련 자원 때까지 실행할 때까지 계약에 따라, 모든 프로세스는 더 높은 우선 순위 프로세스 우선 순위에 접근하는 데 필요한 리소스에 액세스 할 수 있습니다. 그들이 밖으로 실행하면, 우선 순위는 원래 값으로 복원. 상기 예에서, 우선 순위 계승 프로토콜이 임시 우선 순위 계승 프로세스 L H의 행 처리를 허용함으로써 방지 선점 프로세스 M 행한다. 프로세스가 자원 L의 R에서 실행하면 원래의 우선 순위를 채택하기 위해, 우선 순위 상속 공정 H를 제공 할 것입니다. 자원이 사용할 수 있기 때문에 R, 프로세스의 H는 (대신 공정 M의) 다음에 실행됩니다.

추천

출처www.cnblogs.com/ffaiss/p/11122947.html