폴링과 셀렉트의 차이점은 무엇입니까?
POSIX 표준 선택 및 폴링 시스템 C API 호출을 말합니다.
그select()
call은 읽기, 쓰기 및 오류를 감시하는 소켓과 파일 기술자를 3가지 비트마스크로 작성하고 운영체제는 실제로 어떤 액티비티가 있었는지 표시합니다.poll()
디스크립터 ID 목록을 작성하면 운영시스템은 각 디스크립터 ID에 발생한 이벤트의 종류를 표시합니다.
그select()
방법은 다소 투박하고 비효율적입니다.
일반적으로 프로세스에서 사용할 수 있는 파일 기술자는 1,000개가 넘습니다.장시간 실행되는 프로세스에서 열려 있는 디스크립터가 몇 개밖에 없지만 적어도1개의 디스크립터에 높은 번호가 할당되어 있는 경우 비트마스크는 에 전달됩니다.
select()
에서는, 가장 높은 디스크립터를 수용할 수 있을 정도로 커야 합니다.따라서 수백 비트의 모든 범위가 설정되지 않아 운영체계가 모든 디스크립터를 루프오버해야 합니다.select()
전화를 걸면 불안하다는 것을 알게 됩니다.한번만
select()
를 반환하면 발신자는 어떤 이벤트가 발생했는지 판단하기 위해 3개의 비트마스크를 모두 루프해야 합니다.대부분의 응용 프로그램에서는 특정 시점에서1개 또는 2개의 파일 기술자만이 새로운 트래픽을 수신합니다.단, 3개의 비트마스크를 모두 끝까지 읽고 어떤 기술자인지 확인해야 합니다.operating system은 비트마스크를 고쳐 쓰는 것으로 액티비티에 관한 시그널을 송신하기 때문에, 비트마스크는 망가져 재생하는 파일 기술자 리스트가 표시되지 않게 됩니다.메모리에 보관하고 있는 다른 리스트에서 비트 마스크 전체를 재구축하거나 각 비트 마스크와 비트 마스크의 중복된 복사본을 보관해야 합니다.
memcpy()
데이터 블록은 각 비트마스크가 끝난 후에 파괴된 비트마스크 위에 표시됩니다.select()
불러.
그래서...poll()
같은 데이터 구조를 계속 재사용할 수 있기 때문에 접근 방식이 훨씬 효과적입니다.
실은.poll()
는 현대 Linux 커널의 또 다른 메커니즘에 영감을 주었습니다.epoll()
오늘날 서버에서는 한 번에 수만 개의 접속을 처리하려고 하는 경우가 많기 때문에 확장성이 더욱 향상됩니다.다음은 이 작업에 대한 좋은 소개입니다.
http://scotdoyle.com/python-epoll-howto.html
이 링크에는 다음과 같은 이점을 보여주는 멋진 그래프가 몇 개 있지만,epoll()
(알겠습니다)select()
이 시점에서는 비효율적이고 구식으로 간주되어 그래프에 선이 표시되지 않습니다.
http://lse.sourceforge.net/epoll/index.html
업데이트: Stack Overflow에 대한 또 다른 질문입니다.이 질문의 답변은 차이점에 대해 더욱 자세히 설명합니다.
Twisted에서 선택/폴 vs. epoll 원자로의 경고
이것이 당신의 질문에 대한 답변이라고 생각합니다.
Richard Stevens ( rstevens@noao.edu )부터 :
기본적인 차이점은 select()의 fd_set은 비트 마스크이기 때문에 크기가 일정하다는 것입니다.커널이 컴파일될 때 커널이 이 크기를 제한하지 않고 응용 프로그램이 FD_SETSIZE를 원하는 대로 정의할 수 있지만(오늘날 시스템헤더의 코멘트가 시사하는 바와 같이) 더 많은 작업이 필요합니다.4 .BSD의 커널과 Solaris 라이브러리 기능에는 모두 이 제한이 있습니다.그러나 BSD/OS 2.1은 이 제한을 피하기 위해 코드화되어 있기 때문에 실행할 수 있습니다.프로그래밍의 작은 문제일 뿐입니다. :-) 누군가가 Solaris 오류 보고서를 작성하여 수정 여부를 확인해야 합니다.
단, poll()을 사용하면 사용자는 pollfd 구조의 배열을 할당하고 이 배열 내의 엔트리 수를 전달해야 합니다.따라서 기본적인 제한이 없습니다.Casper에 따르면 select보다 poll()을 가진 시스템이 적기 때문에 poll()이 더 휴대성이 높습니다.또, 오리지날 실장(SVR3)에서는, pollfd 구조의 엔트리를 무시하도록 커널에 지시하는 디스크립터를 -1로 설정할 수 없었습니다.그 때문에, 어레이로부터 엔트리를 삭제하는 것이 어려워졌습니다.SVR4는 이 문제를 회피합니다.개인적으로는 항상 select()를 사용하고, BSD 환경에도 코드를 이식하기 때문에 poll()을 거의 사용하지 않습니다.이러한 환경에서 select()를 사용하는 poll()의 구현을 작성할 수 있지만 본 적이 없습니다.select()와 poll()은 모두 POSIX 1003.1g에 의해 표준화되고 있습니다.
2017년 10월 갱신:
위에서 언급한 이메일은 적어도 2001년 이후입니다.poll()
현재(2017년) 명령어는 BSD를 포함한 모든 최신 운영체제에서 지원됩니다.사실, 어떤 사람들은 그렇게 믿는다.select()
폐지해야 합니다.의견은 차치하고 휴대성에 관한 문제poll()
더 이상 현대 시스템의 관심사가 아닙니다.더 나아가,epoll()
그 후 개발되어(맨 페이지를 읽을 수 있습니다) 인기가 계속 상승하고 있습니다.
현대적 발전을 위해 아마도 당신은 사용하고 싶지 않을 것이다.select()
분명히 문제될 건 없지만요 poll()
더 현대적인 진화입니다.epoll()
, 와 같은 기능(및 기타 기능)을 제공합니다.select()
그 한계로부터 고통받지 않고.
둘 다 느리고 대부분 비슷하지만 크기와 특징이 다릅니다!
반복기를 작성할 때 다음 세트를 복사해야 합니다.select
매번!하는 동안에poll
아름다운 코드를 가지기 위해 이런 문제를 해결했습니다.또 다른 차이점은poll
는, 디폴트로 1024 를 넘는 파일 기술자(FD)를 처리할 수 있습니다. poll
는, 이러한 종류의 작업을 처리하기 위한 많은 변수를 가지지 않고, 다른 이벤트를 처리해, 프로그램을 보다 읽기 쉽게 할 수 있습니다.조작 장소poll
그리고.select
체크가 많아서 직선적이고 느립니다.
언급URL : https://stackoverflow.com/questions/970979/what-are-the-differences-between-poll-and-select
'programing' 카테고리의 다른 글
문자열에서 HTML 태그 제거 (0) | 2022.08.15 |
---|---|
Vuetify의 큰 크기의 v-checkbox 요소 문제 (0) | 2022.08.15 |
VueX 변환 최적화 (0) | 2022.08.15 |
상위 페이지에 속하는 Nuxtjs 페이지 구성 요소에 정의되지 않은 변수입니다. (0) | 2022.08.15 |
콘솔 주의: v-for로 렌더링된 구성 요소 목록에 명시적 키가 있어야 함 (0) | 2022.08.15 |