Race Condition

storage를 공유하는 둘 이상의 입력이 있는 경우 발생할 수 있음

1. 여러개의 CPU가 메모리에 접근하려는 경우

2. 공유 메모리 주소 공간에 여러개의 Process가 접근하려는 경우

 

구체적인 상황

1. 프로세스 A에서 커널의 코드가 실행중(커널의 데이터를 쓰는 중)에 인터럽트가 발생하여 프로세스B로 넘어가고 B에서 커널의 코드가 실행되어 커널 주소공간의 커널의 데이터를 쓰는 경우

ㄴ 커널의 데이터를 쓰는동안 interrupt를 비활성화하는 방법으로 해결

 

2. 프로세스 A에서 커널의 코드가 실행중인데 타이머 interrupt로 인해 context switching이 일어나는 경우

ㄴ 커널모드가 끝날때까지 기다렸다가 CPU를 뺏는 방법

Critical Section(임계 구역)

공유 데이터를 접근하는 코드

하나의 프로세스가 critical section에 있을 때 다른 모든 프로세스는 critical section에 들어갈 수 없어야 한다.

 

프로그램적 해결법의 충족 조건

1. mutual exclusion

ㄴ 한 프로세스가 자원을 쓰고 있으면 다른 프로세스는 들어오면 안됨

2. progress

ㄴ 자원을 아무도 안 쓰고 있으면 들어가야 함

3. bounded Waiting

ㄴ 기아가 되는 프로세스가 없어야 함

 

소프트웨어적 해결

 Peterson's Algorithm -> Busy waiting (무한반복문 대기 : CPU와 메모리를 쓰면서 wait)

하드웨어적 해결

읽기와 쓰기를 한번에 하는(atomic) Test_and_set instruction을 사용하면 됨

 

세마포어

추상 자료형

세마포어 변수는 정수값을 가짐 (남아 있는 자원의 개수)

세마포어 변수에 대해서 P 연산 V 연산을 수행할 수 있음 P(s)는 자원을 하나 가져가는 것 V(s)는 자원을 하나 반납하는 것

P 연산과 V 연산의 구현은 시스템에 따라 다르게 구현될 수 있는데, 앞서 말했던 busy waiting 방식과 block & wakeup 방식이 있다. block & wakeup 방식은 기다리는 프로세스를 커널 데이터에 구현되어 있는 Resource queue로 보내 block(sleep)되게 하는 것임

 

일반적으로는 block/wakeup 방식이 좋지만 critical section의 길이가 매우 짧은 경우 busy-wait 오버헤드보다 block/wakeup 오버헤드가 커지는 경우도 있다.

 

Counting semaphore

ㄴ 0이상의 정수 값을 가짐

ㄴ resource counting에 사용

 

Binary semaphore (=mutex)

ㄴ 0 또는 1값만 가질 수 있는 semaphore

ㄴ 주로 lock unlock에 사용

 

세마포어를 이용해서 프로그래밍 할 때 프로그래머 논리적으로 코딩하지 않으면 deadlock 문제가 생길 수 있음

 

 

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

8. 메모리  (0) 2022.06.09
7. Deadlock  (0) 2022.06.09
5. CPU 스케줄링  (0) 2022.06.09
4. 프로세스 생성  (0) 2022.06.09
3. 스레드  (0) 2022.06.09

+ Recent posts