본문 바로가기

전공/운영체제

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

728x90
책 "쉽게 배우는 운영체제"를 참고하여 쓴 글입니다

프로세스 간 통신(IPC: Inter Process Communication)

프로세스 간 통신의 개념

  1. 프로세스 내부 데이터 통신: 하나의 프로세스 내에 2개 이상의 스레드가 존재하는 경우, 데이터 주고받는 방법을 프로세스끼리 알아서 결정
  2. 프로세스 간 데이터 통신: 같은 컴퓨터에 있는 여러 프로세스끼리 통신, 보통 파이프는 fork()로 만들어진 부모-자식 간 통신에 사용
  3. 네트워크를 이용한 데이터 통신: 여러 컴퓨터가 네트워크로 연결되어 있을때의 통신, 소켓을 이용한 통신, 같은 컴퓨터 내에서 소켓 통신은 비효율적, 임의의 포트를 정하고 해당 포트간의 대화를 통해 데이터 주고받는 방식

프로세스 간 통신의 분류

  • 양방향 통신: 데이터를 동시에 양쪽 방향으로 전송할 수 있는 구조
  • 반양방향 통신: 데이터를 양쪽 방향으로 전송할 수 있지만 동시 전송은 불가능
  • 단방향 통신: 한쪽 방향으로만 데이터를 전송

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

동기화: 데이터가 도착했음을 알려주는 것

  • 대기가 있는 통신: 동기화 지원 통신
  • 대기가 없는 통신: 동기화 지원하지 않는 통신, 반복문 무한 실행

프로세스 간 통신의 종류

  • 전역변수를 이용한 통신
    • 공동으로관리하는 메모리를 사용하여 데이터를 주고받음
    • 전역 변수의 값이 변할 때까지 바쁜 대기를 돈다.
  • 파일을 이용한 통신
    • 파일을 엶 -> 쓰기 또는 읽기 -> 파일을 닫음
    • wait() 함수로 자식 프로세스 작업이 끝날때까지 기다렸다가 작업을 함
    • 파일을 엶: open(), fd를 반환(fd: 해당 파일에 접근할 수 있는 열쇠같은 존재), O_RDWR/O_RDONLY와 같이 어떤 권한을 부여 할 것인지 준다
    • 쓰기 또는 읽기: read(),write()
    • 파일을 닫음: close() 이용하여 닫음
  • 파이프를 이용한 통신
    • open() 으로 기술자를 얻고 작업을 한 후 close()로 닫는다
    • 이름 없는 파이프: 부모와 자식 프로세스 혹은 같은 부모를 가진 자식 프로세스 간
    • 이름 있는 파이프: FIFO라는 특수 파일 이용하여 관련 없는 프로세스 간 통신
  • 소켓을 이용한 통신
    • 여러 컴퓨터에 있는 프로세스끼리 통신
    • 바인딩: 위와 같이 프로세스끼리 연결하는 작업

공유 자원과 임계구역

공유 자원의 접근

공유자원: 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일

경쟁 조건: 2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황

 

임계구역

임계구역: 공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역

임계구역에서는 프로세스들이 동시에 작업하면 안된다 -> 어떤 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역 밖에서 기다려야 함

 

생산자-소비자 문제

원형 큐 이용

언제 문맥교환이 일어날지 몰라서 결과가 다르게 나온다

생산자: 데이터를 생산하는 쪽

소비자: 데이터를 소비하는 쪽

임계구역 해결 조건
상호 배제: 한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역에 들어갈 수 없다

한정 대기: 어떤 프로세스도 무한대기 하지 않아야 한다

진행의 융통성: 한 ㅍ로세스가 다른 프로세스의 진행을 방해해서는 안된다

 

임계구역 해결 방법

lock을 이용하는 것이 가장 단순

//기본코드
main(){
	while(lock==true);
    	lock=true;
    	balance+=10;
    	lock=false;
}

 

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

 

상호 배제 문제

  • boolean lock=false;
  • lock을 공유 변수로 선언한다.
  • 하지만, 동시 신입 상황이 생겨서 상호 배제 조건을 충족하지 못할 수 있다

한정 대기 문제

  • 프로세스 갯수만큼 lock 공유 변수 선언한다.
  • 하지만 두 프로세스가 모두 임계구역에 진입하지 못하는 무한 대기 현상이 일어날 수 있다. 또한 확장성 문제, 프로세스가 늘어났을때 검사해야 하는 lock의 갯수가 늘어난다는 문제도 발생할 수 있다.
  • 교착 상태: 프로세스가 살아 있으나 작업이 진행되지 못하는 상태

진행의 융통성 문제

  • int lock=1; 로 설정해 놓고 해당 임계구역에 들어갈수 있는 lock을 지정해 놓는다
  • 하지만, 서로 번갈아 가면서 실행된다는것이 문제, 한 프로세스가 두 번 연달아 임계구역에 진입하고 싶어도 할 수 없음

하드웨어적인 해결 방법

  • 두 명령어를 동시에 실행한다.
  • 하지만 바쁜 대기를 사용하여 검사하기 때문에 자원 낭비가 있다.

피터슨 알고리즘

  • turn이라는 공유변수를 하나 더 사용
  • 두 프로세스가 동시에 lock을 설정하여 임계구역에 못 들어 가는 상황 대비, turn을 사용하여 다른 프로세스에 양보
  • 임계구역 해결의 세 가지 조건을 모두 만족하지만 2개의 프로세스만 사용가능

 

데커 알고리즘

  • 하드웨어의 도움 없이도 임계구역 문제 해결

세마포어

사용가능한 자원의 수를 변수로 지정하고 +1,-1 처리를 한다.

  • Semaphore(n): 전역 변수 RS를 n으로 초기화, RS에는 현재 사용 가능한 자원의 수가 저장
  • P(): 잠금 수행 코드, RS>0(==사용 가능한 자원이 있음) 이라면 1만큼 감소시키고 임계구역에 진입. 만약 RS<=0(사용 가능한 자원이 없음) 이라면 0보다 커질 때까지 기다린다.
  • V(): 잠금 해제와 동기화를 같이 수행, RS 값을 1 증가시키고 세마포어에서 기다리는 프로세스에게 임계구역에 진입해도 된다는 wake_up신호를 보낸다.

문제점

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

 

모니터

공유 자원을 내부적으로 숨기고 공유 자원에 접근하기 위한 인터페이스만 제공, 자원을 보호하고 프로세스간 동기화를 시킨다.

  • 임계구역에 접근하고자 하는 프로세스는 직접 P(), V() 사용하지 않고 모니터에 작업 요청을 함
  • 모니터는 요청받은 작업을 모니터 큐에 저장한 후 순서대로 처리하고 그 결과만 해당 프로세스에 알려줌
  • 임계구역 보호와 동기화를 위해 내부적으로 상태 변수를 사용
    • wait(): 모니터 큐에서 자신의 차례가 올 때까지 기다림 = P()
    • signal(): 모니터 큐에서 기다리는 다음 프로세스에 순서를 넘겨준다. = V()
728x90