Computer >> 컴퓨터 >  >> 프로그램 작성 >> C 프로그래밍

C/C++의 프로세스 동기화

<시간/>

프로세스 동기화는 데이터 불일치를 초래할 수 있는 공유 데이터에 대한 동시 액세스 문제를 극복하기 위한 기술입니다. 협력 프로세스는 프로세스 데이터의 불일치로 이어질 다른 프로세스에 영향을 미치거나 영향을 받을 수 있는 프로세스이므로 데이터 일관성을 위해 프로세스 동기화가 필요합니다.

중요 섹션 문제

모든 프로세스에는 중요 섹션이라고 하는 예약된 코드 세그먼트가 있습니다. . 이 섹션에서 프로세스는 공통 변수를 변경하고, 테이블을 업데이트하고, 파일을 쓸 수 있습니다. 크리티컬 섹션에 대해 주의해야 할 핵심 사항은 한 프로세스가 크리티컬 섹션에서 실행될 때 다른 프로세스가 크리티컬 섹션에서 실행할 수 없다는 것입니다. 각 프로세스는 중요 섹션에 들어가기 전에 권한을 요청해야 하며 이 요청을 구현하는 코드 섹션은 입력 섹션입니다. , 코드의 끝은 종료 섹션 입니다. 나머지 코드는 나머지 섹션입니다.

아래는 특정 프로세스 P1의 임계 섹션 구조입니다.

C/C++의 프로세스 동기화

크리티컬 섹션에 대해 충족해야 하는 세 가지 요구 사항이 있습니다.

  • 상호 배제 − 한 프로세스가 P1이 다른 프로세스보다 중요 섹션에서 실행되고 있다고 가정해 보겠습니다. P2는 임계 섹션에서 실행할 수 없다고 가정합니다.
  • 진행 상황 − 임계 영역에서 실행 중인 프로세스가 없고 임계 영역에 진입하려는 프로세스가 있는 경우 나머지 영역에서 실행되지 않는 프로세스만 임계 영역에 진입을 요청할 수 있으며 선택을 무기한 연기할 수 있습니다. .
  • 제한된 대기 − 제한된 대기에서는 프로세스가 임계 섹션에 들어가도록 요청한 후 해당 요청이 승인되기 전에 임계 섹션에 들어갈 수 있는 횟수에 제한이 있습니다.

핵심 섹션을 처리하기 위해 운영 체제에서 일반적으로 사용되는 두 가지 접근 방식이 있습니다.

선점 커널 − 선점형 커널을 사용하면 프로세스가 커널 모드에서 실행되는 동안 선점될 수 있습니다.

비선점 커널 − 비선점 커널은 커널 모드에서 실행 중인 프로세스가 선점되는 것을 허용하지 않습니다.

피터슨의 솔루션

Peterson의 솔루션은 임계 섹션 문제에 대한 고전 기반 소프트웨어 솔루션입니다. 임계 섹션과 나머지 섹션 간에 실행을 번갈아 하는 두 개의 프로세스로 제한됩니다. Peterson' 섹션에서는 두 프로세스 간에 공유할 두 개의 데이터 항목이 필요합니다. 즉,

  • 인턴;
  • 부울 플래그[2];

여기서 변수 턴은 임계 구역에 들어갈 차례를 나타내고 플래그 배열은 프로세스가 임계 구역에 들어갈 준비가 되었는지 여부를 나타냅니다.

턴 ==i이면 프로세스 Pi가 임계 영역에 들어갈 수 있음을 의미합니다.

플래그[j]가 TRUE이면 프로세스 j가 임계 영역에 들어갈 준비가 되었음을 의미합니다.

아래는 Peterson의 솔루션에서 프로세스 P의 구조입니다.

C/C++의 프로세스 동기화

피터슨의 솔루션은 세 가지 조건을 모두 유지합니다.

  • 상호 배제 - 한 번에 하나의 프로세스가 중요한 섹션에 액세스할 수 있습니다.
  • 진행 상황 − 임계 영역 외부의 프로세스는 다른 프로세스가 임계 영역에 진입하는 것을 차단하지 않습니다.
  • 제한된 대기 − 모든 프로세스는 무한정 기다리지 않고 임계 영역에 들어갈 수 있는 기회를 얻습니다.

동기화 하드웨어

두 가지 유형의 명령어를 사용하여 구현됩니다. -

  • 테스트 및 설정()
  • 스왑()

Test and Set()은 동기화 문제를 해결하기 위한 하드웨어 솔루션입니다. 여기에는 Lock으로 알려진 여러 프로세스가 공유하는 공유 변수가 있습니다. 이 변수는 0과 1 중 하나의 값을 가질 수 있습니다. 여기서 1은 잠금 획득을 나타내고 0은 잠금 해제를 나타냅니다.

프로세스가 중요한 섹션에 들어가려고 할 때마다 잠금 값에 대해 문의해야 합니다. 잠금 값이 1이면 잠금 값이 0으로 변경되지 않을 때까지 기다려야 합니다.

아래는 TestAndSet()을 사용한 상호 배제 구현입니다.

C/C++의 프로세스 동기화

세마포어

세마포어는 TestAndSet() 및 Swap() 명령어에 의해 생성된 문제를 극복하는 데 사용되는 동기화 도구입니다. 세마포어 S는 wait() 및 signal()이라는 두 가지 표준 원자 연산을 통해 액세스할 수 있는 정수 변수입니다.

대기() 함수:

wait(S) {
   While S <= 0
   ; // no operation
   S--;
}

Signal() 함수:

signal(S) {
   S++;
}

한 프로세스가 세마포어 값을 수정할 때 다른 프로세스는 동시에 동일한 세마포어 값을 조작할 수 없습니다.

아래는 세마포어를 사용한 상호 배제 구현입니다.

C/C++의 프로세스 동기화

운영 체제는 다음과 같은 두 가지 유형의 셈포어를 사용합니다.

카운팅 세마포어 - 이러한 유형의 세마포어 값은 제한되지 않은 도메인을 넘을 수 있습니다.

이진 세마포어 - 이 세마포어 유형의 값은 0과 1 사이일 수 있습니다. 이는 뮤텍스 잠금이라고도 합니다. 운영 체제는 이를 활용하여 여러 프로세스에서 크리티컬 섹션 문제를 해결합니다.