SW 사관학교 정글(Jungle)/운영체제-PintOS

[Pintos] 동기화(Synchronization)

jinsang-2 2024. 9. 25. 15:38

동기화(Synchronization)

여러 스레드가 자원을 공유할 때 발생할 수 있는 문제들을 방지하는 데 중요한 역할을 한다. 

동기화가 제대로 이루어지지 않을 때..
- 경쟁상태나 데이터 손상, 예측할 수 없는 동작과 같은 문제가 발생할 수 있다. 
- 운영체제 커널에서 이러한 문제 발생시 시스템 전체를 다운 시켜버릴 수 있다.

 

그래서 Pintos에서는 여러 동기화 프리미티브(primitives)를 제공하여 이러한 상황을 제어한다.

 

1. 인터럽트 비활성화(disabling interrupts)

동기화의 가장 원시적인 방법은 인터럽트를 비활성화하는 것이다. 

  • cpu가 인터럽트에 응답하는 것을 일시적으로 차단
  • 인터럽트가 꺼져 있으면, 현재 실행 중인 스레드는 타이머 인터럽트(timer interrupt)에 의해 선점되지 않기 때문에 다른 스레드가 현재 스레드의 실행을 중단시킬 수 없다.
    • 인터럽트가 켜져 있으면, 스레드가 실행 중일 때 언제든지 선점(preempte) 될 수 있다.
  • Pintos는 선점형 커널을 사용
    • 전통적인 유닉스 시스템은 비선점형 커널을 사용
  • 선점형 커널은 언제든지 스레드가 중단될 수 있으므로, 명시적인 동기화 작업이 더욱 중요하다. 

2. 인터럽트 비활성화를 직접 설정하는 경우

일반적으로는 인터럽트 상태를 직접 설정할 필요는 거의 없다. 대부분의 경우, Pintos에서 제공하는 다른 동기화 프리미티브를 사용하는 것이 더 적합하다. 

인터럽트 비활성화하는 것이 필요한 주된 이유
- 커널 스레드와 외부 인터럽트 핸들러 간의 동기화가 필요할 때
- 외부 인터럽트 핸들러는 sleep을 할 수 없기 때문에 대부분의 다른 동기화 방법을 사용할 수 없다.

 

비마스크 가능 인터럽트(NMI : Non-Maskable Interrupts)

일부 외부 인터럽트는 인터럽트가 비활성화되더라도 연기(postpone)할 수 없는 경우가 있는데 이러한 인터럽트를 비마스크 가능 인터럽트(NMI)라고 하며, 매우 긴급합 상황에서만 사용되어야 한다. Pintos에서는 비마스크 가능 인터럽트를 처리하지 않는다. 

 

3. 인터럽트 관련 함수

인터럽트를 비활성화하거나 활성화하는 데 필요한 데이터 타입과 함수들은 include/threads/interrupt.h에 정의되어 있습니다. 이를 통해 커널 스레드와 인터럽트 간의 동기화를 제어할 수 있습니다.

요약하면, 인터럽트 비활성화는 가장 간단하지만 제한적인 동기화 방법입니다. 주로 커널 스레드와 외부 인터럽트 핸들러 간의 동기화에 사용되며, 대부분의 상황에서는 Pintos가 제공하는 세마포어나 **락(lock)**과 같은 동기화 도구를 사용하는 것이 더 적합합니다.