여름의 서재

[운영체제] 프로세스 동기화 본문

CS/운영체제

[운영체제] 프로세스 동기화

엉아_ 2021. 12. 2. 19:35
728x90

💡 프로세스간 통신

 

- 프로세스 내부 데이터 통신

: 하나의 프로세스 내에 2개 이상의 스레드가 존재하는 경우의 통신이다. 프로세스 내부의 전역 변수파일을 이용하여 데이터를 주고 받는다.

 

- 프로세스간 데이터 통신

: 같은 컴퓨터에 있는 여러 프로세스끼리 통신하는 경우로, 공용 파일 또는 운영체제가 제공하는 파이프를 이용하여 통신한다.

 

- 네트워크를 이용한 데이터 통신

: 여러 컴퓨터가 네트워크로 연결되어 있을 때도 통신이 가능한데, 이 경우 프로세스는 소켓을 이용하여 데이터를 주고받는다. (네트워킹)

 

1. 프로세스 간 통신의 분류

- 통신 방향에 따른 분류

  • 양방향 통신: 데이터를 동시에 양쪽 방향으로 전송할 수 있는 구조, 소켓 통신이 이에 해당
  • 반양방향 통신: 데이터를 양쪽 방향에서 전송할 수 있지만 동시 전송은 불가능하고 특정 시점에 한쪽 방향으로만 전송할 수 있는 구조, 대표적인 예는 무전기
  • 단방향 통신: 모스 신호처럼 한쪽 방향으로만 데이터를 전송할 수 있는 구조. 전역벽수와 파이프가 해당

- 통신 구현 방식에 따른 분류

  • 대기가 있는 통신: 동기화를 지원 O. 데이터를 받는 쪽은 데이터가 도착할 때까지 자동으로 대기상태에 머물러 있는다.
  • 대기가 없는 통신: 통기화 지원 X. 데이터를 받는 쪽은 바쁜 대기를 사용하여 데이터가 도작했는지 여부를 직접 확인한다.

📌 바쁜 대기

: 변수의 상태 변화를 살펴보기 위해 반복문을 무한 실행하며 기다리는 것

 

2. 프로세스 간 통신의 종류

- 전역 변수를 이용한 통신

: 공동으로 관리하는 메모리를 사용하여 데이터를 주고받는 것

 

- 파일을 이용한 통신

: 저장장치에 파일을 읽고 쓰는 방법으로 데이터를 주고받는 것

 

- 파이프를 이용한 통신

: 운영체제가 제공하는 동기화 통신 방식으로, 파이프에 쓰기 연산을 하면 데이터가 전송되고 읽기 연산을 하면 데이터를 받는다.

 

📌 이름 있는 파이프 vs 이름 없는 파이프

  • 이름 없는 파이프: 일반적인 파이프, 부모와 자식 프로세스 혹은 같은 부모를 가진 자식 프로세스와 같이 서로 관련 있는 프로세스 간 통신에 사용된다.
  • 이름 있는 파이프: FIFO라 불리는 특수 파일을 이용하며 서로 관련 없는 프로세스 간 통신에 사용된다.

 

- 소켓을 이용한 통신

: 여러 컴퓨터에 있는 프로세스와 프로세스를 소켓으로 연결하여 데이터를 주고받는 것이다. 소켓에 쓰기 연산을 하면 데이터가 전송되고 읽기 연산을 하면 데이터를 받는다.

 

💡 공유 자원과 임계 구역

- 공유 자원

: 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등을 말한다. 공유 자원은 공동으로 이용되기 때문에 누가 언제 데이터를 읽거나 쓰느냐에 따라 그 결과가 달라질 수 있다.

 

📌 경쟁 조건 (Race Condition)

: 여러 프로세스나 스레드가 동기화 메커니즘 없이 자원에 접근하려는 상황. 공유된 자원에 대한 접근 순서에 따라 실행 결과가 달라질 수 있는 상황을 의미

 

- 임계구역 (Critical Section)

: 공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역. 임계 구역에 접근하는 것을 제어하기 위해 세마포어, 뮤텍스와 같은 매커니즘을 사용.

 

