[질문] 급... 로직을 어떻게 해야 할지...

letitbe21의 이미지

로직을 어떻게 새워야 할지 몰라서 질문 드립니다.

많은 양의 데이터가(각 전문 마다 8KByte) 초당 500 건정도 들어 옵니다.

클라이트 프로그램에서 socket를 통해서 데이터를 보내면 스레드를 생성(main 스레드) 시켜,
클라이언트에서 받은 데이터(8KByte)를 다른 스레드(처리 스레드)로 보내는 과정입니다.
어떻게 사용을 해야 될지 모르겠네여....
메케지 큐, 공유 메모리, FIFO등 어떤 IPC 를 사용을 해야 될지요...
스레드와 스레드 상에는 같은 시스템 입니다.

ssehoony의 이미지

client 와 server 사이는 socket 으로 하신다고 하셨고
server는 thread 간 데이터 이동으로 하신다고 하셨는데
어떤 IPC를 사용하실건지 고민하시는 이유가 뭔가요?

letitbe21의 이미지

답변 감사합니다.

일단 client에서 온 전문의 길이가(8K) 정도 됩니다...
그 양은 위에도 써 있다시피 초당 500건이 오고요...
그래서 Server 에서 쓰레드간에 통신을 어떤 IPC를 쓸지 고민입니다.

jinyeong의 이미지

thread를 사용하신다고 하셨으니, pthread_cond_wait/signal을 사용하셔서 처리 하시면 될 것 같네요.
처리 thread는 pthread_cond_wait을 하고 있다가 server thread에서 signal이 오면
처리를 시작하면 됩니다.

이때 초당 500건 정도의 request라고 하셨으니, 따로 queue를 둬서 처리하면 될 것 같구요.
queue는 제공되는 적당한 library의 queue를 사용하셔도 좋고 간단히 list add_last, remove_first
정도로 구현해도 됩니다.

대신 이 queue는 pthread_mutex_lock/unlock을 사용해서 server와 처리 thread 에서 접근시
mutual exclusion을 보장하면 될 것 같습니다.

다시 한번 간단히 보여 드리면, 아래 pseudo code의 loop으로 구현하면 될 것 같습니다.

-- server thread --
read from socket
mutex lock
insert into the queue
mutex unlock
pthread cond signal

-- 처리 thread --
pthread cond wait
mutex lock
get from the queue
mutex unlock
processing the data

I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?

익명 사용자의 이미지

메시지 큐, 공유 메모리, FIFO는 thread에서 못쓸건 없지만
주로 프로세스간에 많이 사용됩니다.

thread를 추후 프로세스로 분리할 예정이 없다고
c++사용한다면 stl의 list를 이용하면 될듯하네요.

A thread lock 값쓰기 unlock -> list -> B thread lock 값읽어오기 unlock

letitbe21의 이미지

개발 언어는 C 언어로 사용 합니다.
개발 시스템은 리눅스 이지만....
다른 시스템(즉 OS 가 다른것)으로 포팅 할 수 있습니다.
큐를 사용 하신다고 하셨는데 시스템 상황이 그렇게 좋지 않습니다.
시스템 환경들을 변경 하지 않고 할 수 있는 방법이 난감 합니다.
조언을...

현재 queue 사이즈는 아래와 같습니다...
kernel.msgmnb = 16384
kernel.msgmni = 16
kernel.msgmax = 8192
fs.mqueue.msgsize_max = 8192
fs.mqueue.msg_max = 10

jinyeong의 이미지

msg queue 가 아니라, 일반적인 자료구조의 queue를 말씀드린 것입니다.

I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?

letitbe21의 이미지

답변 감사합니다.
만약에 처리 스레드가 여러개 일경우 어떻게 해야 되나요?

jinyeong의 이미지

위의 제 답글의 pseudo code의 형태로 구현하신다면,
처리 thread를 여러개 만든다고 하더라도 동일하게 동작할 겁니다.
pthread_cond_signal 에 의해 하나의 thread가 wait에서 깨어나서
작업을 처리하게 될 것이기 때문입니다.

I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 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>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 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>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 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>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.