동기화(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)**과 같은 동기화 도구를 사용하는 것이 더 적합합니다.
'SW 사관학교 정글(Jungle) > 운영체제-PintOS' 카테고리의 다른 글
cpu와 스레드 (0) | 2024.10.01 |
---|---|
[PintOS Project 1 - Threads] 1번 Alarm Clock (0) | 2024.09.28 |
[Pintos : 동기화] 모니터(Monitors) (0) | 2024.09.25 |
[Pintos : 동기화] 락(Lock) (0) | 2024.09.25 |
[Pintos : 동기화] 세마포어(Semaphore) (1) | 2024.09.25 |