컴퓨터공학/운영체제

8. 상호배제와 동기화

meow0110 2024. 7. 3. 18:47

■ 상호배제
- 병행 프로세스에서 프로세스 하나가 공유 자원 사용 시 다른 프로세스들이 동일한 일을 할 수 없도록 하는 방법이다.

- 읽기는 동시에 접근 가능

- 그러나 쓰기 작업의 경우, 동시에 하면 데이터 손상이 나타남.

 

 

■ 동기화 :

- 공유 자원을 동시에 사용하지 못하게 해서, 실행을 제어하는 방법

- 프로세스 간 동기화 라고 부를 수 있다.

 

■ 임계 영역 : 공유 메모리를 말함.

■ P1이 사용중이다. 그래서 P2가 진입이 불가능. 이러한 개념을 프로세스 간 동기화(상호배제) 라고 함 

 

■ 생산자 소비자 프로세스

- 여러 프로세스가 공통 작업을 수행하기 위해, 서로 협력하는 대표적인 예시

- 병행처리 예시

- 협력관계의 대표적인 예시

 

■ 버퍼

- 위의 가운데 문자, 어셈블리 코드, 적재 모듈에 대해

- 생산자가 만든 생산물을 저장하는 공간. 즉 버퍼라고 부름

 

 

■ 버퍼의 구조

- 가운데 빙글빙글 돈다. 즉, 유한적인 공간, 버퍼를 효율적으로 쓰는 모습이다.

- 회전초밥집을 생각하자. 음식을 만들면 컨베이어 벨트에 올린다. 그러면 소비자는 그것을 사용해서 쓴다. 비어진 공간이 요리사 앞으로 오면 새로운 요리를 올린다. 이런 개념으로 생각하면 될듯 하다.

- 생산자와 소비자 간의 동기화가 잘된 구조라고 생각하자.

 

■ 버퍼에 대한 문제

- a는 가득찬 상태다. 생산자가 데이터를 생산해도 저장할 공간이 없음

- c는 소비자가 쓸 데이터가 없는 상태다.

- 결론 : 생산자, 소비자 사이에 동기화가 제대로 이루어져야 함. 안그러면 문제가 생김.

 

■ 공유 버퍼에 상호배제 개념을 넣어, 생산자와 소비자 문제를 해결!

- 하나 생산하면, 생산된 값을 가져갈 수 있도록, 

- 생산하지 않았다면 가져가지 못하도록 대기!

- 가득 생산하면 더이상 버퍼에 프로세스들이 생산하지 못하도록!

 

■ 왼쪽 그림 : 생산자 입장

- 가득참? 쓰지마

 

■ 오른쪽 그림 : 소비자 입장

- 비어있음? 쓰지마!

 

 

■ 생산자, 소비자 프로세스를 프로그램 알고리즘으로 나타낸 것.

 

■ 왼쪽 그림 : 생산자

- 버퍼 사이즈와 같을 때까지는 계속 실행함.

- 그러나 카운터가 버퍼사이즈보다 오버될 경우(버퍼 꽉찼어!), while문을 빠져나오게 된다. 즉 중단이다!

 

■ 오른쪽 그림 : 소비자

- 버퍼 사이즈 내에서 계속 사용한다. 즉 맨 아래 counter --; 를 보다시피 계속해서 소비를 함

- 위와는 반대로 0 이하가 되면, 즉 아무것도 없을 경우(버퍼가 싹 비었어!) 는 while문을 빠져나가게 된다. 중단이다!

 

 

■ 경쟁상태

- 병행 프로세스 중에 발생하는 오류로 보면 된다.

- 즉, 마지막 프로세스가 쓴 값, 결과로 인해 발생하는 오류라고 생각하자.

- 이를 해결하기 위해서는,  적절한 순서가 보장되어야 해결된다.

 

■ 경쟁상태

- 위에서 언급했다시피, 적절한 순서가 보장되어야 해결된다.

- 읽기를 먼저, 그다음 쓰기 명령을 수행하게 한다.

 

■ 결론

- 경쟁상태를 방지하기 위해서는, 동기화가 필요하다. 

- 동기화를 제대로 수행하기 위해서는 상호배제임계영역이 필요하다.

 

 

