더북(TheBook)

이번 예제는 가상 함수 테이블 포인터 외에 다른 포인터도 사용하고 있다. mHomeBase 포인터를 다른 프로세스로 복제할 때도 마찬가지로 의도치 않은 결과가 빚어진다. 포인터는 성격상 특정 프로세스의 메모리 공간의 한 주소를 가리키고 있다. 이러한 포인터를 다른 프로세스에 무작정 전송해 놓고선 그쪽 메모리에도 정확히 해당 위치에 같은 값이 있겠거니 기대해선 곤란하다. 포인터가 가리키거나 레퍼런스가 참조하는 데이터 전체를 동일하게 복제 전달해 주거나, 해당 데이터와 ‘동일하게’ 취급되는 내용을 수신자 프로세스에서 찾아 연결해 주는 기능이 구현되어 있어야 견고한 리플리케이션 코드라 하겠다. 이 장 말미의 4.3 참조된 데이터 처리 절에서 이 기법에 대해 좀 더 자세히 다루자.

mName 필드를 복사할 때 매번 128바이트 전체를 복사해야 하는 것도 단순 구현에서 드러나는 또 다른 문제점이다. 선언된 배열은 128바이트까지 담을 수 있지만, 대개는 이름이 그렇게 길지 않고 샘플 RoboCat에서도 ‘Fuzzy’ 다섯 글자만 쓰고 있다. 대역폭 절약은 네트워크 담당 프로그래머의 필수 덕목으로, 불필요한 데이터는 가능한 직렬화하지 않아야 좋은 직렬화 시스템이라 하겠다. 이번 예제에선 mName 필드가 C 표준 널 종료 문자열이므로 문자열을 널 표시까지만(표시 포함) 전송하면 대역폭을 절약할 수 있다. 이는 직렬화 중 런타임에 데이터를 압축하는 여러 기법 가운데 하나로, 이 장 말미의 4.4 압축 절에선 다른 기법도 살펴보겠다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.