2014-03-25 8 views
2

쓰기 버퍼를 올바르게 만들려면 어떻게해야합니까? 현재 할당 된 버퍼의 링크 된 목록을 사용하고 있지만 쓰기의 대부분은 단지 몇 바이트입니다. 효율적인 쓰기 버퍼를 만드는 방법에 대한 귀하의 제안은 무엇입니까?LibEV 올바르게 버퍼하는 방법?

답변

3

링크 된 목록이 아마도 여기에서 최선의 선택이 아닙니다. 그것의 순회는 캐시 친화적이지 않고 비싸다.

링 버퍼 [1]를 사용할 수 있습니다. 일부 소비자는 원시 바이트를 넣을 것이고 일부 제작자는 나중에 사용 가능한 전체 내용을 가져 와서 한 번의 시스템 호출로 보낼 것입니다.

연속적인 메모리 영역에 쓰기가 바람직하지 않은 경우 (예 : 제로 복사 방식으로 수행 할 수없는 경우), 메모리를 참조하는 struct iovec를 링 버퍼에 넣을 수 있습니다. 그러면 소비자는 모든 iovec를 잡고 writev [2]로 전달합니다.

생산자 및 소비자에 대해 말하면 OS 레벨 스레드 일 수 있으므로 버퍼 주위에서 동기화해야하거나 섬유 일 수 있습니다 [3]. 후자는 이벤트 기반 응용 프로그램을 수행하는 경우에 바람직합니다. 나는 당신이 볼 수있는 libev를위한 섬유의 구현 [4]을 가지고있다. 또한 효율적인 가상 링 버퍼 구현을 포함합니다.

참고 :

  1. http://en.wikipedia.org/wiki/Circular_buffer
  2. http://man7.org/linux/man-pages/man2/readv.2.html
  3. http://en.wikipedia.org/wiki/Fiber_(computer_science)
  4. https://github.com/Lupus/libevfibers
+0

덕분에, 나는 링 버퍼 아이디어를 사용하여 끝났다. – erai