스레드 동기화의 필요성
두 스레드(또는 프로세스)가 동시에 공유 데이터를 접근하는 경우
-> 두 스레드가 동시에 공유 데이터를 읽기만 하는 경우 : 문제 없음
-> 한 스레드는 갱신하고 다른 스레드는 읽기만 하는 경우 -> 읽고 갱신하는 순서에 따라 각 스레드가 접근하는 값이 달라질 수 있지만 공유 데이터의 훼손은 없음
-> 두 스레드가 동시에 공유 데이터를 읽어 갱신하는 경우: 공유 데이터 훼손 발생
위 경우가 스레드가 공유 데이터를 읽어 데이터의 훼손이 발생하게 된다. 즉 동기화란 스레드가 공유 데이터로 접근할 때 공유 데이터의 자원 훼손을 막는 것을 의미한다.
(스레드 동기화(thread synchronization): 다수의 스레드가 공유 데이터를 동시에 접근할 때 공유 데이터가 훼손되지 않게 스레드의 실행을 제어하는 기법)
예를 들어서 아래의 코드를 보자(이해하기 쉽게 C언어로 작성했습니다)
int k = 0;
k = 1;
if (k == 1) {
// 임계구역의 코드 실행
}
스레드 T1 스레드 T2가 존재한다고 가정했을 때 스레드 1이 int k = 0; 까지만 읽고 컨텍스트 스위칭이 발생했습니다.
그래서 스레드 T2가 실행했는데 T2는 당연하게도 int k = 0;를 읽고 k = 1; 읽고 if 문에 들어 가서 작업을 하므로 공유 데이터를 사용하고 있습니다. 그러고 스레드 T1도 다시 작업을 시작했는데 스레드 T1는 k = 1; 이 되면서 작업을 실행하게 되고 스레드 T2와 같이 공유 데이터를 사용하게 되는 경우가 발생합니다.
이러한 경우를 공유 데이터 훼손이 발생했다고 봅니다. 그리고 이러한 경우를 상호배제를 지키지 못했다고 합니다. 그리고 임계구역이란 공유 데이터에 접근하는 프로그램 코드들의 집합입니다.
문제점
여러 스레드가 (갱신되는) 공유 변수에 접근할 때, 공유 데이터 훼손
해결책: 스레드 동기화
한 스레드가 공유 데이터 사용을 마칠 때까지, 다른 스레드가 공유 데이터에 접근하지 못하도록 제어
멀티스레드의 경쟁 상황이 자주 발생하는가? : 매우 자주 발생
• 사용자의 멀티스레드 프로그램에서 자주 발생
• 커널 코드에서 매우 자주 발생(커널에 공유 데이터가 많기 때문)
멀티처리기 시스템에서 더욱 조심해야 합니다.
상호배제
멀티스레드가 실행되는 환경에서, 공유 집계판 문제에 상호배제 적용
-> 한 스레드가 임계구역 실행하고 있다면, 다른 스레드가 동일한 임계구역을 동시
에 실행할 수 없다는 조건
-> 멀티스레드 동기화를 위해 필연적으로 지켜져야 함
임계구역의 상호배제를 위한 코드 구조
일반 코드(non-critical code)
공유 데이터를 액세스하지 않는 코드
임계구역 진입 코드(entry code)
현재 임계구역을 실행 중인 스레드가 있는지 검사
• 임계구역에서 실행 중인 스레드가 없다면, 다른 스레드가 들어오지 못하도록 조치 후 진입
• 임계구역에서 실행 중인 스레드가 있다면, 진입이 가능해질 때까지 대기
임계구역 진출 코드(exit code)
대기중인 스레드가 임계구역에 진입할 수 있도록,
진입 코드에서 취한 조치 해제
상호배제 구현 목표
임계구역에 한순간에 오직 1개의 스레드만 진입하도록 해야 함
상호배제 구현 요구조건(1, 2, 3은 반드시 지켜야 한다!)
1. 상호배제가 강제되어야 한다.
2. 임계구역에 접근하고자 하는 스레드의 수행이 무한히 미루어져서는 안 된다.
3. 임계구역이 비어 있을 때, 임계구역에 진입하려고 하는 스레드는 즉시 임계구역에 들어갈 수 있어야 한다.
4. 일반 코드에서 수행이 멈춘 스레드는 다른 스레드의 수행을 간섭해서는 안 된다.
5. 스레드 개수나 상대적인 스레드 수행 속도에 대한 가정은 없어야 한다.
6. 임계구역에 들어간 스레드는 일정한 시간 내에 임계구역에서 나와야만 한다.
'컴퓨터 과학 > 운영체제' 카테고리의 다른 글
[운영체제] 프로세스 개요 (1) | 2024.10.04 |
---|---|
[운영체제] 컴퓨터 하드웨어 (2) | 2024.09.26 |
[운영체제] CPU(중앙처리장치)의 여러 구성 요소 (1) | 2024.09.11 |
[운영체제] 운영체제(Operating System)란? (2) | 2024.09.11 |