프로세스 간 통신

문딤·2022년 8월 15일
0
post-thumbnail

프로세스 간 통신의 종류

PIPE

  • 두 프로세스 간 통신을 지원하는 특수 파일
  • 그냥 파이프는 부모 - 자식 간의 프로세스 통신을 지원.
  • 기본적으로 단방향
  • 양방향으로 하고싶다면 파이프를 2개 생성한다.

통신과정

  1. PIPE 함수 호출 후 파일기술자(fd[])생성.

  1. fork()함수로 자식 프로세스를 생성하면, pipe도 함께 복사된다. 수행 x

  1. 단방향의 경우 통신 방향을 결정한다.

  1. 양방향의 경우 파일 기술자를 하나 더 생성하여, 단방향 파이프를 2개 사용하는 원리 .

전역 변수를 이용한 통신

전역 변수를 이용한 통신은 공동으로 관리하는 메모리를 이용하여 데이터를 주고받는 것이다. 데이터를 보내는 쪽에서는 전역 변수나 파일에 값을 쓰고, 데이터를 받는 쪽에서 전역 변수의 값을 읽는다.

부모와 자식 프로세스 간의 통신에도 사용되고, extern 변수를 사용하여 include하여 사용할 수도 있다.

그러나 전역 변수를 이용한 양방향 통신은 busy waiting을 해야하는 문제가 있다.

다음의 그림은 프로세스가 fork하여 만든 자식 프로세스와 전역 변수로 통신하는 모습을 보여준다. 전역 변수 R에 write를 하면 한 쪽은 read 할 수 밖에 없다. 때문에 전역변수 R, L 을 두어 양방향 통신을 하도록 만드는 것이다.

그런데, fork()로 만들어진 프로세스는 전역 변수 R이 바뀔 때까지 작동을 하지않고 check만 반복하게되는 busy waiting에 빠지는 단점이 있다.

+@ Busy Wating

OS에서는 원하는 자원을 얻기 위해 기다리는 것이 아니라 권한을 얻을 때까지 확인하는 것을 의미한다.
cpu의 자원을 쓸데없이 낭비하기 때문에 좋지 않은 쓰레드 동기화 방식이다.

파일을 이용한 통신

파일을 읽고 쓰는 방식을 크게 세부분으로 나뉜다.

  1. 파일 열기
  2. 쓰기 또는 읽기
  3. 파일 닫기

파일 열기

open()을 통해 사용하려는 파일이 있는지, 권한을 어떻게 줄 것인지를 정한다.
이 함수는 fd를 반환하는데 fd는 file descriptor로 해당 파일에 접근할 수 있는 권한을 의미한다. 이후에는 fd를 통해서만 파일에 접근할 수 있다.

읽기 또는 쓰기

fd를 이용해 write(fd, "string", size), read(fd, str, size) 함수를 사용한다.

파일 닫기

close(fd)를 통해 파일을 닫는다.

파일 입출력 코드를 프로세스 입장에서 살펴보면, 프로세스가 입출력 관리 프로세스에 읽기/쓰기를 요구하면 데이터가 하드디스크에 출력/저장된다.
따라서 파일 입출력 또한 프로세스와 입출력 프로세스 간의 통신이라고 할 수 있다.

소켓을 이용한 통신

여러 컴퓨터에 있는 프로세스 간 통신은 네트워킹이라고 한다.

네트워킹 상황에서의 통신은 원격 프로시저 호출(RPC)이나 소켓을 사용한다.

프로시저 호출이 한 컴퓨터에 있는 함수를 호출하는 것이라면, 원격 프로시저 호출은 다른 컴퓨터에 있는 함수를 호출하는 것이다.

자바 같은 경우는 다른 컴퓨터에 있는 객체의 메서드를 호출하는 것이 원격 프로시저 호출이다.

네트워크의 기본은 소켓이기 때문에 네트워크 프로그래밍을 소켓 프로그래밍이라고도 한다.

공유자원과 임계구역

공유 자원

여러 프로세스가 공동으로 이용하는 변수, 메모리 , 파일 등을 말한다.
공동으로 이용되기 때문에 데이터 사용여부에 따라 결과가 달라질 수 있다.

+@ Race Condition

두 개 이상의 프로세스가 공통 자원을 병행적으로 읽거나 쓰는 동작을 할 때, 공용 데이터에 대한 접근이 어떤 순서에 따라 이루어지는지에 따라 실행 결과가 같지 않고 달라지는 상황.

Mutual exclusion, Deadlock , Starvation 등의 문제점이 생길 수 있다.

예방 방법

세마포어(Semaphore)

