2012-09-06 2 views
0

select() 함수를 사용할 수 있습니까?소켓 프로그래밍에서 선택

내 작은 경험에서 나는 스레드가 충분하다고 생각하는 경향이 있습니다.

select()는 스레드를 아직 모르는 사람들을위한 교훈적인 도구일까요?

답변

2

다음 예제를 고려하십시오. 100K 연결과 같이 무난하게 사용하는 웹 서버가 있습니다. select 또는 그와 비슷한 것을 사용하지 않으므로 연결 당 하나의 스레드가 있으므로 곧 문제가되는 100K 스레드를 암시합니다.

그런 괴물이 허용 될 때까지 시스템을 조정할지라도 대부분의 스레드는 소켓에서 대기합니다. 소켓이 재미있을 때 에게 알려주는 메커니즘이 있다면 더 좋지 않겠습니까?

다른 말로하면 스레딩 및 select과 같은 메커니즘이 보완 적입니다. threads을 사용하여 간단하게 대체 할 수 없습니다. select은 파일 설명자 모니터링입니다.

+0

확인. 무슨 소리 야. 스레드 사용에 대한 우수 사례를 제공하고 클라이언트 - 서버 아키텍처를 선택할 수 있습니까? – coredump

+0

@coredump 그것은 당신이 정말로하고있는 일에 달려 있습니다. – cnicutar

+0

파일 전송 프로젝트입니다. 서버는 클라이언트에 대한 데이터를 호스트합니다. 실제 전송은 클라이언트간에 피어 - 투 - 피어입니다. 서버는 호스트의 파일 및 기타 데이터 만 보유합니다. 클라이언트는 여러 연결을 허용 할 수 있으며 파일의 일부를 전송 한 다음 다른 연결로 이동하고 파일의 일부를 전송하는 등의 작업을 수행하려고합니다. – coredump

1

단일 스레드 폴링은 사용, 구현 및 (가장 중요한 것은) 을 이해하면을 이해합니다. 동시 프로그래밍은 프로젝트에 엄청난 지적 비용을 추가합니다. 데이터 동기화가 까다 롭고 오류가 발생하기 쉽고, 잠금 기능이 버그에 대한 많은 기회를 제공하며 잠금없는 데이터 구조로 인해 성능이 저하되고 프로그램 흐름이 정신적으로 시각화되기 어렵습니다 (또는 " 혹시). 직선적을 유지하면서 대조적으로

은 (아마도 epoll/kqueue보다는 select와) 단일 스레드 폴링은 당신에게 아주 좋은 성능 (정확하게는 데이터에 대한 응답으로 무슨 일을하는지에 당연히 따라)를 제공합니다.

Linux에서는 특히, 모든 유형의 폴링 세트를 처리하는 매우 균일 한 방법을 제공하는 timerfds, eventfds, signalfds 및 inotify-fds 및 중첩 epoll-fds를 모두 폴링 세트에 포함시킬 수 있습니다 "비동기"이벤트. 결국 더 많은 성능이 필요하다면 여러 폴러를 동시에 실행하여 단일 병렬 처리 지점을 가지게되고 데이터 동기화 대부분이 커널에서에 대해 번 수행됩니다. 이는 단일 스레드 만 이벤트에서 성공적인 폴링을 수신 할 것이라고 약속합니다 준비.

관련 문제