- Concurrency
- thread 들 사이의 충돌
-> single thread 를 process 라 부름
-> 그렇기 때문에 precess 들의 충돌이라 부르는 것임.
- OS 구현 시 조심해야 하는 부분 ( 충돌이 나지 않도록 충분히 고민 )
- 자원 allocation & deallocation
-> Processor time
-> Memory
-> files
-> I/O devices- data 와 resource 들을 protect 해야 함.
=> "mutual exclusion" 이 만족되지 않으면 => "critical section" 에서 => "race condition" 이 발생됨.
- concurrency 에 대한 중요 용어
- Race condition
-> 어떤 프로세스 ( or thread ) 가 다른 프로세스에게 영향을 주면 안됨.
-> 두개 이상의 프로세스가 동시 접근 시 결과 예측 불가- Mutual exclusion ( 상호 배제 )
-> 하나의 프로세스만이 자원을 사용- Critical section
-> 공유하는 자원을 접근하는 "코드"
-> 공유자원은 IPC 에서 공유하는 shared memory 공간이 될 수 있음.- Starvation
-> 자원이 배정되어야 하지만 오랫동안 배정안된 상태- Deadlock
-> 영원히 자원 배정을 못받음. ( starvation 상황에서 벗어나지 못함.)
- producer / consumer problem
producer 가 buffer 에 item 저장 ( buffer 는 shared memory 방법 사용 )
consumer 는 buffer 에서 한번에 하나씩 정보 얻을 수 있음.
이러한 상황에서 buffer 는 size 가 정해져있는 circular buffer 를 사용한다.
producer 가 buffer 에 쓰려고 하지만 buffer 가 꽉차있으면 producer 는 busy waiting 을 수행.
consumer 가 읽으려는 index 에 아무것도 없으면, consumer 는 busy waiting 을 수행.
- Interrupt
- Interrupt 발생 시 kernel 은 일시정지 후 interrupt 코드 실행
-> 전부 실행했으면 다시 본인이 하던 일로 돌아와 다음 instruction 부터 실행하거나 context switch
- 각 상황에서의 race condition 발생상황
- Uniprocessor
-> shared memory 방식을 사용했을 때 동시에 critical section 에 접근하면 발생- One process ( multithread )
-> data area 를 동시 접근했을 때 발생
- Race condition 예방 방법
- atomic 하게 실행 ( critical section 실행 시 중간에 끊기지 않도록 덩어리로 실행 )
-> interrupt 가 들어와도 interrupt 를 뒤로 미루고 계속 code 실행
-> critical section 의 길이가 길면 안됨.
- critical section 주위를 fence 로 감싸기
-> fence 안에서는 mutual exclusion 이 보장된다.
-> fence 안에서는 critical section이 atomic 하게 실행되지 않는다.
-> 담장에 들어간 상태에서는 interrupt 가 발생되면 interrupt 처리하고 다시 이어서 실행.
-> 하지만 하나의 프로세스가 들어간 상황에서는 다른 프로세스가 들어갈 수 없음.