기술나눔

OS_동기화 및 상호 배제

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

2024-07-04: 운영 체제 동기화 및 상호 배제 연구 노트


동시 프로세스나 프로그램은 실행 시 닫히지 않습니다. 즉, 두 프로그램이 별도의 영역에서 공유 리소스를 사용하는 경우 각 실행 결과가 다를 수 있습니다.
여기에 이미지 설명을 삽입하세요.
그 이유는 프로그램 a와 프로그램 b가 모두 액세스해야 하는 공유 리소스 x를 보호하지 않았기 때문입니다.


9.1 동기화와 상호 배제의 기본 개념

9.1.1 동기화 관계

상호 제한적인 관계는 동기화입니다. 동기화를 간단히 이해하면 프로세스 실행에는 순서가 있어야 한다는 것입니다.
여기에 이미지 설명을 삽입하세요.


9.1.2 상호 배타적 관계

서로 간접적으로 제한하는 관계를 상호 배타적 관계라고 합니다.
여기에 이미지 설명을 삽입하세요.


9.1.3 주요 자원

  • 일정 기간 동안 하나의 프로세스만 접근이 허용되는 자원을 핵심 자원(또는 독점 자원)이라고 합니다.
  • 중요한 자원을 공유하려면 프로세스 간에 상호 배제를 사용해야 합니다.

"생산자 및 소비자 모델"
여기에 이미지 설명을 삽입하세요.카운터+ +

首先把变量放到寄存器里面
register1 = counter;
接下来对寄存器进行一个自增
register1 = register1 + 1;
再把结果返回到counter里
counter = register1;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

카운터- -

首先把变量放到寄存器里面
register2 = counter;
接下来对寄存器进行一个自减
register2 = register2 - 1;
再把结果返回到counter里
counter = register2;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

여기에 이미지 설명을 삽입하세요.

해결 방법: 카운터를 중요한 리소스로 취급하고 프로세스가 변수 카운터에 상호 액세스할 수 있도록 허용합니다. (동기화 메커니즘은 나중에 배우게 됩니다.)


9.1.4 중요 섹션

하드웨어에 중요한 리소스이든 소프트웨어에 중요한 리소스이든 여러 프로세스가 상호 액세스해야 합니다.
여기에 이미지 설명을 삽입하세요.
이 영역은 본질적으로 코드입니다.

  • 진입 지역
  • 중요 섹션
  • 출구 지역
  • 남은 면적

9.1.5 동기화 메커니즘은 규칙을 따라야 합니다

  • 무료로 입장 가능

크리티컬 섹션에 프로세스가 없다는 것은 크리티컬 섹션 자원이 유휴 상태라는 것을 의미한다. 크리티컬 섹션 진입을 요청한 프로세스는 자원을 효과적으로 활용하기 위해 즉시 자신의 크리티컬 섹션 진입을 허용해야 한다.

  • 바쁘다면 기다려라

기존 프로세스가 임계 영역에 진입하면 임계 리소스에 액세스하고 있음을 나타냅니다. 따라서 임계 영역에 진입하려는 다른 프로세스는 임계 리소스에 대한 상호 배타적 액세스를 보장하기 위해 기다려야 합니다.

  • 제한된 기다림

중요한 리소스에 액세스해야 하는 프로세스의 경우 "죽기를 기다리는 중" 상태에 빠지지 않도록 제한된 시간 내에 자체 임계 섹션에 들어갈 수 있는지 확인해야 합니다.

  • 양보하고 기다려라

프로세스가 자체 임계 섹션에 진입할 수 없는 경우 프로세스가 "busy wait" 상태에 빠지는 것을 방지하기 위해 프로세서(CPU)를 즉시 해제해야 합니다.


9.2 소프트웨어 동기화 메커니즘

