•
참고 강의
contents
데이터의 접근
컴퓨터 시스템 안에서 무엇이든 이런 경로를 거친다.
•
누가 먼저 읽어갔느냐에 따라서 결과가 달라질 수 있다. → Sychronize 문제
여러 E-Box가 Storage Box를 접근하는 경우 문제가 발생할 수 있음
Race Condition : 여러 주체가 하나의 데이터를 동시에 접근하려고 할 때 발생
•
이걸 조율해주는 방식 필요
◦
Multiprocessor System에서 메모리를 공유하고 있다면 발생할 수 있다.
ex. 하나의 CPU가 A를 읽어가는 동안 다른 CPU가 A를 읽어갈 수 있기 때문에
◦
공유 메모리를 사용하는 프로세스들 간에도 문제 발생 가능
◦
운영 체제 커널 내부 데이터를 접근하는 루틴들 간
ex. 운영 체제 커널의 코드가 실행이 될 때 커널 데이터를 접근하게 되면 문제 발생
→ 유저 레벨 자체에서는 동시성 문제가 많이 생기지 않음
OS에서 race condition은 언제 발생하는가?
1.
kernel 수행 중 인터럽트 발생 시
2.
Process가 system call을 하여 kernel mode로 수행 중인데 context switch가 일어나는 경우
3.
multiprocessor에서 shared memory 내의 kernel data
interrupt handler v.s. kernel
•
결과적으로 Count가 감소한 것이 반영이 안된다.
•
중요한 변수값을 건드리는 동안에는 interrupt가 들어와도 interrupt처리 루틴으로 넘기는 것이 아니라 이 작업이 끝날 때까지는 interrupt를 disable 시켰다가 작업이 끝난 다음에 interrupt 처리 루틴으로 넘긴다.
→ race condition이 발생하지 않도록
Preempt a process running in kernel?
•
운영체제에게 서비스를 대신해달라고 하는 경우 발생 → 독점적으로 사용하는 것이 아니라 할당 시간이 끝나면 CPU를 반납해야 함.
•
Count가 2 증가해야 하지만 동기화 문제때문에 1이 증가한다.
•
해결책
◦
커널 모드에서 수행 중일 때는 할당 시간이 끝나도 CPU를 preempt하지 않는다. 커널 모드에서 사용자 모드로 돌아갈 때 preempt한다.
multiprocessor
앞에 있는 해결법으로는 해결이 되지 않는 문제 → 작업의 주체가 여럿이라서 생기는 문제
•
해결법1 : 데이터를 들고 가기 전에 데이터에 대한 lock를 걸어서 데이터에 접근을 못하게 한다.
◦
커널 내부에 있는 각 공유 데이터에 접근할 때마다 그 데이터에 대한 Lock / Unlock을 하는 방법
•
해결법2 : 운영체제 커널에 접근하는 CPU를 매 순간 하나만 접근할 수 있도록 한다.(비효율적)
◦
한번에 하나의 CPU만이 커널에 들어갈 수 있게 하는 방법
Process Synchronization 문제
•
공유 데이터(shared data)의 동시 접근(concurrent access)은 데이터의 불일치 문제(inconsistency)를 발생시킬 수 있다.
•
일관성 유지를 위해서는 협력 프로세스(cooperating process)간의 실행 순서(orderly execution)를 정해주는 메커니즘 필요
Race condition
•
여러 프로세스들이 동시에 공유 데이터를 접근하는 상황
•
데이터의 최종 연산 결과는 마지막에 그 데이터를 다룬 프로세스에 따라 달라짐
P1 수행 중에 timer interrupt가 발생해서 context switch가 일어나면 문제가 생기는가?
보통은 문제가 생기지 않지만, Shared Data를 사용하거나, 커널에 있는 데이터를 변경하는 경우 문제가 생길 수 있다.
The Critical-Section Problem
n개의 프로세스가 공유 데이터를 동시에 사용하기를 원하는 경우
각 프로세스의 code segment에는 공유 데이터를 접근하는 코드인 critical section이 존재
하나의 프로세스가 critical section에 있을 때 다른 모든 프로세스는 critical section에 들어갈 수 없어야 한다.
Critical-Section : 공유 데이터를 접근하는 코드 → 두 개 이상의 프로세스가 동시에 사용할 수 없는 자원