■ 임계영역 : 

- 임계영역은 공유 메모리가 참조되는 프로그램의 부분으로 다수의 프로세스가 접근 가능한 영역이면서 한 순간에 하나의 프로세스만 사용할 수 있는 영역을 의미한다.

- 임계자원을 이용하는 그 영역을 말한다. 즉, 다수의 프로세스가 접근은 가능함. 하지만 하나가 점유하면 다른 프로세스는 사용하지 못한다. 

 

■ 진입영역

- 특정 프로세스가 임계영역으로 들어가기 전에 먼저 요청해야하는 곳이다.

 

■ 출구영역 (잔류영역)

- 특정 프로세스가 임계영역을 다쓰고 나가는 곳이다.

 

 

■ 임계영역을에서 사용하는 코드 라고 생각하자

 

■ 진입영역

- 계속 대기중인 곳이라 생각하자. 즉, 아직 임계영역에 진입하지 못한 상황

- /* 임계영역   */   : 임계영역 안으로 들어와서 수행하는 모습이다. 코드는 없는 모습. 그냥 해당 위치라고 보자.

 

■ 탈출영역

- 나가는 곳!

 

 

 

 

■ 임계영역의 3가지 조건

 

■ 상호배제 : 작업중임. 들어오지마!

■ 진행

- 임계영역에 진행중인 프로세스가 없음. 즉 비어있음.

- 다수의 프로세스들이 임계영역으로 들어와서 작업을 할려고 함

- 이 때, 프로세스 선정 알고리즘에 의해서 다음 임계영역에서 수행할 프로세스를 선정하는 과정이 필요하다.

- 그리고 비어있는 임계영역은 프로세스들을 대기시키며, 무한정 미룰 수 없다. 

 

■ 제한된 대기

- 한 프로세스가 임계영역 사용을 계속해서 기다리게 하는 것이 아닌 것을 보장한다고 생각하자.

- 즉, 내가 요청하면, 얼마 후에는 반드시 임계영역에 들어갈 수 있다! 

 

 

■ 데커 알고리즘 

- 임계영역을 설명하고자하는 대표적인 프로그램 알고리즘.

 

■ 프로세스 간의 동기화를 위해 만들어진 데커알고리즘의 예제다. 살펴보기만 하자.

 

■ 세마포 :

- 프로세스 간의 동기화를 해결하기 위한 개념.

- P, V 연산과 관련됨.

 

■ 세마포어 개념: 

- 세마포를 의미하는 S는 표준 단위 연산 P(프로세스 대기하게 하는 wait 동작, 임계 영역에 진입하는 연산)와 V(대기 중인 프로세스 깨우려고 신호 보내는 signal 동작, 임계 영역에서 나오는 연산)로만 접근하는 정수 변수이다.

 

 

■ 세마포어 정의

 

■ 세마포 공유자원 접근관리 모습

- 공유자원이 있을 떄, wait 기다리고  singal 신호를 보내고

- 신호를 통해 임계영역에 들어가게 되면, 해당하는 정보 공유 자원을 사용한다. 

- 다 쓰면 나간다. 

- 그리고 누군가 쓸 땐 다시 기다리는 형태다.

 

■ 세마포 동기화

- signal, wait 라는 값을 통해 동기화를 하고 있는 모습이다. 

 

 

 

 

■ 학습정리

병행 프로세스간 상호작용

  • 병행 프로세스에서 프로세스 하나가 공유 자원 사용 시 다른 프로세스들이 동일한 일을 할 수 없도록 하는 방법이다.

 

 

임계영역

  • 임계영역은 공유 메모리가 참조되는 프로그램으 부분으로 다수의 프로세스가 접근 가능한 영역이면서 한 순간에 하나의 프로세스만 사용할 수 있는 영역을 의미한다.

 

 

세마포어

  • 세마포를 의미하는 S는 표준 단위 연산 P(프로세스 대기하게 하는 wait 동작, 임계 영역에 진입하는 연산)와 V(대기 중인 프로세스 깨우려고 신호 보내는 signal 동작, 임계 영역에서 나오는 연산)로만 접근하는 정수 변수이다.