9.2.1 단일 마크 방식

  • 임계 영역에 프로세스가 있는지 여부를 나타내기 위해 공용 정수 변수를 설정합니다. 임계 영역에 이미 프로세스가 있는 경우 프로세스가 임계 영역을 떠난 후 플래그를 통해 루프 검사를 기다립니다. 출구 영역에서 수정됩니다.
  • 단일 플래그 방법은 공개 정수 변수 Turn을 설정하여 임계 구역에 들어갈 수 있는 프로세스 번호를 나타냅니다. Turn=0이면 프로세스 P0이 임계 구역에 들어갈 수 있습니다.
  • Turn=1일 때 프로세스 P1은 임계 구역에 들어갈 수 있으며, 임계 구역을 나갈 때 임계 구역 사용 권한은 다른 프로세스에게 주어집니다. (Pi가 임계 구역을 나갈 때, Turn=j로 두십시오)

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.
两个进程必须交替进入临界区,若一个进程不再进入临界区,则另一个进程也无法进入临界区,违背了“空闲让进”准则


9.2.2 이중 표시 우선 확인 방법

이중 플래그 우선 확인 방법은 부울 배열 플래그[2]를 설정하여 각 프로세스가 임계 영역에 진입하려는 의지를 표시합니다. flag[i]=true는 Pi가 임계 영역에 진입하기를 원한다는 것을 의미합니다.

  • Pi가 크리티컬 섹션에 진입하기 전에 먼저 상대방이 크리티컬 섹션에 진입했는지 확인하세요. 그렇다면 기다리세요.
  • 그렇지 않으면 임계 섹션에 들어가기 전에 플래그[i]를 true로 설정하십시오.
  • Pi가 임계 섹션을 종료하면 플래그[i]를 false로 설정합니다.

여기에 이미지 설명을 삽입하세요.

여기에 이미지 설명을 삽입하세요.

  • while 루프는 신호등 메커니즘과 동일합니다.
  • 상대방의 깃발을 세우는 것은 상대방의 신호등을 바꾸는 것과 같습니다.
  • 그러나 두 프로세스 모두 플래그를 먼저 확인하고(신호등을 먼저 확인) 처음에는 둘 다 거짓(모두 녹색등)이므로 두 프로세스가 동시에 신호등을 통과하여 함께 임계 구간에 진입하는 것이 가능합니다. .

9.2.3 더블마크 사후검사 방법

이중 플래그 사후 확인 방법은 상대방의 플래그를 확인한 후 자체적으로 설정합니다. 이 두 작업은 한 번에 수행할 수 없으므로 두 프로세스가 동시에 임계 영역에 들어갈 수 있습니다. 먼저 자신의 플래그를 설정한 다음 상대방의 플래그를 확인하고, 상대방의 플래그가 true이면 기다리며, 그렇지 않으면 임계 섹션에 들어가는 방법이 고안되었습니다.

여기에 이미지 설명을 삽입하세요.
여기에 이미지 설명을 삽입하세요.


9.2.4 피터슨 알고리즘

Peterson의 알고리즘은 다음을 결합합니다.단일 마크 방식그리고이중 표시 사후 확인 방법아이디어는 상호 배타적 액세스 문제를 해결하기 위해 flag[]를 사용하고 기아 문제를 해결하기 위해 Turn을 사용하는 것입니다.

양 당사자가 임계 영역에 진입하기 위해 경쟁하는 경우 상대방에게 임계 영역에 진입할 수 있는 기회를 제공하는 프로세스가 허용될 수 있습니다.
각 프로세스는 임계 영역에 진입하기 전에 자신의 플래그를 설정하고 진입이 허용되는 턴 플래그를 설정한 후 상대방의 플래그를 감지하고 동시에 턴을 수행하여 한 프로세스만 진입할 수 있도록 합니다. 양 당사자가 동시에 임계 영역에 들어가도록 요청합니다.
여기에 이미지 설명을 삽입하세요.
기다릴 권리를 포기하지 않음
여기에 이미지 설명을 삽입하세요.


9.3 하드웨어 동기화 메커니즘

각 프로세스가 임계 영역에 진입하는 것을 상호 배제하는 문제를 소프트웨어가 해결하기는 어렵고, 따라서 컴퓨터는 문제를 해결하기 위해 몇 가지 특별한 하드웨어 지침을 제공합니다.

9.3.1 인터럽트 끄기

(1) 인터럽트 끄기의 정의

  • 인터럽트 끄기는 CPU의 PSW 레지스터에 있는 비트를 수정하는 것을 의미합니다. 이 비트는 현재 CPU가 해당 인터럽트에 응답할지 여부를 제어합니다. 마스크 불가능한 인터럽트는 중지할 수 없습니다.
  • 운영 체제의 프로세스 스케줄링은 클록 인터럽트와 같은 인터럽트에 의존합니다.
  • 임계 섹션에서 프로세스를 실행하는 동안 컴퓨터 시스템은 인터럽트를 종료합니다. 이는 스케줄링을 트리거하지 않으며 프로세스나 스레드 전환도 발생하지 않습니다.

