운영체제

동기화와 세마포어

chaeit1904 2024. 10. 10. 12:41

앞에서 알아본 상호배제 개념을 구현하는 알고리즘을 알아보자

 

Algorithm 1

메인 프로세스 -> processnumber = 1선언, 그후 프로세스 A, B동시 실행

Process A -> processnumber == 2일 때  ; 실행 -> 그 후 임계영역 진입

Process B -> processnumber == 1일 때 ; 실행 -> 그 후 임계 영역 진입

 

과정

Process A 먼저 실행 조건이 거짓 이므로 실행 후 임계영역 진입

그 후 processnumber = 1로 선언하여 빠져나오면서 B의 진입을 허가

B는 조건이 거짓이 되었으므로 While문에서 빠져나와 임계영역에 진입 

 

결론 

이 알고리즘은 공유자원인 processnumber을 이용해 임계영역에 진입하는 알고리즘이다.

그러나 문제점이 존재한다.

 

문제점

만약 A가 임계영역에 진입한 상황에서 비정상적으로 진입하게 되면 B는 계속해서 cpu를 사용하며

대기상태에 빠지게 된다,

또한 한 프로세스가 계속해서 임계영역을 점유하면, 다른 프로세스는 영원이 접근할 수없는 Starvation가 

발생할 수 있다.

 


Algorithm 2

Mainprocess -> lock1, lock2를 false로 설정, process A, B를 동시 실행

A -> while 문의 조건이 참이 아니므로 lock1을 true로 바꾸고 임계영역 진입,

B -> A가 lock1을 true로 바꾸었기 때문에 while문 조건이 참이므로 대기

A -> 임게영역에서 빠져나오고 lock1을 false로 바꾸고 잔류영역으로,

B- > A가 lock1을 false로 바꾸었기 때문에 lock2를 true로 바꾸고 임계영역 진입,

임계영역에서 빠져나온 후 lock2를 false로 바꾸고 잔류영역으로,

 

결론 : 공유자원 2개를 이용한 임계영역관리 알고리즘이다.

 

문제점 : 동시실행을 하므로 A, B 둘다 임계영역으로 들어갈 수 있다, 즉 상호배제가 안될 수 있다.

 


Algorithm 3

MainProcess -> lock1, lock2 = false, A, B 동시실행

A, B 각각 lock1, 2를 true로 바꾼다,(서로 못들어고게 하려는 의도)

A -> while 조건 참이 되므로 대기

B -> while 조건 참이 되므로 대기

결과 -> 둘다 못들어가고 무한대기에 빠진다.

 => 이런 상황을 Deadlock


Dekker's Algorithm

MainProcess -> turn 선언 후 B 대입, lock1, 2 false 선언, process A, B 동시실행

A, B -> 둘다 동시에 lock조건을 각각true로 설정한다.

그와 동시에 if문을 확인하여 turn조건을 확인한다.

만약 참이라면 상대가 임계영역에 진입하도록 lock조건을 변경한다,

이를 통해 한쪽이 임계영역에 접근하고 빠져나오면서 turn조건, lock조건을 변경한다,

남은 프로세스는 임계영역에 접근할 수 있게 된다.

 

결론 : 양쪽다 동시에 진입 시도 -> 조건을 통해 상대의 선진입을 확인하면 조건 변경 및 자신의 진입을 차단

-> 상대가 끝나면 진입


peterson's Algorithm

mainprocess -> lock1, 2 = false, turn = A로 세팅

A와 B가 둘다 lock1 = true, lock2 = true로 선언 후 진입시도

하지만 각각 turn을 B, A로 선언하며 양보한다

이로 인해 어느한쪽이 만약 먼저 진입하게 되면 다른쪽은 양보하게된다

 


하드웨어 기반 알고리즘

실행은 CPU가 하고, 실제 값은 메모리에 있는 것을 가져옴 -> 메모리와 cpu 간의 차이에 의한 문제가 발생한다.

이를 해결하기 위해 메모리 배리어가 등장하였다.

 

메모리 베리어 : 4개의 프로세스가 작동중일 때 다 실행이 완료되어야 다음 단계로 넘어갈 수 있도록 한다.

위에 나온 알고리즘에 대 한 문제들을 하드웨어적으로 구현하였다.

 


세마포어

 : 동시성 제어기법 중 하나로 공유자원에 대한 접근을 관리하기 위한 정수값을 사용한다. 경쟁상태를 

방지하기 위해 고안되었다.

 

기존의 상호배제 알고리즘의 임계영역문제를 일반화 하기 어렵다.

따라서 단순화, 일반화하기 위한 방법으로 세마포어가 등장하였다.

 

P : wait 연산 -> S가 0보다 작을 때 대기, 클 때 -> S를 감소시킨다

바쁜 대기 상태가 발생할 수 있다, 리소스를 점유하거나 잠금을 걸 때 사용한다.

V : S의 값을 증가 시킨다, 리소스를 해제하거나 잠금을 푸는것을 의미한다.

 

원자적 명령:  세마포어를 실행하는 동안에는 인터럽트나 이벤트에 의해 중단되지 않아야한다,

즉 점선을 기준으로 S--, S++이 동시 실행되어서는 안된다.


특성

spinLock문제 : 검사하는 과정에서 끊임없이 CPU를 사용하는 문제

예 : busy waiting

해결

: busy waiting 대신 sleep모드로 변경하여 CPU의 부담을 최소화한다,


특성

1. N개의 이ㅏㅁ꼐영역 문제를 해결할 수 있다.

2. N개 프로세스의 상호배제를 구현할 수 있음.

 

사례

문제 설명:

 

다섯 명의 철학자가 원형 테이블에 앉아 있으며, 각 철학자 앞에는 그들이 먹을 음식(스파게티)이 있습니다.

각 철학자는 생각하다가 배가 고프면 먹기로 전환합니다.

철학자는 먹기 위해 두 개의 **포크(젓가락)**를 필요로 합니다. 그러나 각 철학자 사이에는 포크가 하나씩만 있으며, 두 개의 포크를 동시에 집지 않으면 먹을 수 없습니다.

철학자들이 동시에 포크를 집으려 하면 교착 상태(deadlock)가 발생할 수 있습니다.

 

결론 : 세마포어를 사용해 각 포크의 사용을 제어하여 교착상태, 기아상태를 방지할 수 있다.


모니터 

:

동시성 제어를 위해 사용하는 고수준의 동기화 메커니즘으로, 프로세스나 스레드 간에 상호 배제를 보장하고 **임계 구역(Critical Section)**을 안전하게 보호하는 역할을 한다.

 

세마포어가 프로그램 전체에 널려 있을 경우 문제가 발생한다. -> 이해와 작성에 어려움을 발생시킴, 유지보수 까다로움

 

따라서 공유자원을 핸들링하는 코드 -> 임계영역, 공유자원 영역을 구분시킴

 

모니터 : 하나 이상의 프로시저와 초기화 코드, 공유 데이터로 구성된 소프트웨어 모듈 객체

기능 : 모니터 경계에서 한번에 한 프로세스만 진입하도록 제어 -> 상호배제 원칙을 지킴


 

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

IPC, 사례연구  (0) 2024.10.12
병행 프로세스와 병렬 프로세스  (1) 2024.09.29
비동기 병렬프로세스  (1) 2024.09.29
운영체제 프로세스  (1) 2024.09.25
운영체제-  (1) 2024.09.24