[CS] 경쟁 상태(Race Condition)

giggle·2023년 7월 31일
0

📌 경쟁 상태란?

공유 자원에 대해 여러 프로세스가 동시에 접근을 시도할 때, 타이밍이나 순서등이 결과값에 영향을 줄 수 있는 상태를 의미합니다.

이로 인해 공유 자원에 여러 프로세스가 동시에 접근할 때 자료의 일관성을 해치는 결과가 나타날 수 있습니다.

📌 경쟁 상태가 발생하는 경우

커널 코드 실행 중에 인터럽트가 발생한 경우

커널 모드에서 데이터를 로드하여 작업을 하던 도중 인터럽트가 발생하여 같은 데이터를 조작하는 경우에 발생할 수 있습니다. 커널이 가진 전역변수는 모든 프로세스의 공유물이기 때문에 경쟁상태의 가능성이 있습니다.

해결방안 : 커널모드에서 작업을 수행하는 동안, 인터럽트를 disable 시켜 CPU 제어권을 가져가지 못하도록 합니다.

프로세스가 시스템 콜을 하여 커널 모드로 진입해서 작업을 수행하는 도중에 컨텍스트 스위칭이 발생한 경우

프로세스1이 커널모드에서 데이터를 조작하던 도중 시간이 초과되어 CPU제어권이 프로세스2로 넘어가 같은 데이터를 조작하는 경우를 말합니다.

해결방안 : 프로세스가 커널모드에서 작업을 하는 경우에는 시간이 초과되더라도 CPU 제어권이 다른 프로세스에게 넘어가지 않도록 합니다.

멀티 프로세서에서 공유 메모리 내의 커널 데이터에 접근할 경우

멀티프로세스 환경에서 2개의 CPU가 동시에 커널 내부의 공유 데이터에 접근하여 조작하는 경우에 발생할 수 있습니다.

해결방안 : 커널 내부에 있는 각 공유 데이터에 접근할 때마다 그 데이터에 대해 lock/unlock함으로써 해결할 수 있다.

이밖에도 멀티스레드 환경에서 두 개 이상의 스레드가 공통의 전역변수에 접근할 경우에도 경쟁 상태가 발생할 수 있습니다.


📌 임계 영역(Critical Section)

임계 영역이란?

운영체제에서 여러 프로세스가 데이터를 공유하면서 수행될 때 각 프로세스에서 공유 자원에 접근하는 프로그램 코드 부분을 의미한다.

프로세스간에 공유자원을 접근하는데 있어서 문제가 발생하지 않도록 공유 자원의 독점을 보장해야 하는 영역입니다.

임계 영역의 문제 해결하기 위해서는 아래 3가지 조건을 만족해야합니다.

  1. Mutual Exclusion (상호 배제)
    한 프로세스가 자신의 ciritical section이면 다른 프로세스들은 ciritical section에 진입할 수 없다.

  2. Progress (진행)
    아무도 critical section에 있지 않다면, 진입하고자 하는 프로세스를 진입하게 해줘야 한다.
    즉 ciritical section에 아무도 진입하지 못하면 안되며 다음에 어떤 프로세스가 ciritical section에 진입해야 하는지는 유한한 시간에 결정되어야 한다.

  3. Bounded Waiting (유한 대기)
    프로세스가 ciritical section에 집입하기 위해 무한정으로 기다리는 현상(Starvation)이 발생해서는 안된다.

임계 영역 해결방안

유저 모드의 동기화
유저 모드는 프로세스가 실행되는 일반적인 사용자 수준의 권한으로, 하드웨어에 직접적으로 접근하는 명령을 수행할 수 없습니다. 따라서 유저 모드에서의 동기화는 특별한 하드웨어 지원 없이 간단한 동기화 메커니즘을 사용하여 구현됩니다.

  • 락(Locks): 가장 일반적으로 사용되는 유저 모드 동기화 방법으로 뮤텍스(Mutex)나 세마포어(Semaphore)와 같은 동기화 객체를 사용하여 임계 영역을 보호합니다. 하지만 유저 모드에서의 락은 커널 모드와 달리 원자적(Atomic) 연산을 지원하지 않기 때문에, 락의 사용이 더 느릴 수 있습니다.

커널 모드의 동기화
커널 모드는 운영체제 커널이 실행되는 권한 수준으로, 하드웨어에 직접적으로 접근할 수 있습니다. 따라서 커널 모드에서는 보다 강력하고 복잡한 동기화 메커니즘을 사용할 수 있습니다.

  • 커널 락(Kernel Locks): 커널 모드에서는 보다 강력한 락을 사용할 수 있으며, 원자적 연산도 지원됩니다. 따라서 더 빠른 동기화가 가능합니다. 커널 락은 스핀락(Spinlock), 세마포어(Semaphore), 뮤텍스(Mutex) 등의 형태로 구현될 수 있습니다.

-> 하지만 커널 모드에서 오류가 발생한 경우 전체 시스템에 큰 피해가 발생할 수 있기에 꼭 필요한 경우에만 사용하고, 커널 모드에 진입하는 시간을 최소화해야 합니다.


참고


피드백 및 개선점은 댓글을 통해 알려주세요😊

profile
배움을 글로 기록하는 개발자가 되겠습니다.

0개의 댓글