- 공유 데이터(shared data)의 동시 접근(concurrent access)은 데이터의 불일치 문제(inconsistency)를 발생시킬 수 있다.
- 일관성(consistency)유지를 위해서는 협력 프로세스 (cooperating process)간의 실행 순서(orderly execution)을 정해주는 메커니즘 필요
Race Condition
- 여러 프로세스들이 동시에 공유 데이터를 접근하는 상황
- 데이터의 최종 연산 결과는 마지막에 그 데이터를 다룬 프로세스에 따라 달라짐
- S-Box(Memory address space) 를 공유하는 E-Box(CPU-Process)가 여럿 있을 경우 Race Condition의 가능성이 있음
- ( -> count = 5일때 각 E-Box가 연산 후 저장할때 4,6 어떤값이 저장될지 모름)
- OS에서 Race Condition은 언제 발생하는가?
- kernel 수행 중 인터럽트 발생 시
- 해결책 : 중요 변수 값을 변경하는 중에는 Interrupt가 발생해도 인터럽트 처리 루틴으로 보내는 것이 아니라 Interrupt가 발생하지 않도록 조치
- Process가 system call을 하여 kernel mode로 수행 중인데 context switch가 일어나는 경우
- 해결책 : 커널 모드에서 수행중일 때는 CPU를 preempt하지 않음.
- 커널 모드에서 사용자 모드로 돌아갈 때 preempt
- Multiprocessor에서 shared memory 내의 kernel data
- 해결책 : 커널 내부에 있는 각 공유 데이터에 접근할 때마다 그 데이터에 대한 lock/unlock을 하는 방법
- kernel 수행 중 인터럽트 발생 시
race condition을 막기 위해서는 concurrent process는 동기화(syschronize)되어야 한다.
Critical Section Problem
- n개의 프로세스가 공유 데이터를 동시에 사용하기를 원하는 경우
- 각 프로세스의 code segment에는 공유 데이터를 접근하는 코드인 critical section이 존재
- Problem
- 하나의 프로세스가 critical section에 있을 때 다른 모든 프로세스는 critical section에 들어갈 수 없어야 한다.
Initial Attempts to Solve Problem
- 두 개의 프로세스가 있다고 가정 P0, P1
- 프로세스들의 일반적인 구조
- 프로세스들은 수행의 동기화(Synchronize)를 위해 몇몇 변수를 공유할 수 있다. -> synchronization variable
프로그램적 해결법의 충족 조건
- Mutual Exclution
- 프로세스 Pi가 critical section 부분을 수행중이면 다른 모든 프로세스들은 그들의 critical section에 들어가면 안됨
- Progress
- 아무도 critical section에 있지 않은 상태에서 critical section에 들어가고자 하는 프로세스가 있다면 critical section에 들어가게 해준다.
- Bounded Waiting
- 프로세스가 critical section에 들어가려고 요청한 후부터 그 요청이 허용될 때까지 다른 프로세스들이 critical section에 들어가는 횟수에 한계가 있어야 한다.
- 가정
- 모든 프로세스들의 수행 속도는 0보다 커야 한다.
- 프로세스들 간의 상대적인 수행 속도는 가정하지 않는다.
Algorithm 1
- Synchronization variable
- int turn;
- initially turn = 0; => Pi can enter its critical section if(turn == 1)
- Process P0
- Satisfies mutual exclusion, but not progress
- 즉, 과잉 양보 : 반드시 한번씩 교대로 들어가야만 함(swap - turn), turn 값을 내 값으로 바꿔줘야만 내가 들어갈 수 있음. 특정 process가 더 빈번히 critical section을 들어가야 한다면?
Algorithm 2
- Synchronization variable
- boolean flag[2];
- initially flag[모두] = false;
- Pi ready to enter its critical section if(flag[i]==true)
- Process Pi
- Satisfies mutual exclution, but not progress requirement
- 둘 다 2행까지 수행 후 끊임 없이 양보하는 상황 발생 가능
Algorithme 3 (Peterson's Algorithm)
- Combined synchronization variables of algorithm 1 and 2
- Process Pi
- Meets all three requierments; solves the critical section problem for two processes
- Busy Waiting = spin lock (계속 CPU와 memory를 쓰면서 wait)
Synchronization Hardware
- 하드웨어 적으로 Test&Modify를 atomic 하게 수행할 수 있도록 지원하는 경우 앞의 문제는 간단히 해결 가능
- Mutual exclution with Test & Set instruction
'OS(운영체제)' 카테고리의 다른 글
Process Synchronization2 (0) | 2023.08.06 |
---|---|
Scheduling Algorithm(FCFS,SJF,Priority,RR, Multilevel, etc.) (0) | 2023.08.06 |
CPU Scheduling 1 (0) | 2023.07.29 |
Process Management 2 (0) | 2023.07.29 |
Process Management 1 (0) | 2023.07.29 |