앞서 프로세스 개념과 스케줄링에 대해 알아보았습니다. 그럼 여기서 서로 독립된 개체인 프로세스들끼리는 어떻게 데이터를 주고받는지 알아보겠습니다.
프로세스 간 통신의 종류
[프로세스 내부 데이터 통신]
하나의 프로세스 내에 2개 이상의 스레드(thread)
가 존재하는 경우의 통신이다. 스레드(thread)
는 전역 변수나 파일을 이용하여 데이터를 주고받는다.
[프로세스 간 데이터 통신]
같은 컴퓨터에 있는 여러 프로세스끼리 통신할 때는 공용 파일
또는 운영체제가 제공하는 파이프
를 사용해 통신합니다.
[네트워크를 이용한 데이터 통신]
여러 대의 컴퓨터가 네트워크로 연결되어 있을 때, 소켓을 이용하여 데이터를 주고받습니다. 이렇게 소켓(socket)
을 이용한 프로세스 간 통신을 네트워킹이라고 합니다.
같은 컴퓨터에 있는 프로세스끼리도 루프백 주소를 통해 소켓 통신이 가능하지만 오버헤드가 크기 때문에 거의 사용하지 않습니다.
기본적으로 프로세스 간 통신 방식은 ''주거나(send) 받는다(receive)''로 이루어져 있습니다. 겉으로 보기에는 단순해 보이지만 통신하려는 상대 프로세스를 어떻게 찾을지, 데이터의 크기는 얼마로 할지, 데이터 도착 여부는 어떻게 알지 고려해야 할 사항들이 많습니다.
프로세스 간 통신의 분류
[통신 방향에 따른 분류]
- 양방향 통신 : 데이터를 동시에 양쪽 방향으로 전송할 수 있는 구조 (소켓 통신)
- 반양방향 통신 : 양쪽 방향으로 전송할 수 있지만 동시 전송을 불가능한 구조 (무전기)
- 단방향 통신 : 한쪽 방향으로만 데이터를 전송할 수 있는 구조 (전역 변수, 파이프)
대부분의 통신은 양방향 통신이지만 전역 변수는 단방향 통신입니다. 만약 양쪽에서 동시에 전역 변수를 변경한다면 하나의 데이터는 지워지게 됩니다. 그러므로 항상 전역 변수를 사용할 때는 주의해야 합니다.
[통신 구현 방식에 따른 분류]
전역 변수를 사용하는 통신 방식의 큰 문제는 언제 데이터를 보낼지 데이터를 받는 쪽에서는 모른다는 것입니다. 알기 위해서는 전역 변수의 값을 반복적으로 확인하는 방법밖에 없습니다. 결국 이는 무한 루프에 빠지게 되고 바쁜 대기 상태(busy waiting)
가 됩니다. 시스템 차원에서 바쁜 대기는 안 좋은 프로그램의 전형적인 예입니다.
바쁜 대기 문제를 해결하기 위해서는 데이터가 도착했음을 알려주는 동기화(synchronization)
작업이 필요합니다. 카카오톡 메시지 알림 같은 것이 동기화에 대표적인 예입니다. 프로세스 간 통신에서 동기화 여부에 따라 분류할 수 있습니다. 내용은 아래와 같습니다.
- 대기가 있는 통신 : 동기화를 지원하는 통신 방식 (파이프, 소켓)
- 대기가 없는 통신 : 동기화를 지원하지 않는 통신 방식 (전역 변수, 파일)
대기가 있는 통신은 필연적으로 오버헤드가 발생할 수밖에 없는 구조입니다. 그래서 네트워크 통신 같은 경우는 비동기로 처리하는 경우가 많습니다. 단 비동기로 처리할 경우 통신 오류로 인한 예외 처리나 통신이 완료되고 난 후의 처리는 사용자가 직접 해주어야 합니다.
'컴퓨터 공학 > 운영체제' 카테고리의 다른 글
[운영체제] 메모리 관리 (0) | 2021.10.19 |
---|---|
[운영체제] 교착상태(Dead Lock, 데드락)이란? 그 해결 방법은? (0) | 2021.10.09 |
[운영체제] 스케줄링 종류와 목적 (0) | 2021.09.19 |
[운영체제] 프로세스와 스레드의 차이 (0) | 2021.09.12 |
[운영체제] 병렬 처리 기법 (0) | 2021.08.30 |
댓글