다수의 threadconcurrent하게 실행 => thread 충돌문제 발생이 가능하다.

cf. single thread의 경우, process 충돌이라고도 부른다.

 

<핵심용어>

- race condition: 2개 이상의 process가 같은 메모리를 거의 동시에 접근(access)할 때 값을 바꾸는 것을 예측할 수 없는 경우

- mutual exclusion: 2개 이상의 process가 같은 메모리를 거의 동시에 접근할 때 한번에 한 process씩 접근하게 함(상호배척)

- critical section: 다른 process와 공유하는 메모리(resource)를 접근하게 하는 코드

- starvation: 자원이 배정되지 않고 오래 기다리는 상태

- deadlock: 영원이 자원이 배정되지 않는 상태(starvation이 지속)

 

mutual exclusion이 보장되게 critical section을 잘 짜서 race condition이 발생 안하게 해야함

 

 

<Race condition>: cpu가 여러개가 아닌 1개일 때도 발생가능

producer processconsumer process끼리 정보전달을 위해서 IPC를 이용해야 함

=> IPC(shared memory)를 사용할 때 충돌(race condition)이 발생가능하다.

 

 

 

 

<processor1개일 때의 Race condition>

load: register를 불러옴

store: 증가시킨 register값을 critical section(counter)에 저장

 

 

<Interrupt>: 컴퓨터 하드웨어 장치가 cpu에게 event 발생을 알리는 방법

 

 

- interrupt가 걸릴 수 있는 곳을 왼쪽에 표시한 것. (2번째에서 interrupt가 걸린것)

interrupt 종류에 따라 바뀔 수 있고 위의 그림은 producer->consumer로 바뀐 것.

 

- Multi threading의 경우에도 global variablerace condition이 발생가능

(따라서 하나의 process에서 여러 thread를 사용해도 race condition이 발생가능)

 

<race condition을 어떻게 막을 수 있을까?>

atomic operation: critical sectionassembly 전체를 실행

--> assembly instruction이 여러줄이면 interrupt 지연으로 문제발생이 가능

 

2. fence: critical section 주변에 fence를 만들기

--> mutual exclusion보장 가능하며 실행동안 interrupt가 걸리기에 context switch

가능하다 (atomic operation이 아님).

 

 

<Three Requires: critical-section>- 아래 3가지 모두를 만족해야 한다.

Mutual Exclusion: 하나를 실행중일 때 다른 process 실행X

Progress: 아무도 공유data를 접근하지 않을 때, 나의 critical section data를 진행해서 공유 data를 쓸 수 있어야 한다.

Bounded Waiting: 누가 공유data에 접근해있고, 기다릴 때 그 시간이 정해져 있다.

 

<Software Solution>- code 설계하는 법 

 

 

[software solution-1]

if가 아닌 P0가 아닌 P1이 먼저 실행되면

P1while문에 걸려 fence 안으로 들어갈 수 없다.

 

 

[software solution-2]

- 3가지 require들을 만족한다.

- but, 3개 이상의 process에서는 만족X

 

 

[software solution-3]

- 3개 이상의 process에서도 만족

- 하지만 실용적이지 않아 사용X

 

'Computer System > 운영체제' 카테고리의 다른 글

this->OS.code(7)  (0) 2022.10.31
this->OS.code(6)  (0) 2022.10.31
this->OS.code(4)  (0) 2022.10.31
this->OS.code(3)  (0) 2022.10.31
this->OS.code(2)  (0) 2022.10.31

+ Recent posts