네트워크
과거 UNIX는 단순히 프로세스 간의 통신 구조만 제공하고 있습니다. 이를 보완하기 위해 유연성이 풍부한

프로세스 간의 통신 인터페이스로 소켓이 등장했으며, 통신 프로코톨로는 TCP/IP가 가장 일반적으로 이용

되었습니다. BSD UNIX에서 시작된 이 네트워크 구조는 현재 대부분의 OS에서 채용하고 있습니다.

 

소켓

소켓은 임의의 프로세스들끼리 통신을 할 수 있게 합니다. 하위층에 다양한 통신 프로토콜을 정의할 수 있

고 호스트와 프로세스 간에도 통신을 할 수 있게 합니다.

리눅스 커널에서 소켓 인터페이스는 커널 내에 구현되어 있습니다. 소켓이 관리하는 송수신 데이터는 소켓

버퍼 구조로 관리합니다. 데이터 교환을 단순하게 구현하면 데이터 복사가 여러 번 발생할 수 있기 때문에

소켓 버퍼는 프로토콜 처리 시 데이터 복사가 발생하지 않게 구현되어 있습니다. 예를 들어 다음에 설명할

TCP/IP 프로토콜 스텍의 송신처리에서 TCP나 IP, 이더넷의 헤더를 생성할 때 기존 소켓 버퍼에 헤더 일부

를 간단하게 추가할 수 있습니다.

또한, 데이터 복사를 제어하기 위해 소켓 버퍼의 데이터 부분을 공유하는 구조도 제공합니다. 이는 TCP 재

발송 처리 등에서 이용됩니다. 메모리 상의 임의의 페이지를 소켓 버퍼 데이터로 등록할 수 있으며, 파일시

스템 등에서 전송되는 데이터를 소켓 버퍼로 복사하지 않고 네트워크로 직접 전송할 수 있습니다.

 

TCP/IP 프로토콜 스택

BSD를 베이스로 하고 있는 OS가 많지만 리눅스 커널은 완전히 TCP/IP 프로토콜 스택으로 되어 있습니다.

System V가 도입한 STREAMS 등 범용적인 등 범용적인 것은 사용하지 않고 있습니다. 이더넷 등의 물리적

인 디바이스를 제어하는 디바이스 드라이버 상에 IP 프로토콜 드라이버를 두고 그 위에 TCP 프로토콜 드라

이버나 UDP 프로토콜 드라이버를 배치하고 있습니다. 게다가 리눅스 커널 2.6에서는 SCTP 프로토콜도 지원

합니다.

리눅스 커널의 TCP/IP 프로토콜 스택은 지연 처리를 최대한 활용하여 처리율을 높이고 있습니다. 또한 멀

티프로세서를 구성할 때 프로세서를 동시에 처리할 수 있는 능력을 향상시키기 위한 다양한 연구가 계속되

고 있습니다.

게다가 리눅스 커널은 USAGI팀의 활약에 의해 완성도가 높은 IPv6 스택도 갖추고 있습니다. 구현 측면에서

보았을 경우 기본적인 구조는 IPv4 스택과 거의 동일합니다.

또한 리눅스 커널은 TCP/IP 표준 이외의 확장 기능으로 패킷 필터링, NAT 기능, 부하 공유 기능 등도 갖추

고 있습니다. 리눅스 탑재 머신을 방화벽이나 로드 밸런스로 이용할 수도 있습니다.

 

[ TCP/IP 프로토콜 스택 계층 ]

Cap 2015-10-22 10-41-07-213

 

프로세스 간 통신

각 프로세스는 리눅스 커널 상에서 독릭적으로 동작하고 있지만 프로세스와 프로세스 간에 통신을 할 경우

에는 복수 프로세스가 제휴하여 동작할 수 있습니다.

UNIX의 독특한 방식으로 가장 역사가 긴 것은 파이프입니다. 파이프는 부모와 지식 프로세스 사이에만 연

결되어 있지만 이 파이프로 단순한 기능의 커맨드를 조합하여 복잡한 동작을 구현할 수 있습니다. 또한 부

모와 자식 관계가 없는 프로세스 사이에서도 이용할 수 있도록 확장한 것도 있습니다. 리눅스 커널에서 파

이프는 전통적이지만 파이프로 연결된 프로세스 간에 쓸데없이 프로세스 반환이 발생하지 않도록 선점 횟

수를 제어하도록 되어 있습니다.

System V IPC로 불리는 프로세스 간의 통신 기능도 구현되어 있습니다. 공유 메모리, 세마포어, 메시지로

불리는 것들입니다. 이들 중 공유 메모리는 파일시스템에서도 접근할 수 있습니다. 이 파일시스템을 가상

메모리 파일시스템 tempfs라고 부릅니다. 이것은 proc 파일시스템 등과 같이 공유 메모리에 가상 파일시

스템의 인터페이스를 설정하는 방식으로 구현되어 있습니다.

Futex :

Fast user space mutex

리눅스 커널 2.6에는 새로운 프로세스 간의 통신으로 FUTEX라는 것이 있습니다. 이것은 동일 머신 상의

복수 프로세스 간에 잠금 처리를 합니다. 동일 페이지를 프로세스에 매핑하고 그 위에 잠금 변수를 공유하

게 함으로써 경합이 발생하지 않는 한 시스템 콜 개임 없이 잠금 처리를 할 수 있습니다. 많은 프로세스나

스레드가 협조하여 동작하는 응용 프로그램에서는 매우 유용한 구조입니다.

futex는 프로세스/쓰레드간 Synchronize/Serialize를 위해 사용하는 MUTEX 개념을 User space에서 구현한 fast user space mutex를 지칭합니다.
즉, 주어진 자원에 대한 접근을 통제하여 Data Corruption을 방지하고 작업을 동기화하기 위해 필요한 locking 매커니즘이라고 생각하면 됩니다.

pthread_mutex_lock() 등 glibc pthread 라이브러리에서 사용되며, 사용자가 직접 mutex를 정의하여 사용하거나 또는 malloc등 많은 glibc 함수에서 사용하고 있습니다.

 

Mutex :

단일 프로세스의 경우, 특정 지역, 즉 임계 영역에서 하나의 스레드만 존재하도록 함.

자바의 synchronized와 같은 역할 멀티 프로세스의 경우, 세마포어를 사용한다.

뮤텍스는 '잠금'의 기능을 가져서 임계 영역을 잠그기 위한 pthread_mutex_lock()과 pthread_mutex_unlock()이 있다.

어느 블로그에서 설명하는 것을 읽었는데 이 잠금을 화장실의 잠금 장치로 비유하심.

 
Linux 프로세스간 통신 기법, Mutex, Futex

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다