공유된 자원의 데이터를 여러 프로세스가 접근하는 것을 막는 것이다.
또한 세마포어는 리소스의 상태를 나타내는 간단한 카운터라고 할 수 있는데, 일반적으로 비교적 긴 시간을 확보하는 리소스에 대해 이용하게 되며, 운영체제의 리소스를 경쟁적으로 사용하는 다중 프로세스에서 행동을 조정하거나 동기화 시키는 기술이다.

하나의 스레드만 들어가게 할 수도 있고 여러 개의 스레드가 들어가게 할 수 있다. 이것이 뮤텍스와의 차이이다.

뮤텍스(Mutex)

공유된 자원의 데이터를 여러 스레드가 접근하는 것을 막는 방법이다.
즉, Critical Section(각 프로세스에서 공유 데이터를 엑세스하는 프로그램 코드 부분)을 가진 쓰레드들의 Running time이 서로 겹치지 않게 각각 단독으로 실행되게 하는 기술이다.
다중 프로세스들이 공유 리소스에 대한 접근을 조율하기 위해 locking과 unloking을 사용하는데, 다시 말해서 상호배제를 함으로써 두 쓰레드가 동시에 사용할 수 없다는 뜻이다.

임계 구역

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

+@ 생산자-소비자 문제

생산자가 데이터를 생산하면 소비자는 그것을 소비할때 발생하는 문제들을 말함.

해결조건

1) 상호 배제 (Mutual Exclusion) : 한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역에 들어갈 수 없다.

2) 한정 대기(bounded waiting) : 어떤 프로세스도 무한 대기 하지 않아야 한다.

3) 진행의 융통성(progress flexibility) : 한 프로세스가 다른 프로세스의 진행을 막아선 안 된다.

해결 방법

1) 잠금(lock) 이용
2) 진행의 융통성 문제
3) 하드웨어적 해결 방법
4) 피터슨 알고리즘
5) 데커 알고리즘
6) 세마 포어

+@ 피터슨 알고리즘

마지막에 결정된 turn의 값이 두 개의 프로세스 중에 어떤 게 공유된 자원을 먼저 사용할지 결정시키는 알고리즘.

교착상태와 해결방법

교착 상태(deadlock)

현재 서로 원하는 자원이 상대방에 할당되어 있어서 두 프로세스는 무한정 wait 상태에 빠짐

교착 상태의 발생 조건

1) 상호 배제(Mutual exclusion)
2) 점유 대기(Hold and wait)
3) 비선점(No preemption)
4) 순환 대기(Circular wait)

교착상태(deadlock) 처리

💨 예방(prevention)

교착 상태 발생 조건 중 하나를 제거하면서 해결한다 (자원 낭비 엄청 심함)

상호배제 부정 : 여러 프로세스가 공유 자원 사용
점유대기 부정 : 프로세스 실행전 모든 자원을 할당
비선점 부정 : 자원 점유 중인 프로세스가 다른 자원을 요구할 때 가진 자원 반납
순환대기 부정 : 자원에 고유번호 할당 후 순서대로 자원 요구

💨 회피(avoidance)

교착 상태 발생 시 피해나가는 방법

은행원 알고리즘(Banker's Algorithm)

은행에서 모든 고객의 요구가 충족되도록 현금을 할당하는데서 유래함
프로세스가 자원을 요구할 때, 시스템은 자원을 할당한 후에도 안정 상태로 남아있게 되는지 사전에 검사하여 교착 상태 회피한다.
안정 상태면 자원 할당, 아니면 다른 프로세스들이 자원 해지까지 대기

교착 상태를 탐지 & 회복

교착 상태가 되도록 허용한 다음 회복시키는 방법

💨 탐지(Detection)

자원 할당 그래프를 통해 교착 상태를 탐지함
자원 요청 시, 탐지 알고리즘을 실행시켜 그에 대한 오버헤드 발생함

💨 회복(Recovery)

교착 상태 일으킨 프로세스를 종료하거나, 할당된 자원을 해제시켜 회복시키는 방법

1) 프로세스 종료 방법

교착 상태의 프로세스를 모두 중지
교착 상태가 제거될 때까지 하나씩 프로세스 중지

2) 자원 선점 방법

교착 상태의 프로세스가 점유하고 있는 자원을 선점해 다른 프로세스에게 할당 (해당 프로세스 일시정지 시킴)
우선 순위가 낮은 프로세스나 수행 횟수 적은 프로세스 위주로 프로세스 자원 선점

참고

https://heeonii.tistory.com/13

https://chosh95.tistory.com/340

https://little-men-32.tistory.com/5

profile
풀스택개발자가 될래요

0개의 댓글