CS/OS

[OS]경쟁 상태란?

frog-in-well 2022. 7. 25. 22:00

0. 들어가기 전에

경쟁 상태 : 여러 프로세스가 공유 자원에 접근할 수 있는 상태

임계 구역 : 경쟁 상태가 발생할 수 있는 코드 영역

동기화 : 임계 구역을 보호하고 이를 통해 경쟁 상태를 방지하는 것

1. 경쟁 상태란?

여러 개의 프로세스가 동일한 자료에 접근하여 조작할 때, 그 실행 결과가 접근이 발생한 특정 순서에 의존하는 상황.

경쟁 상태로부터 보호하기 위해 한 순간에 하나의 프로세스만이 변수를 조작하도록 보장해야 한다. 이를 위해 동기화가 필요하다.

2. 경쟁 상태 발생 케이스

프로세스는 자신의 데이터로 일을 수행한다. 기본적으로 프로세스간에는 메모리를 공유하지 않기 때문에 운영체제를 사용해서 일을 수행하는 경우 경쟁 상태가 발생하게 된다.

2.1 프로세스 A가 커널 모드 수행 중 context switching 발생

  • 프로세스 A가 system call을 통해 커널 모드에서 작업 W를 수행중이다.
  • 이 때 timer에 의해 프로세스 B에게 CPU를 빼앗긴다.
  • 프로세스 B도 system call을 통해 커널 모드에서 동일한 작업 W를 수행하게 된다.

이렇게 되면 커널 모드에서 프로세스 A가 수행하는 결과가 프로세스 B가 수행할 때에는 갱신되지 않기 때문에 경쟁 조건이 발생한다.

  • 해결 방법 : 커널 모드 중에는 CPU를 선점하지 않도록 한다. (비선점형 커널)

2.2 프로세스 A가 커널 모드 수행 중 interrupt 발생

  • 프로세스 A가 system call을 통해 커널 모드에서 작업 W를 수행한다.
  • 인터럽트가 발생하고 인터럽트 처리 루틴이 실행된다.
  • 인터럽트 서비스 루틴에서 같은 작업 W를 한다.

인터럽트 서비스 루틴이 공유 데이터를 수정하는 작업을 하게 되면 경쟁 조건이 발생한다.

  • 해결 방법 : 커널 모드에서 특정한 값을 처리 중일 때에는 인터럽트를 금지시킨다. (비선점형 커널)

2.3 멀티 프로세서 환경에서 공유 메모리 접근

만약 CPU가 2개 이상이라면 한 쪽 CPU에서는 커널 모드 중 인터럽트 금지를 하더라도 다른 CPU에서는 여전히 공유 데이터에 접근이 가능하다.

  • 한 번에 하나의 CPU만 커널 모드에 들어갈 수 있도록 한다.
    • 오버헤드가 발생한다
  • 공유 메모리에 접근 시 lock/unlock 방식을 사용한다.

비선점형 커널이 임계 구역 문제 해결을 위해 더 좋은 선택인 것 같지만 커널 모드 프로세스가 독점할 위험도 적고 응답이 더 빠를 수 있다. 또한 실시간 프로세스가 현재 커널에서 실행 중인 프로세스를 선점할 수 있기 때문에 실시간 프로그래밍에서는 선점형 커널을 더욱 선호한다.