- 임계구역 해결 조건

  • Mutual Exclusion(상호 배제)
    프로세스 P1 이 Critical Section 에서 실행중이라면, 다른 프로세스들은 그들이 가진 Critical Section 에서 실행될 수 없다.
  • Progress(진행)
    Critical Section 에서 실행중인 프로세스가 없고, 별도의 동작이 없는 프로세스들만 Critical Section 진입 후보로서 참여될 수 있다.
  • Bounded Waiting(한정된 대기)
    P1 가 Critical Section 에 진입 신청 후 부터 받아들여질 때가지, 다른 프로세스들이 Critical Section 에 진입하는 횟수는 제한이 있어야 한다.

 

💡 임계구역 해결 방법

1. 임계 구역 해결 조건을 고려한 코드 설계

- 상호 배제 문제

while(lock==true);
lock=true;
/// 임계구역
lock=false;

: lock을 이용해서 한 프로세스가 임계구역에 있을 때 다른 프로세스가 들어오지 못하게 할 수 있다.

하지만 한 프로세스가 lock = true; 문을 실행하기 전에 다른 프로세스가 while(lock==true);문을 실행해버리면 결국 둘다 임계 구역에 진입하게 된다.

 

- 한정 대기 문제

lock1=true;
while(lock2==true);
/// 임계구역
lock1=false;

: 잠금을 프로세스 개수만큼 사용하여 일단 잠금을 하고 다른 프로세스가 잠겼는지 확인하므로 두 프로세스의 상호배제가 보장된다. 하지만 두개의 프로세스가 있을 때 둘다 잠금을 하고 타임아웃이 되버리면 둘다 무한루프에 빠져서 임계구역에 진입하지 못하는 교착 상태가 된다.

 

- 진행의 융통성 문제

 while(lock=2);
 /// 임계구역
 lock=2;

: lock값이 1이면 프로세스 P1이 임계구역을 사용한다는 뜻. 잠금을 확인하는 문장이 하나이므로 상호 배제와 한정 대기를 보장한다. 하지만 한 프로세스가 두번 연달아 임계구역에 진입할 수 없다. 이처럼 프로세스의 진행이 다른 프로세스로 인해 방해받는 현상을 경직된 동기화라고 한다.

 

- 검사와 지정 코드(하드웨어적인 해결방법)

: 하드웨어의 지원을 받아 while(lock=true); 문과 lock=true; 문을 한꺼번에 실행함. 하지만 바쁜 대기를 사용해서 검사하기 때문에 자원낭비가 있다.

 

2. 피터슨 알고리즘, 데커 알고리즘

: 임계구역 해결의 세가지 조건을 모두 만족하는 소프트웨어적인 해결 방법이지만, 매우 복잡하다.

 

3. 세마포어

: 임계구역에 진입하기 전에 스위치를 사용 중으로 놓고 임계구역으로 들어가는 방법으로, 피터슨 알고리즘, 데커 알고리즘보다 간단하고 사용하기 쉽다.

 

- Semaphore(n): 전역 변수 RS를 n으로 초기화한다. RS에는 현재 사용 가능한 자원의 수가 저장된다.

- P(): 잠금을 수행하는 코드로, RS가 0보다 크면 1만큼 감소시키고 임계구역에 진입한다. 만약 RS가 0보다 작으면 0보다 커질 때까지 기다린다.

- V(): 잠금 해제와 동기화를 같이 수행하는 코드로, RS값을 1증가시키고 세마포어에서 기다리는 프로세스에게 임계구역에 진입해도 좋다는 wake_up 신호를 보낸다.

 

- 세마 포어의 잘못된 사용 예

  • 프로세스가 세마포어를 사용하지 않고 바로 임계구역에 들어간 경우. 임계구역 보호 X
  • P()를 두번 사용하여 wake_up  신호가 발생하지 않은 경우. 프로세스 간의 동기화가 이루어지지 않아 세마포어 큐에서 대기하고 있는 프로세스들이 무한 대기에 빠진다.
  • P()와 V()를 반대로 사용하여 상호 배제가 보장되지 않은 경우. 임계구역 보호 X

 

4. 모니터

: 세마포어 알고리즘을 자동으로 처리하도록 설계한 코드이다. 보호할 자원을 임계구역으로 숨기고 임계구역에서 작업할 수 있는 인터페이스만 제공하여 자원을 보호한다.

- wait(): 모니터 큐에서 자신의 차례가 올 때까지 기다린다. 세마포어의 P()에 해당한다,

- signal(): 모니터 큐에서 기다리는 다음 프로세스에 순서를 넘겨준다. 세마포어의 V()에 해당한다.

Comments