서버 프로그래밍 시 큐의 복사를 막을 방법이 있을까요?

sangheon의 이미지

소켓에서 read()나 write() 들어오고 나가는 것을 처리하기 위해서 큐를 많이 쓰시는 것으로 알고 있습니다. 특히 원형큐를 많이 쓰실텐데 이런 경우 생기는 두가지 오버헤드를 줄이는 방법에 대해서 고민해 봤지만 뾰족한 묘수가 떠오르지 않아 질문 올립니다.

1. Queue 의 복사

큐에 있는 데이터를 처리(읽기 또는 쓰기) 위해 이 데이터를 적당한 구조체로 복사하는 오버헤드가 있습니다. 이를 복사하지 않고 처리 할 수 있는 방법이 있을까요? 특히 소켓 통신과 자료 처리를 하는 쓰레드가 따로 돌아가고 있는 경우에 말입니다. (즉, 큐에 경쟁적인 lock이 들어가는 경우)

버퍼를 미리 생성해 놓고 그 포인터를 큐로 관리하면 데이터들을 복사하는 것보다는 부담이 적게 들 것 같습니다만, malloc 의 오버헤드를 고려하면 미리 메모리를 할당하고 그것을 사용해야하는데 이 부분에 대한 코드도 나름대로 오버헤드라 복잡성을 고려하면 쌈박한 해결책은 아닌 것 같아 고민 중입니다.

2. 원형큐의 경계선

원형큐가 가령 uint8_t cqueue[100]; 으로 선언된 경우 50-79 까지 한 패킷(30바이트)이 들어가서 처리를 기다리는 도중에 다시 50 바이트짜리 패킷이 도착한 경우 80-99, 0-29 에 쪼개져서 들어가게 됩니다. 이렇게 된다면 결국 read()를 두번 나눠서해야 하는데 이 경우에도 좀 더 깔끔한 처리 방법이 있을런지요?
(지금까지는 buffer -> queue -> data structure 로 해서 두번 복사하는 무식한 방법을 썼습니다. ㅡㅡ;)

그동안 대강 만들어서 써왔는데 이번에 라이브러리화 하려고 정리하다보니 좀 더 효율을 높이기 위해 고민되는 것이 많군요. 고수 분들의 지도 한수 부탁드립니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.