file i/o 와 프로세스 점유에 관해서 궁금증이 있습니다.

moon8011의 이미지

안녕하세요.

제가 미디어를 play하는 데몬을 구현 중에 있는데요. 쓰레드 프로그램은 처음인지라 이해 되지 않는 부분이 많습니다.

play는 다음과 같이 구성되어있습니다.

1. file을 frame단위로 읽어 들이는 쓰레드

2. 읽어 들인 frame을 인코딩 하는 쓰레드

3. 인코딩된 frame을 rtp를 이용하여 전송하는 쓰레드

4. 서비스중인 세션들을 관리 하는 쓰레드 (play, stop, pause, resume...)

1,2사이와 2,3사이에 공유메모리를 이용하여 통신하고요 동기화를 위해 세마포어를 이용합니다.

결론적으로 1번쓰레드가 frame을 읽어와 공유메모리에 쓰는 순간 2번쓰레드가 인코딩을하고 또다른 공유메모리에 쓰고 그 순간
3번스레드가 전송합니다.

이런것이 현제 접속되어어있는 세션별로 한프레임씩돌아가면서 반복됩니다. 예를들어 3명이 play중이라면
첫번째 세션 1프레임처리 두번째세션 1프레임처리 세번째세션 1프레임처리 첫번째 세션 2프레임처리 두번째세션 2프레임처리 3번째세션
2프레임처리..... 이런식으로 진행됩니다.

그런데 하다보니까 이런식이라면 3개의쓰레드를 사용하는 이유가 없는것같아서요 그냥 하나의 쓰레드안에서 순차적으로 반복하는거랑 다를 바가 없는거 같아서 그렇습니다.

궁금점 1
위와같은 형식이라면 3개의 쓰레드를 쓸 필요가 없는가요?

궁금점 2
(file i/o 이용시) 1번 쓰레드처럼 file read중인 경우에 2번쓰레드가 처리 되는게 가능한가요?
일반적으로 말하면 file i/o(read,write...)사용시 이것은 프로세스를 점유하지 않아서 read write중에 인코딩처리를 할수있는가요?

궁금점 3
궁금점2에서 질문한바와같이 파일을 read하는것이 프로세스를 점유하지 않는다면 읽은 frame들을 queue에 쌓아서 read하는동안에도
queue에있는 frame들을 2번쓰레드에서 encoding하는것이 가능한가요?
(이질문을 한이유는 file i/o(read)시에도 프로세스를 점유한다면 어차피 read중에는 encoding이 불가능 하므로 그냥 순차적으로
read 한후 encoding하고 그후 보내고 다시 read하고 이런식으로 해도 상관이 없지 않나 해서입니다.

여러 모로 궁금한점이 많습니다. 기본적인 개념도 없는것 같네요.

조언 부탁드립니다.

jick의 이미지

UNIX 및 유사품 기준으로, 일반적으로 disk read는 항상 blocking입니다. 그 얘기는 read를 시켜서 블럭을 읽으려고 하는데 이 해당 블럭이 memory cache에 없으면 (미디어 play의 경우 한번 읽고 버리니까 이런 경우가 매우 잦겠죠.) 디스크에서 실제로 읽어올 때까지 해당 쓰레드가 놀고 있게 된다는 얘기죠.

따라서 read를 하면서 동시에 이미 읽은 블럭을 encoding할 수 없으므로 성능이 매우 저하됩니다.

해결책은 두 가지가 있을 것 같은데, 하나가 위에서 말씀하신 것처럼 별도의 쓰레드로 분리시켜 놓는 거구요, 또 하나는 asynchronous I/O API를 사용하는 것이죠. 두번째가 (OS에서 제대로 지원만 해준다면) 쓰레드를 따로 띄울 필요가 없으므로 성능이 조~금 더 좋을 것 같기는 한데, 프로그램이 좀 더 복잡해질 겁니다. (실은 저도 어떻게 쓰는지 잘 몰라요~~~) Linux의 경우 kernel 2.6에서부터 AIO를 제대로 지원하는 걸로 알고 있습니다.

moon8011의 이미지

많은 도움이 되었네요. 감사합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.