두개의 쓰레드에서 동시에 작업을 하다가 ....
글쓴이: 김혜영 / 작성시간: 토, 2005/01/01 - 1:11오전
첫번째 쓰레드는 업로드 요청을 하면, 웹서버에 업로드를 하는 쓰레드 이며,
두번째 쓰레드는 다운로드 요청을 하면, 동일 웹서버에서 다운로드를 하는 쓰레드입니다.
혹시여.
업로드와 다운로드 요청이 동시에 이루어 지거나, 쓰레드가 동시에 작동하다, 스케줄링이 잘못되어 다운로드, 또는 업로드 하던 데이터가 변형될 가능성이 있는지요?
그런일이 있는지? 또는 없는지? 왜? 그럴 수 밖에 없는지 자세히 설명해 주셨으면 합니다.
질문내용이 RTFM 꺼리라도 꼬옥 설명 부탁드립니다.
새해 복 많이 받으세요 ^^;
Forums:
일단 있을 수 있습니다.기본적으로 쓰레드를 생성하여 사용하게 되면 각
일단 있을 수 있습니다.
기본적으로 쓰레드를 생성하여 사용하게 되면 각각의 쓰레드는 시스템에 대해서 자신 나름에 접근 권한을 가지게 됩니다.
예를 들어 어떤 사용자가 용량이 약간 큰 test.avi를 올리고 있다고 한다면 그 파일이 시스템에 업로드되고 있는 상태기 때문에 다운로드 쓰레드를 이용하는 다른 사용자가 다운로드 받을 수 있습니다.(업로드시 파일이 제대로 생성되야하겠죠)
그렇게 다운받게 된다면 제대로 된 파일이 아닌 파일을 다운 받을 수 있으니 신뢰성에서 문제가 있게되죠.
단순한 업다운 프로그램이라면 특별하게 mutex같은걸 사용할 필요없이 예외적으로 보호받아야 할 경우(업로드 중인 파일 이라던지)에 대해서 처리를 해주면 됩니다.
그리고 말씀하신 데이터가 변형될 가능성은 많지 않을 것 같습니다. 신뢰도에 대한 문제는 존재할 것 같습니다만 업로드 다운로드 프로그램의 동작으로 인해 파일이 변형 될 일은 별로 없어보이는군요.
---------
Byeongweon Moon
http://tasy.jaram.org/blog
사랑하면 알게 되고 알면 보이나니 그때에 보이는 것은 전과 같지 않으리라.
약간 상황 설명이 부족하군요.클라이언트의 쓰레드에 대한 질문 같은데
약간 상황 설명이 부족하군요.
클라이언트의 쓰레드에 대한 질문 같은데 실제로는 웹서버측의 동기화 문제에 대한 질문 같군요
질문은 웹서버에 업로드중인 파일을 다운로드하면 어떻게 되느냐인가요?
그렇다면 답은 "그때 그때 달라요" 입니다.
웹서버마다 처리하는 방식이 다르기 때문이죠.
가령 PHP 로 작성된 서버에 업로드를 하게 되면
PHP 는 파일 업로드된 데이터를 완료되기 전까지 모두 메모리에 담아둡니다.
업로드가 완전히 완료되면 그때 디스크에 기록을 하지요.
그렇기 때문에 업로드중에 다른 사용자가 다운로드를 요청해도
실제 디스크에 존재하지 않기 때문에 다운로드를 할 수 없습니다.
그리고 위 질문을 다르게 해석해 보면
한 소켓을 두 쓰레드에서 send 와 recv 를 동시에 하면 어떻게 되는냐?
라는 질문으로도 해석할 수 있을 듯 한데요.
send 버퍼와 recv 버퍼는 별도로 관리되기 때문에 두 데이터가 섞일일은
없습니다.
하지만 실제 이렇게 프로그램을 작성하는 일은 없을겁니다.
왜냐하면 업로드 중이면 업로드 상태에 대한 정보를 recv 해야 할텐데
다운로드데이터와 업로드 상태에 대한 정보를 구별하기 힘들테니깐요.
업로드와 다운로드를 동시에 할려면 소켓을 하나 더 생성하는 쪽이
쉽고 편할 것 같네요.
댓글 달기