> 백엔드 개발 > C++ > C/C++의 프로세스 동기화

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

王林
풀어 주다: 2023-09-16 11:09:07
앞으로
1615명이 탐색했습니다.

프로세스 동기화는 데이터 불일치로 이어질 수 있는 공유 데이터에 대한 동시 액세스 문제를 해결하는 기술입니다. 협업 프로세스는 다른 프로세스에 영향을 주거나 다른 프로세스의 영향을 받아 일관성 없는 프로세스 데이터를 생성할 수 있는 프로세스를 의미합니다. 따라서 데이터 일관성을 보장하려면 프로세스 동기화가 필요합니다.

중요 섹션 문제

모든 프로세스에는 중요 섹션이라는 예약된 코드 섹션이 있습니다. 이 섹션에서 프로세스는 공용 변수 변경, 테이블 업데이트, 파일 쓰기 등을 수행할 수 있습니다. 임계 섹션에 대해 주목해야 할 핵심 사항은 한 프로세스가 임계 섹션에서 실행되는 동안 다른 프로세스가 임계 섹션에서 실행될 수 없다는 것입니다. 모든 프로세스는 임계 섹션에 들어가기 전에 권한을 요청해야 하며, 이 요청을 구현하는 코드 섹션은 entry 섹션, 코드 끝은 exit 섹션, 나머지 코드는 remaining 섹션입니다.

아래에는 특정 프로세스 P1의 중요 섹션 구조가 나와 있습니다.

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

에는 다음 세 가지 요구 사항이 있습니다. 중요 섹션이 충족되어야 합니다.

  • 상호 배타적 - 프로세스가 가정하는 경우 P1은 임계 섹션에서 실행되는 다른 프로세스가 아닌 P2가 임계 섹션에서 실행될 수 없다고 가정합니다.
  • Progress - 임계 섹션에서 프로세스가 실행되고 있지 않고 임계 섹션의 임계 섹션에 들어가려는 프로세스가 있는 경우 나머지 부분에서 실행되지 않는 프로세스만 임계 영역 진입을 요청할 수 있습니다. 섹션에 따라 선택이 무기한 연기될 수 있습니다.
  • Bounded Wait - 제한된 대기에서는 프로세스가 임계 섹션에 들어가라는 요청을 보낸 후 요청이 승인되기 전에 임계 섹션에 들어갈 수 있는 횟수에 제한이 있습니다.

운영 체제에서 중요한 부분을 처리하기 위해 일반적으로 사용되는 두 가지 방법이 있습니다.

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

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

Peterson의 솔루션

Peterson의 솔루션은 임계 영역 문제에 대한 고전적 기반 소프트웨어 솔루션입니다. 중요한 부분과 나머지 부분을 번갈아 사용하는 두 가지 프로세스로 제한됩니다. Peterson의 부분에서는 두 프로세스 간에 두 개의 데이터 항목을 공유해야 합니다. 즉,

    Boolean flag[2]
  • 여기서 변수 Turn은 임계 섹션에 들어갈 차례를 나타내고 플래그 배열은 프로세스가 임계 영역에 진입할 준비가 되어 있는지 여부.
turn == i인 경우 프로세스 Pi가 임계 섹션에 들어갈 수 있음을 의미합니다.

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

다음은 Peterson 솔루션의 프로세스 P 구조입니다.

C/C++의 프로세스 동기화Peterson 솔루션은 세 가지를 모두 유지합니다. 조건 -

상호 배타적
    − 한 번에 하나의 프로세스만 임계 섹션에 액세스할 수 있습니다.
  • Progress
  • − 중요 섹션 외부의 프로세스는 다른 프로세스가 중요 섹션에 들어가는 것을 막지 않습니다.
  • Bounded Wait
  • - 각 프로세스는 무기한 기다리지 않고 임계 섹션에 들어갈 기회가 있습니다. 동기화 하드웨어
는 두 가지 유형의 명령을 사용하여 구현되었습니다.

Test 및 Set()

    swap()
  • Test 및 Set()은 동기화 문제에 대한 하드웨어 솔루션입니다. 그 중 Lock이라는 여러 프로세스가 공유하는 공유변수가 있는데, 이는 0과 1의 값을 가질 수 있는데, 1은 잠금 획득을 의미하고 0은 잠금 해제를 의미합니다.
프로세스가 임계 섹션에 들어가려고 할 때마다 잠금 값을 쿼리해야 합니다. 잠금 값이 1이면 잠금 값이 0으로 변경되지 않을 때까지 기다려야 합니다.

아래는 TestAndSet()의 상호 배타적 구현입니다.

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

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

wait() 함수:

wait(S) {
   While S <= 0
   ; // no operation
   S--;
}
로그인 후 복사
Signal() 함수 함수:

signal(S) {
   S++;
}
로그인 후 복사
프로세스가 세마포어 값을 수정하는 중이면 다른 프로세스가 동시에 동일한 세마포어 값에 대해 작업을 수행할 수 없습니다.

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

C/C++의 프로세스 동기화 운영 체제는 두 가지 유형의 세마포어를 사용합니다.

세마포 계산

- 이 유형의 세마포 값은 무제한 도메인 내에서 달라질 수 있습니다

이진 세마포

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

위 내용은 C/C++의 프로세스 동기화의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:tutorialspoint.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