(2) 인터럽트 끄기의 단점

  • 터미널을 잘못 사용하면 심각한 결과를 초래할 수 있습니다.
  • 종료 시간이 너무 길면 시스템 효율성에 영향을 미칩니다.
  • 인터럽트를 끄는 방법은 다중 CPU 시스템에는 적용되지 않습니다. 하나의 프로세서에서 인터럽트를 끄더라도 프로세스가 다른 프로세서에서 동일한 중요한 코드를 실행하는 것을 방지할 수 없습니다.

9.3.2 테스트 및 설정 명령(TS 명령)

여기에 이미지 설명을 삽입하세요.

TS 명령은 실행 프로세스가 분할 불가능한 함수 프로세스(원시)로 간주될 수 있습니다.

  • 잠금에는 두 가지 상태가 있습니다.
    • *lock=FALSE는 리소스가 사용 가능함을 나타냅니다.
    • *lock=TRUE는 리소스가 사용되고 있음을 나타냅니다.

TS를 사용하여 중요 섹션을 관리하고 각 중요 리소스에 대한 잠금을 설정하세요.

  • 초기값은 FALSE이며 중요한 리소스가 유휴 상태임을 나타냅니다.
  • 프로세스가 임계 섹션에 들어가기 전에 먼저 TS를 사용하여 잠금을 테스트합니다. FALSE인 경우 TRUE 값을 잠금에 입력하고 할당하여 중요 리소스를 닫을 수 있습니다.

9.3.3 스왑 명령

여기에 이미지 설명을 삽입하세요.
이를 교환 명령이라고 하며 두 단어의 내용을 교환하는 데 사용됩니다.

  • 초기 값은 FALSE로 각 중요 리소스에 대해 전역 부울 변수 잠금을 설정합니다.
  • 위의 하드웨어 지침을 사용하여 프로세스 상호 배제를 완료하세요.
  • 그러나 이 방법을 사용하면 액세스 프로세스가 지속적으로 테스트되고 "바쁨 대기" 상태가 되어 "권리 대기" 원칙을 준수하지 않게 됩니다.

9.4 세마포어 메커니즘

9.4.1 정수 세마포어

자원 수를 나타내는 데 사용되는 정수 S로 정의됩니다. 이 정수 세마포에는 초기화(초기값 할당), 대기(감소), 신호(증가)의 세 가지 작업만 있습니다.
여기에 이미지 설명을 삽입하세요.

  • 대기 및 신호는 모두 원자성 작업이므로 실행 중에 중단될 수 없습니다.
  • 프로세스가 세마포어를 수정하면 다른 프로세스가 동시에 세마포어를 수정할 수 없습니다.

9.4.2 레코드 세마포어

"busy wait" 현상이 없는 프로세스 동기화 메커니즘

  • 자원의 개수를 나타내기 위해 사용되는 정수 변수 값 외에
  • 또한 자원을 기다리는 모든 프로세스를 연결하려면 프로세스 연결 목록 L을 추가해야 합니다.

여기에 이미지 설명을 삽입하세요.

  • 대기 작업은 P 작업과 동일합니다.
  • 신호 작동은 V 작동과 동일합니다.
  • 이름만 다를 뿐 기능은 똑같습니다
  • 대기(A) = P(A)
  • 신호(B) = V(A)

(1) 세마포어를 사용하여 프로세스 상호 배제 실현

상호 배타적인 세마포어 mutex=1로 설정한 다음, wait(mutex)와 signal(mutex) 사이에 중요한 리소스에 접근할 수 있도록 각 프로세스의 중요한 섹션을 배치합니다.
여기에 이미지 설명을 삽입하세요.


(2) 세마포어를 사용하여 프로세스 동기화 달성

동기화 세마포어 S=0으로 설정하여 명령문 신호(S)가 먼저 실행되고 그 다음 대기(S)가 실행되도록 합니다.
여기에 이미지 설명을 삽입하세요.