2010-02-04 5 views
1

우리 가게의 POS 소프트웨어에 대한 현재의 업데이트 시스템을 교체하려고합니다. 현재 우리 웹 서버에는 30 분마다 호출되는 스크립트를 호스팅하는 폴더가 있습니다. 이들은 현재 버전 번호를 전달하고 서버는 업데이트해야 할 파일, 해시 및 기타 관련 정보를 포함하는 XML 응답을 반환하여 업데이트 된 파일을 다운로드합니다.멀티 스레드 업데이트 서버

업데이트를 트리거하는 데 사용할 수있는 UDP 패킷을 수신 대기하는 서비스가 필요합니다. 이렇게하면 레지스터가 불필요하게 업데이트 폴링을하지 않게됩니다. 컴퓨터에서 TCP 연결을 수신하고 인증하고 일부 로깅을 수행 한 다음 변경된 파일에 대한 업데이트를 보내주는 업데이트 서버를 작성하고 있습니다. 회사 전체에 출시하기 전에 테스트를 마친 후 평가판을 실행하기 위해 POS 버전을 특정 시스템에 릴리스해야하므로 사용자 정의 업데이트 서버로 전환하려고합니다.

들어오는 연결을 처리하고 해당 클라이언트와의 통신을 처리하는 새로운 스레드를 만드는 코드를 작성했지만 다중 스레드 방식으로 파일 I/O를 처리하는 데 어려움을 겪고 있습니다.

이미 다른 스레드에서 열려있는 경우 하나의 스레드에서 파일을 열어 파일에 액세스 할 수 없다고 확신합니다. 나는 파일을 메모리로 읽어 들이고 미리 쓰레드 안전 컨테이너에 보관하고 싶지 않다. 많은 메모리를 사용할 것이므로, 특히 스레딩 문제를 피하기 위해 각 쓰레드에 대한 복사본을 보관할 필요가있는 경우 특히 그렇다.

많은 메모리를 사용하거나 스레드가 다른 스레드에서 파일을 끝내기를 기다리지 않고 스레드로부터 안전한 방법으로 디스크/메모리에서이 파일에 액세스 할 수있는 가장 좋은 방법은 무엇입니까?

편집 : 우리는 C#을 사용하고 있습니다.

+0

데이터베이스 나 웹 서비스가 필요한 것처럼 들립니다. – Nate

답변

2

여러 스레드가 파일을 열 수있는 수 만 읽을 수 있다면 . 파일 모드를 올바르게 설정하기 만하면됩니다.

두 스레드가 파일에 대한 읽기/쓰기 핸들을 시도하고 열면 오류가 발생합니다 (Windows의 경우).

+0

알아두면 도움이됩니다. 파일에서 읽을 필요가 있기 때문입니다. 필자는 파일 I/O 부분에 뛰어 들기 전에 여러 스레드에서 파일을 읽는 데 문제가 발생하지 않도록하고 싶었습니다. – Matt

1

See C# async IO documentation.

파일이 변경됩니까? 왜 다른 스레드에서 읽을 수 없습니까? 일반적으로 개별 스레드에서 파일을 두 번 열 수 있습니다. 그러나 당신의 쓰기/독서가 명령 될 것을 기대하지 마십시오.

레지스터가 UDP 업데이트 알림과 같이 업데이트가 누락되면 어떻게됩니까? 아마 적어도 지금은 계속해서 투표를해야합니다.

당신이 웹 서버를 개혁하고있는 것 같습니다

는 ... 같은 효과 acheive 웹 서버 (TCP 연결, 로깅, 파일 전송)의 적절한 구성이

0

Windows의 경우 유용한 기능인 TransmitFile이 있습니다. 그렇게하면 OS가 캐싱을 처리하도록 할 수 있습니다. 이것은 C 호출이지만 C++/CLI 프로젝트에서 사용하는 것이 매우 쉽습니다. 오버랩 된 io를 사용하여 비동기 적으로 호출을 수행 할 수 있습니다.

이렇게하면 Windows 캐시 관리자가 파일을 읽고 데이터를 전혀 건드리지 않고도 소켓에서 데이터를 전송합니다. 이 기능은 소켓을 통한 고성능 파일 데이터 전송을위한 것입니다.

파일을 열어서 캐시 된 파일에 핸들을 유지하고 (다시 열 필요가 없도록) 연결된 파일로 보내기 위해 TransmitFile을 호출하십시오.기능이 제대로 작동하려면 서버 OS에 있어야합니다 (클라이언트 OS 버전에서 전송에 제한이 있음).