본문 바로가기
OS

프로세스 간 통신(IPC)

by 권세희 2021. 6. 4.

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

프로세스 간 데이터 통신: 같은 컴퓨터에 있는 여러 프로세스끼리 통신하는 경우로 공용 파일이나 파이프를 이용하여 데이터를 주고받는다.

네트워크를 이용한 데이터 통신: 여러 컴퓨터가 네트워크로 연결되어있을 때의 통신을 의미하며 소켓을 이용하여 데이터를 주고받는다.

 

분류 방식 종류
통신 방향에 따른 분류 양방향 통신 일반적 통신, 소켓
통신 방향에 따른 분류 반양반향 통신 무전기
통신 방향에 따른 분류 단방향 통신 전역변수, 파일, 파이프
통신 구현 방식에 따른 분류 대기가 있는 통신(동기화 통신) 파이프, 소켓
통신 구현 방식에 따른 분류 대기가 없는 통신(비동기화 통신) 전역 변수, 파일

 

👀 공유자원

여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등을 의미

공유 자원을 어떤 프로세스가 먼저 이용하느냐에 따라 결과가 달라지기에 경쟁 조건을 피해야 한다.

 

경쟁 조건이란?

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

 

👀 임계 구역

공유자원의 실행 순서에 따라 결과가 달라지는 프로그램의 영역 -> 순서를 통제하여야 한다.

 

임계 구역을 해결하기 위한 조건은 무엇일까 ❓

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

2. 한정 대기: 특정 프로세스가 임계구역에 들어가지 못해 무한 대기하면 안 된다. (=교착 상태)

3. 진행의 융통성: 한 프로세스가 다른 프로세스의 진행을 방해해서는 안된다. 즉 임계 구역을 아무 프로세스가 사용하지 않으면 들어가야 한다.

 

💡 임계구역 해결방법

✨ Spin Lock

Lock의 기본 구현 방식

1️⃣ 상호 배제 조건을 충족하지 않는 경우

1. P2는 lock이 False임으로 lock을 true로 만든 후 임계 구역으로 들어옴

2. 타임 아웃이 끝난 P1이 true로 만든 후 임계 구역으로 들어옴

3. 둘 다 임계 구역에 진입

 

2️⃣ 한정 대기 문제(=교착상태가 발생하는 경우)

공유 변수를 두 개 사용하여 상호 배제 조건을 충족한 경우 -  일단 잠금을 하고 난 후 다른 프로세스가 잠겼는지 확인

상호배제 조건 충족

P1, P2 둘 다 while문에 빠져나오지 못하고 무한 루프에 빠져 P1, P2 둘 다 임계 구역으로 못 들어가고 프로세스가 늘어 갈수록 공유 변수도 증가시켜줘야 해서 확장성의 문제 발생

 

3️⃣ 진행의 융통성 문제

상호 배제와 한정 대기 보장

프로세스의 우선순위와 상관없이 번갈아 가면서 임계 구역에 진입하여 우선순위가 높은 프로세스가 두 번 연속해서 실행하고 싶어도 못 한다. 프로세스 진행이 다른 프로세스로 인해 방해받는 현상을 경직된 동기화라고 한다.

 

Spin Lock의 문제점

Ready 큐에 대기시키다 보니 락을 얻을 수 없는 상황이면 while문을 돌면서 실행하다가 다시 Ready 큐에 들어가 CPU 자원을 소모한다. 

 

✨ Wating 큐

각각의 락 별로 waiting 큐를 운영하여 락이 필요한 프로세스의 경우 락을 waiting 큐에 push 시킨다. 이후 락이 가용 가능한 상태가 되었을 때 큐의 제일 맨 앞에 있는 프로세스를 pop 시켜 ready 큐에 삽입하면 락이 가용 가능해진 시점에 프로세스가 실행되도록 할 수 있다. -> 락을 필요로 하지만 아직 얻지 못한 경우에 해당 프로세스를 Ready 큐에 방치하는 것이 아닌 Waiting 큐에 추가해서 락이 반납되기 전까지 Scheduling되는 것을 막는다. -> CPU 자원이 낭비되지 않는다.

 

그림으로 이해하기

https://foramonth.tistory.com/74?category=902887 

 

Spin Lock은 언제 사용할까 ❓

Waiting 큐 방식은 Waiting 큐에 추가하는 작업이 추가되고 우선순위에 맞게 정렬시켜야하는 것과 다시 프로세스를 깨우고 재움으로써 문맥 교환이 발생하는 오버헤드 발생한다.

프로세서가 한개라면 spin lock은 사라지는 게 맞다. spin lock을 풀 수 있는 다른 프로세서가 없어서 계속 바쁜 대기를 해야 하기 때문이다. 

하지만 멀티 프로세서라면 위의 오버헤드보다 바쁜대기를 하는 것이 훨씬 경제적이다. 다른 프로세서가 임계 구역을 다 처리하는 순간 바쁜 대기를 풀고 바로 들어가면 되기 때문이다.

 

 

✌ 검사와 지정을 사용하여 하드웨어적으로 임계 문제 방법 해결

바쁜 대기 계속 발생

✨ 세마포어

세마포어는 임계 구역이 잠겼는지 직접 확인하지 않아 바쁜 대기도 없고 다른 프로세스에게 동기화 메시지를 보낼 필요도 없다. 

 

Semaphore(n); // RS = n (현재 사용가능한 자원의 수)

P(){ // 잠금을 수행
	if (RS > 0)
		RS = RS - 1;
	else
	{
		block();
        }
};

// 임계구역

V() { // 잠금해제와 동기화를 수행
	RS = RS + 1;
	wake_up();
};

세마포어는 공유 자원이 여러 개일 경우에도 사용 가능하다.

n을 2라고 할 경우,

1. 먼저 도착한 P1이 RS 값을 1 감소시키면서 진입 

2. P2도 RS 값을 1 감소시키면서 진입 

3. P3의 경우 RS가 0 이므로 block 상태로 RS값이 0보다 커질 때까지 세마포어 큐에서 대기(바쁜 대기 없음)

4. P1이 임계 구역을 빠져나와 V() 실행하면서 RS 값은 1이 되고 wake_up 신호가 P3에게 전달

 

✨ 모니터

모니터는 세마포어의 알고리즘을 따르면서 공유 자원을 내부적으로 숨기고 공유 자원에 접근하기 위한 인터페이스만 제공 (=운영체제의 시스템 호출과 같은 원리)

 

1. 임계 구역으로 지정된 변수나 자원에 접근하고자 하는 프로세스는 직접 P()나 V()을 사용하지 않고 모니터에 작업 요청

2. 모니터는 작업을 모니터 큐에 저장한 후 순서대로 처리하고 결과를 해당 프로세스에게 알려줌

 

모니터 큐

 

모니터는 임계구역 보호와 동기화를 상태 변수를 사용하여 모니터의 내부에서 처리한다. 사용자는 increase 함수만 호출하면 된다.

 

상태 변수는 wait와 signal 기능이 있다.

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

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

 

'OS' 카테고리의 다른 글

교착상태 필요조건과 해결방법  (0) 2021.06.03
CPU 스케줄링  (0) 2021.05.24
스레드의 공유자원 관리(동기화)  (0) 2021.05.09
프로세스 스케줄링이 뭘까❓  (0) 2021.01.04
스레드에 대해 알아보자  (0) 2021.01.03