22_원자적 트랜잭션 (Atomic Transaction)
- 시스템 모델(system model), 로그 기반 복구(log based recovery), 검사점(checkpoint)
임계 구역의 상호 배제는 임계 구역이 원자적으로 수행된다는 것을 보장한다. 두 개의 임계 구역이 동시에 병렬로 수행된다고 하더라도 그 결과는 어떤 순서인지는 지정할 수 없지만 마치 두 개를 한번에 하나씩 순차적으로 수행시킨 것과 같게 된다.
가장 대표적인 예는 은행 이체 시스템이다. 자금 이체의 경우 한 통장에서 돈이 출금되어 다른 통장으로 입금된다. 이때 일관성을 위해서는 출금과 입금이 둘 다 발생하던지 둘 다 발생하지 않는 것이다.
[시스템 모델(System Model)]
하나의 논리적인 기능을 수행하는 명령(또는 연산)의 집합을 트랜잭션이라고 한다. 트랜잭션을 처리하는데 있어 주요 문제는 컴퓨터 시스템 안에서 어떤 고장이 발생할 가능성이 있더라도 원자성(atomicity)을 보장해야 한다는 것이다.
종료된 트랜잭션이 수행을 성공적으로 마쳤으면 이 트랜잭션은 완료(commit)된 것이고 그렇지 않으면 철회(rollback)된 것이다.
시스템이 어떻게 원자성을 보장해 줄 수 있는가를 살펴보려면 먼저 하드웨어 장치들이 어떻게 트랜잭션의 자료들을 저장하는지 살펴보아야 한다. 저장 장치에 따라 속도, 용량, 신뢰성 등 다양 하다.
- 휘발성(volatile) 저장 장치 : 시스템이 고장나면 사라진다. 속도가 빠르며 직접 접근이 가능하다. 메모리, 캐시 등이 있다.
- 비휘발성(Nonvolatile) 저장 장치 : 시스템이 고장나더라도 보존된다. 메모리보다 신뢰성은 높지만 속도가 느리다.
- 안전(Stable) 저장 장치 : 똑 같은 정보를 여러 대의 디스크에 중복해서 기록 한다. 한 대가 고장나도 다른 디스크에는 영향이 없는 독립 디스크여야 한다. 정보를 갱신 할 때 미리 정의된 방식으로 신중하게 갱신 해야 한다.
[로그 기반 복구(Log Based Recover)]
원자성을 보장해 주는 방법은 트랜잭션에 의해 접근된 자료에 가해지는 모든 변경 내역을 안전 저장 장치에 기록해 놓는 것이다. 이러한 형태의 기록을 많이 사용되는 기법은 로그 우선 쓰기(write ahead logging)방식이다.
- 트랜잭션 이름 : 쓰기 연산을 수행한 트랜잭션 고유한 이름
- 자료 항목 이름 : 써진 자료 항목의 고유한 이름
- 이전 값 : 쓰기 연산 이전에 그 자료 항목에 저장되어 있던 값
- 새 값 : 쓰기 연산 이후에 그 자료 항목에 저장 될 값
- 트랜잭션 T1가 시작하기 전에 <T1 starts>라는 로그 기록
- 트랜잭션 T1 수행중에 T1쓰기를 할 때마다 그 전에 해당하는 새로운 레코드가 로그에 기록
- T1 완료되면 <T1 commits>레코드가 로그에 기록
로그를 쓰는 데는 성능 손실을 주의해야 한다. 각 논리적인 쓰기마다 두 번의 물리적인 쓰기가 필요하다. 또한 자료 자체와 변경을 기록하는 로그를 위하여 더 많은 저장 공간을 필요로 하며 기록을 하는 동안 오버헤드가 발생 한다. 중요한 자료의 경우 안정성 및 복구를 위하여 추가적인 비용이 필요하다.
로그를 사용하면 비휘발성(nonvolatile) 저장 장치 자체의 정보 손실을 야기 하지 않는 어떠한 고장도 처리할 수 있다. 복구 알고리즘은 두 개의 프로시저를 사용한다.
- Undo : 갱신한 모든 자료 항목의 값들을 T1 시작되기 이전의 값으로 되돌려 놓는다.
- Redo : 갱신한 모든 자료 항목에 새로운 값들을 넣는다.
트랜잭션 T1이 처리 도중 철회(rollback) 되면 단순히 undo(t1)을 호출 하여 지금까지 부분적으로 갱신했던 자료 항목들이 원래의 값으로 복구된다.
시스템 고장이 발생하면 로그를 보면서 redo, undo를 결정 한다.
- 로그에 <t1, start>레코드는 있지만 <t1, commits>레코드가 없다면 트랜잭션 t1은 undo 된다.
- 로그에 <t1, starts>와 <t1, commits> 두 개의 레코드가 다 있다면 트랜잭션 t1은 redo 된다.
[검사점(checkpoint)]
시스템 고장이 발생하면 우리는 로그를 보면서 redo 또는 undo 트랜잭션을 결정한다. 원칙적으로는 로그 전체를 조사하면서 이 작업을 진행해야 하지만 많은 시간 소모와 오버헤드가 발생 한다.
이러한 불필요한 오버헤드를 줄이기 위해 검사점(checkpoint)라는 개념을 도입한다. 시스템은 우선 쓰기 로그(write ahead log)를 유지하면서 주기적으로 검사점을 수행한다.
로그의 <checkpoint> 레코드는 시스템 복구 작업을 보다 능률적으로 만들어 준다, 트랜잭션 t1은 검사점 이전에 완료 했다고 하자. 그러면 로그에서 <T1, commits> 레코드가 <checkpoint> 레코드보다 앞서 나온다. 그러면 t1이 수행한 모든 변경은 checkpoint 이전에 안전 장치에 이미 기록 되었던지 아니면 검사점 작업의 일환으로 안전 저장 장치에 기록되었을 것이다. 따라서 시스템 복구 시 T1에 대한 redo 연산을 할 필요가 없다.
- T에 속한 모든 작업에 대해 <T, commits>가 로그에 기록되어 있으면 redo(t)를 수행 시켜 준다
- T에 속한 모든 작업에 대해 <T, commits>가 로그에 기록되어 있지 않으면 undo(t)를 수행 시켜 준다.
[참고자료]
Operating System Concept / 홍릉과학출판사
'SW Engineering > OS Concept' 카테고리의 다른 글
24_교착 상태(Deadlock) (0) | 2015.07.16 |
---|---|
23_원자적 트랜잭션 (Atomic Transaction) – 직렬화, 락킹 프로토콜, 타임스탬프 프로토콜 (0) | 2015.07.16 |
21_프로세스 모니터링 (0) | 2015.07.16 |
20_프로세스 임계 구역 (0) | 2015.07.16 |
19_스케줄링 알고리즘 - 우선순위, 라운드 로빈, 다단계 큐, 다단계 피드백큐 스케줄링 (0) | 2015.07.16 |