본문 바로가기
Lecture/OS

프로세스 간 통신

by YUNZEE 2023. 10. 20.
728x90
프로세스 간 통신의 개념

하나의 프로세스에 속한 스레드끼리 데이터를 주고받는 것은 어렵지 않다. 그러나 프로세스 간 통신은 다르다. 서로 다른 프로세스는 사용하는 메모리 영역이 다르기 때문에 공유된 메모리를 통하여 통신하는 것이 쉽지 않다. 운영체제는 프로세스와 프로세스끼리 쉽게 데이터를 주고받을 수 있는 통신 방법을 제공하는데 이를 프로세스 간 통신 IPC:Inter Process Communication이라고 한다.

 

프로세스 간 통신의 종류

- 공유 메모리나 공유 파일을 이용한 통신

프로세스 간 통신 중 가장 원시적인 방식이다. 이 방식에서는 일정한 메모리 영역이나 파일을 공유하고 이를 통하여 데이터를 주고받는다. 데이터를 주고받는 방법을 프로세스끼리 알아서 결정해야 하기 때문에 원시적인 방식이라고 한다.

- 파이프를 이용한 통신

하나의 컴퓨터 내에서 프로세스 간 통신에 많이 사용되는 수단은 파이프 pip다. 파이프는 프로세스 간 통신을 위하여 운영체제가 제공하는 통신 기법이다.(fork())

- 소켓을 이용한 통신 

컴퓨터와 컴퓨터가 네트워크로 연결된 경우의 통신에 주로 사용되는 수단은 소켓socket이다. 소켓은 네트워크로 연결된 컴퓨터에서 데이터를 주고받기 위한 통신 기법이다. 물론 같은 컴퓨터 내의 프로세스끼리도 소켓을 통신할 수 있다. 그러나 파이프와 비교하면 소켓 방식은 초기화할 내용도 많고 시스템 자원도 많이 사용한다.

 

프로세스 간 통신의 분류

- 양방향 통신

데이터를 양쪽 방향으로 동시에 전송할 수 있는 구조다. 일반적인 통신은 모두 양방향 통신이다.  프로세스 간 통신에서는 소켓을 이용한 통신이 양뱡향 통신에 해당한다.(전화)

- 반양방향 통신

데이터를 양쪽 방향으로 전송할 수 있지만 동시 전송은 불가능하고 특점 시점에 한쪽 방향으로만 전송할 수 있는 구조다. (무전기)

- 단방향 통신

무스 부호처럼 한쪽 방향으로만 데이터를 전송할 수 있는 구조다. 프로세스 간 통신에서는 공유 메모리나 공유 파일을 이용한 통신과 파이프를 이용한 통신이 단방향 통신에 해당한다.(무스부호)

 

통신 구현 방식에 따른 분류

바쁜 대기 문제를 해결하기 위해 데이터가 도착했음을 알려주는 동기화를 사용 한다. 메신저에게 메시지가 도착했다고 알려주는 알림은 동기화 대표적인 예다. 동기화를 사용하면 바쁜 대기를 하지 않아도 운영체제가 알아서 알려준다.

 

프로세스 간 통신은 동기화 기능이 있느냐, 없느냐에 따라 대기가 있는 통신(blocking communication)과 대기가 없는 통신(non-blocking communication)으로 구분된다. 대기가 있는 통신을 동기화 통신(synchronous communication)대기가  없는 통신을 비동기화 통신(asynchronous communication)이라고도 한다. 

 

대기가 있는 통신: 동기화를 지원하는 방식이다. 데이터 받는 쪽은 데이터가 도착할 때까지 자동으로 대기 상태에 머물러 있다.(전화)

대기가 없는 통신: 동기화를 지원하지 않는 방식이다. 데이터를 받는 쪽은 바쁜 대기를 사용하여 데이터가 도착했는지 여부를 직접 확인한다.(전보)

 

프로세스 간 통신의 종류

파일을 이용한 통신

- 파일 열기: open() 함수를 이용하여 사용하고자 하는 파일이 있는지, 또 그 파일이 있다면 쓰기 원한이 있는지도 확인한다. 정상적으로 파일을 사용할 수 있다면 open() 함수는 fd를 반환한다. 

 

