2009년 10월 8일 목요일

[TCP] Pipeline 전송 1 : Pipeline이란 무엇인가?

이제까지 신뢰적인 데이터 전송에 대해 살펴봤다. 데이터를 손실없이 목적했던 곳으로 보내는 것은 우리가 인터넷을 안심하고 사용하는데 있어서 가장 중요한 요소라고 말할 수 있다. 그래서 그런 중요한 부분을 해결하기 위해 TCP는 여러 가지 기법을 적용했다. 그렇다면 데이터가 신뢰적으로 전송된다면 그것으로 모든 것이 해결된 것인가?

 

요즘과 같이 콘텐츠가 홍수처럼 쏟아지고 동영상을 인터넷으로 실시간 플레이해서 보는 경우가 많은 때에는 데이터의 신뢰적인 전송 외에도 그 데이터의 속도 역시 매우 중요한 factor가 된다. 물론 데이터의 속도는 데이터를 많이 보낼 수 있는 매체(광 LAN과 같이...)에 기반하지만, 그 기반이 잘 갖춰진 상태라 하더라도 데이터를 보내는 송신자가 그 속도를 충분히 이용할 수 있도록 데이터를 보내지 않는다면 소용이 없는 것이다. 그렇다면 TCP는 어떤 방법으로 제공된 대역폭을 효율적으로 사용하는가? 그 방법 중 하나가 Pipeline 전송 방식이다. 이번 포스트에서는 TCP가 사용하는 pipeline 전송 방식이 어떤 것인지를 살펴보기위해, 우선 pipeline 전송 방식이라는 것이 무엇인지를 살펴볼 것이다.

 

누가 이름을 Pipeline이라고 붙였는지는 잘 모르겠지만.. 그리고 경우에 따라 여러 가지 용도로 그 의미가 해석되지만, 대체적으로 특정 process의 빠른 처리를 위해 어떤 하나의 operation이 완료되기 전에 그 다음 operation을 진행시키는 방식을 pipeline 방식이라고 한다. 이해를 돕기 위해 CPU에서의 pipeline 방식을 살펴보자. 보통 CPU는 특정 명령을 수행하기 위해 몇 가지 단계를 거치는 데 ARM7의 경우는

 

명령어를 메모리로부터 가져오고 (fetch)

가져온 명령어를 해석한 후(decode)

실행하는(excute)

 

세 가지의 단계를 거친다. 이러한 명령어 수행 단계 중에 CPU가 일을 안하고 놀게 되는 경우가 종종 생기는데, 예를 들어 첫번째 fetch의 과정에서 메모리가 CPU에 비해 속도가 많이 느릴 경우, 메모리에서 명령어를 가져오기까지 CPU가 일을 안하고 놀 수 있고, 또한 실행하는 과정에서도 CPU보다 속도가 현저히 느린 I/O장치 등의 결과를 기다려서 처리하는 과정에서도 그럴 수 있다. 이렇게 CPU가 일을 안하는 상태를 Idle상태라고 하는데 이처럼 CPU의 본래 성능을 다 활용하지 못하는 경우를 피하기 위해 명령어를 pipeline방식으로 실행시킨다. 즉 첫 번째 커맨드를 fetch할 때 메모리로부터 응답을 기다리는 동안 두 번째 커맨드의 fetch를 시작시키는 것이다. 이러한 방식은 CPU와 메모리를 모두 Idle상태에 들어가게 하지 않고 원래 가진 성능을 최대한 활용하게 해준다.

 

그렇다면 TCP는 어떤 방식으로 pipeline 방식을 전송 시에 사용하는가? 쉽게 생각할 수 있듯이 세그먼트를 보내고 응답이 올 때까지 기다리는 시간(Idle)을 없애기 위해 pipeline을 사용한다. 즉 특정 데이터의 전송 시에 Idle 타임을 최소화 시키기 위하여 pipeline 전송 방식을 사용하는 것이다.


댓글 없음:

댓글 쓰기