두개의 쓰레드에서 동시에 작업을 하다가 ....

김혜영의 이미지

첫번째 쓰레드는 업로드 요청을 하면, 웹서버에 업로드를 하는 쓰레드 이며,
두번째 쓰레드는 다운로드 요청을 하면, 동일 웹서버에서 다운로드를 하는 쓰레드입니다.

혹시여.
업로드와 다운로드 요청이 동시에 이루어 지거나, 쓰레드가 동시에 작동하다, 스케줄링이 잘못되어 다운로드, 또는 업로드 하던 데이터가 변형될 가능성이 있는지요?

그런일이 있는지? 또는 없는지? 왜? 그럴 수 밖에 없는지 자세히 설명해 주셨으면 합니다.

질문내용이 RTFM 꺼리라도 꼬옥 설명 부탁드립니다.

새해 복 많이 받으세요 ^^;

tasy의 이미지

일단 있을 수 있습니다.
기본적으로 쓰레드를 생성하여 사용하게 되면 각각의 쓰레드는 시스템에 대해서 자신 나름에 접근 권한을 가지게 됩니다.

예를 들어 어떤 사용자가 용량이 약간 큰 test.avi를 올리고 있다고 한다면 그 파일이 시스템에 업로드되고 있는 상태기 때문에 다운로드 쓰레드를 이용하는 다른 사용자가 다운로드 받을 수 있습니다.(업로드시 파일이 제대로 생성되야하겠죠)

그렇게 다운받게 된다면 제대로 된 파일이 아닌 파일을 다운 받을 수 있으니 신뢰성에서 문제가 있게되죠.

단순한 업다운 프로그램이라면 특별하게 mutex같은걸 사용할 필요없이 예외적으로 보호받아야 할 경우(업로드 중인 파일 이라던지)에 대해서 처리를 해주면 됩니다.

그리고 말씀하신 데이터가 변형될 가능성은 많지 않을 것 같습니다. 신뢰도에 대한 문제는 존재할 것 같습니다만 업로드 다운로드 프로그램의 동작으로 인해 파일이 변형 될 일은 별로 없어보이는군요.

---------
Byeongweon Moon
http://tasy.jaram.org/blog
사랑하면 알게 되고 알면 보이나니 그때에 보이는 것은 전과 같지 않으리라.

ssehoony의 이미지

약간 상황 설명이 부족하군요.
클라이언트의 쓰레드에 대한 질문 같은데 실제로는 웹서버측의 동기화 문제에 대한 질문 같군요

질문은 웹서버에 업로드중인 파일을 다운로드하면 어떻게 되느냐인가요?
그렇다면 답은 "그때 그때 달라요" 입니다.
웹서버마다 처리하는 방식이 다르기 때문이죠.
가령 PHP 로 작성된 서버에 업로드를 하게 되면
PHP 는 파일 업로드된 데이터를 완료되기 전까지 모두 메모리에 담아둡니다.
업로드가 완전히 완료되면 그때 디스크에 기록을 하지요.
그렇기 때문에 업로드중에 다른 사용자가 다운로드를 요청해도
실제 디스크에 존재하지 않기 때문에 다운로드를 할 수 없습니다.

그리고 위 질문을 다르게 해석해 보면
한 소켓을 두 쓰레드에서 send 와 recv 를 동시에 하면 어떻게 되는냐?
라는 질문으로도 해석할 수 있을 듯 한데요.
send 버퍼와 recv 버퍼는 별도로 관리되기 때문에 두 데이터가 섞일일은
없습니다.
하지만 실제 이렇게 프로그램을 작성하는 일은 없을겁니다.
왜냐하면 업로드 중이면 업로드 상태에 대한 정보를 recv 해야 할텐데
다운로드데이터와 업로드 상태에 대한 정보를 구별하기 힘들테니깐요.
업로드와 다운로드를 동시에 할려면 소켓을 하나 더 생성하는 쪽이
쉽고 편할 것 같네요.

댓글 달기

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