파일 입출력 코드

-읽기와 쓰기를 할 수 있는 형태로 준비

fd("com.txt", O_RDWR): com.txt 파일을 읽기와 쓰기를 할 수 있는 형태로 준비한다는 뜻이다. 여기서 O_RDWR이 읽기와 쓰기 작업을 하겠다는 것이다. 읽기 전용 read only으로 파일을 열고자 한다면 O_RDONLY라고 하면 된다. 파일이 정상적으로 열린 후에는 파일 기술자 fd를 사용해 파일에 접근한다.

 

-파일 쓰기 또는 읽기:

write(fd, "Test", 5): fd, 즉 com.txt파일을 Test라는 문자열을 쓰라는 뜻이다.  Test의 크기가 5B이기 때문에 마지막 5라고 명시했다.(문자열의 끝을 알리는 특수부호인 null를 포함하기 떄문에 5B다.)

read(fd, buf, 5): fd, 즉 com.txt 파일에서 5B를 읽어 변수 buf에 저장하라는 뜻이다.

 

-파일 닫기: close()함수를 이용하여 파일을 닫는다.

close(fd): fd가 가리키는 파일, 즉 com.txt파일을 닫는다.

 

파이프를 이용한 통신

프로세스 동기화 문제를 해결하는 방법으로 파이프가 있다. 파이프를 이용한 통신은 운영체제가 제공하는 통기화 통신 방식으로, 파일 입출력과 같이 open() 함수로 기술자를 얻어 작업한 후 close() 함수로 마무리한다.

파이프를 이용한 통신은 공유 메모리나 공유 파일을 이용한 통신과 마찬가지로 단방향 통신이다. 파이프로 양방향 통신을 하려면 파이프 2개를 사용해야 한다. 

파이프는 이름이 없는 것은 일반적으로 파이프 라고 하면 이름 없는 파이프를 가리킨다. 부모와 자식 프로세스 혹은 같은 부모를 가진 자식 프로세스와 같이 서로 관련이 있는 프로세스 간 통신에 사용된다.

이름 있는 파이프는 FIFO라 불리는 특수 파일을 이용하며 서로 관련 없는 프로세스 간 통신에 사용된다.

 

소켓을 이용한 통신

인터넷을 사용하려면 TCP/IP, 즉 IP Internet Protocol와 TCP Transmission Control Protocal 가 있어야 한다. 인터넷에서 IP의 역할은 목적지까지 데이터를 전송하는 것이며 이때 사용되는 주소가 IP주소다.

서버에서 돌아가는 프로세스를 데몬이라고 하는데, 서버용 데몬도 포트 번호가 필요하다. 서버용 데몬에 임의의 포트 번호를 부여하면 클라이언트가 해당 번호를 매번 찾아야 한다. 그래서 중요한 서버용 프로세스(데몬)에는 미리 정해진 포트 번호를 할당한다. 하나의 가전제품을 동시에 사용하려면 멀티탭을 연결해야 하듯이, 하나의 포트에 여러 클라이언트를 연결하려면 소켓(socket)이 필요하다. 클라이언트들은 포트에 연결된 멀티 소켓에 하나씩 연결된다. 서버 프로세스는 소켓을 사용하여 동시에 여러 클라이언트 소켓이 서버 소켓에 데이터를 보내는 것이다. 그래서 네트워크 프로그래밍을 소켓 프로그래밍이라고 부른다.  

소켓은 프로세스 동기화를 지원하므로 데이터를 받는 쪽의 프로세스가 바쁜 대기를 하지 않아도 된다. 앞에서 언급했듯이 파이프를 이용한 통신에서는 양방향 통신에 파이프가 2개 필요 하지만 소켓을 이용한 통신에서는 1개만 사용해도 양방향 통신이 가능하다.

 

728x90

'Lecture > OS' 카테고리의 다른 글

교착 상태의 개요  (2) 2023.10.31
공유 자원과 임계구역  (2) 2023.10.21
스케줄링 알고리즘  (2) 2023.10.19
스케줄링의 개요  (0) 2023.10.18
스레드  (2) 2023.10.17