찾다
운영 및 유지보수리눅스 운영 및 유지 관리Linux에서 select를 사용하는 이유는 무엇입니까?

선택 기능을 사용하면 개발자가 동시에 여러 파일 버퍼를 기다릴 수 있으므로 IO 대기 시간이 줄어들고 프로세스의 IO 효율성이 향상됩니다. select() 함수는 프로그램이 여러 파일 설명자를 모니터링하고 하나 이상의 모니터링된 파일 설명자가 소위 "준비" 상태가 될 때까지 기다릴 수 있도록 하는 IO 다중화 기능입니다. 설명자는 더 이상 차단되지 않으며 읽기, 쓰기 가능 및 예외를 포함한 특정 유형의 IO 작업에 사용될 수 있습니다.

#include헤더 파일에는 컴퓨터에서 호출할 수 있는 select 함수가 포함되어 있습니다. 이 함수는 파일 설명자 변경(읽기, 쓰기 또는 예외)을 모니터링하는 데 사용됩니다.

1. 선택 기능 소개

선택 기능은 IO 다중화 기능으로, 파일 설명자에서 이벤트가 준비될 때까지 기다리는 것입니다. 시간 영역, IO 대기 시간을 줄이고 프로세스의 IO 효율성을 향상시킵니다.

select() 함수를 사용하면 프로그램이 여러 파일 설명자를 모니터링하고 모니터링되는 파일 설명자 중 하나 이상이 "준비"될 때까지 기다릴 수 있습니다. 소위 "준비" 상태는 파일 설명자가 더 이상 차단 상태가 아니며 읽기, 쓰기 가능 및 예외 발생을 포함한 특정 유형의 IO 작업에 사용될 수 있음을 의미합니다

2.

       int select(int nfds, fd_set *readfds, fd_set *writefds,
                  fd_set *exceptfds, struct timeval *timeout);

ndfs

+1을 기다리는 파일 설명자의 최대 값입니다. 예를 들어 애플리케이션 프로세스가 파일 설명자 3, 5, 8의 이벤트를 기다리려는 경우

nfds=max(3,5,8)+1;

fd_set 유형

readfds writefds, Exceptfds 유형은 모두 fd_set인데 fd_set 유형은 무엇인가요?

  • fd_set 유형은 기본적으로 비트맵입니다. 비트맵의 위치는 해당 파일 설명자를 나타내며, 내용은 파일 설명자가 유효한지 여부를 나타내며, 1은 해당 위치의 파일 설명자가 유효함을 나타냅니다. 해당 위치를 나타냅니다. 파일 설명자가 잘못되었습니다.

  • 비트맵에 파일 설명자 2와 3이 설정되어 있으면 비트맵은 1100을 나타냅니다.

  • fd_set의 상한은 1024개의 파일 설명자입니다.

readfds

  • readfds는 읽기 이벤트를 기다리는 파일 설명자 모음입니다. (버퍼에 데이터가 있음) NULL 값을 전달할 수 있습니다.

  • 애플리케이션 프로세스와 커널 모두 readfds를 설정할 수 있습니다. 애플리케이션 프로세스는 readfds에 있는 파일 설명자의 읽기 이벤트를 기다리도록 커널에 알리도록 readfds를 설정합니다. 이벤트가 적용됩니다

writefdsLinux에서 select를 사용하는 이유는 무엇입니까?

readfds와 유사하게 writefds는 쓰기 이벤트를 기다리는 컬렉션입니다(버퍼에 공간이 있는지 여부에 관계 없음). NULL 값을 전달할 수 있습니다.

excessfds

커널이 해당 파일 설명자가 예외를 수신할 때까지 기다리는 경우, 실패한 파일 설명자를 Exceptfds

로 설정하세요. 오류 이벤트에 관심이 없다면 NULL 값을 전달할 수 있습니다. .

timeout

커널에서 시간 선택 블록을 설정합니다. 비차단으로 설정하려면 NULL로 설정하세요. 5초 동안 차단하도록 선택하려면

struct timeval time={5,0};

을 생성합니다. 여기서 struct timeval의 구조 유형은

           struct timeval {
               long    tv_sec;         /* seconds */
               long    tv_usec;        /* microseconds */
           };
반환 값

입니다. 파일 설명이 없습니다. 기호가 준비되면 0을 반환합니다.

  • 호출이 실패하면 -1을 반환합니다.

  • 시간 초과 시 readfds에서 이벤트가 발생하면 남은 시간 초과 시간을 반환합니다.

  • 3.select의 작업 흐름

응용 프로그램 프로세스kernel

모두 readfds 및 writefds에서 정보를 얻어야 합니다. 그중 커널은 readfds 및 writefds에서 어떤 파일 설명자가 기다려야 하는지 알아야 합니다. , 그리고 애플리케이션 프로세스는 readfds 및 writefds에서 어떤 파일 디스크립터 이벤트가 준비되어 있는지 알아야 합니다.

파일 디스크립터를 지속적으로 폴링하고 기다리려면 애플리케이션 프로세스가 readfds 및 writefds를 지속적으로 재설정해야 합니다. 호출되면 커널은 readfds 및 writefds를 수정하므로 프로그램이 기다려야 하는 파일 설명자를 저장하려면

application

에서 배열 Linux에서 select를 사용하는 이유는 무엇입니까?을 설정해야 합니다.

select가 호출될 때 해당 값이 readfds 및 writefds는 다음과 같습니다:

4.Select服务器

如果是一个select服务器进程,则服务器进程会不断的接收有新链接,每个链接对应一个文件描述符,如果想要我们的服务器能够同时等待多个链接的数据的到来,我们监听套接字listen_sock读取新链接的时候,我们需要将新链接的文件描述符保存到read_arrys数组中,下次轮询检测的就会将新链接的文件描述符设置进readfds中,如果有链接关闭,则将相对应的文件描述符从read_arrys数组中拿走。

一张图看懂select服务器:

Linux에서 select를 사용하는 이유는 무엇입니까?

简易版的select服务器:

server.hpp文件:

#pragma once                                                                                                           
  #include<iostream>    
  #include<sys/socket.h>    
  #include<sys/types.h>    
  #include<netinet/in.h>    
  #include<string.h>    
  using std::cout;    
  using std::endl;    
  #define BACKLOG 5    
      
  namespace sjp{    
    class server{    
      public:    
      static int Socket(){    
        int sock=socket(AF_INET,SOCK_STREAM,0);    
        if(sock>0)    
        return sock;    
        if(sock<0)    
          exit(-1);    
W>    }    
      
      static bool Bind(int sockfd,short int port){    
        struct sockaddr_in lock;    
        memset(&lock,&#39;\0&#39;,sizeof(lock));    
        lock.sin_family=AF_INET;    
        lock.sin_port=htons(port);    
        lock.sin_addr.s_addr=INADDR_ANY;    
        if(bind(sockfd,(struct sockaddr*)&lock,(socklen_t)sizeof(lock))<0){    
                  exit(-2);    
        }    
        return true;    
      }    

     static bool Listen(int sockfd){
        if(listen(sockfd,BACKLOG)<0){
          exit(-3);
        }
        return true;
      }
    };
  }

select_server.hpp文件

#pragma once                                                                                                           
  #include<vector>
  #include"server.hpp"
  #include<unistd.h>
  #include<time.h>
  
  namespace Select{
    class select_server{
      private:
        int listen_sock;//监听套接字    
        int port;    
          
      public:    
        select_server(int _port):port(_port){}    
      
        //初始化select_server服务器    
        void InitServer(){    
          listen_sock=sjp::server::Socket();    
          sjp::server::Bind(listen_sock,port);    
          sjp::server::Listen(listen_sock);    
        }    
      
      
        void Run(){    
          std::vector<int> readfds_arry(1024,-1);//readfds_arry保存读事件的文件描述符    
          readfds_arry[0]=listen_sock;//将监听套接字保存进readfds_arry数组中    
          fd_set readfds;    
          while(1){    
          FD_ZERO(&readfds);    
          int nfds=0;    
          //将read_arry数组中的文件描述符设置进程readfds_arry位图中    
          for(int i=0;i<1024;i++)    
          {    
            if(readfds_arry[i]!=-1){    
            FD_SET(readfds_arry[i],&readfds);    
           if(nfds<readfds_arry[i]){
              nfds=readfds_arry[i];
            }
            }
          }
  
          //调用select对readfds中的文件描述符进行等待数据
          switch(select(nfds+1,&readfds,NULL,NULL,NULL)){
            case 0:
              //没有一个文件描述符的读事件就绪
              cout<<"select timeout"<<endl;
              break;
            case -1:
              //select失败
              cout<<"select error"<<endl;
            default:
              {
              //有读事件发生
                Soluation(readfds_arry,readfds);
                break;
              }
          }           
          }
        }
                                                                                                                         
        void Soluation(std::vector<int>& readfds_arry,fd_set readfds){
W>        for(int i=0;i<readfds_arry.size();i++){
            if(FD_ISSET(readfds_arry[i],&readfds))
            {
              if(readfds_arry[i]==listen_sock){
                //有新链接到来
                struct sockaddr peer;
                socklen_t len;                                                                                           
                int newfd=accept(listen_sock,&peer,&len);
                cout<<newfd<<endl;
                //将新链接设置进readfds_arry数组中
                AddfdsArry(readfds_arry,newfd);
              }
              else{
                //其他事件就绪
                char str[1024];
                int sz=recv(readfds_arry[i],&str,sizeof(str),MSG_DONTWAIT);
                switch(sz){
                  case -1:
                    //读取失败
                    cout<<readfds_arry[i]<<": recv error"<<endl;
                    break;
                  case 0:
                    //对端关闭
                    readfds_arry[i]=-1;
                    cout<<"peer close"<<endl;
                    break;
                  default:
                    str[sz]=&#39;\0&#39;;
                    cout<<str<<endl;
                    break;
                }
              }
            }
          }
        }

        void AddfdsArry(std::vector<int>& fds_arry,int fd){
W>        for(int i=0;i<fds_arry.size();i++){
            if(fds_arry[i]==-1){
              fds_arry[i]=fd;
              break;
            }
          }
        }
    };
  }

select_server.cc文件

#include"select_server.hpp"    
    
int main(int argv,char* argc[]){    
  if(argv!=2){    
    cout<<"./selectserver port"<<endl;    
    exit(-4);    
  }    
                                                                                                                         
  int port=atoi(argc[1]);//端口号
  Select::select_server* sl=new Select::select_server(port);    
  sl->InitServer();                                             
  sl->Run();                                                                                                   
}

测试:

Linux에서 select를 사용하는 이유는 무엇입니까?

Linux에서 select를 사용하는 이유는 무엇입니까?

5.Select的缺陷

  • 由于fd_set的上限是1024,所以select能等待的读事件的文件描述符和写事件的文件描述是有上限的,如果作为一个大型服务器,能够同时链接的客户端是远远不够的。

  • 每次应用进程调用一次select之前,都需要重新设定writefds和readfds,如果进行轮询调用select,这对影响cpu效率。

  • 内核每一次等待文件描述符 都会重新扫描所有readfds或者writefds中的所有文件描述符,如果有较多的文件描述符,则会影响效率。

위 내용은 Linux에서 select를 사용하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 亿速云에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
리눅스 운영 마스터 링 : 실용 가이드리눅스 운영 마스터 링 : 실용 가이드Apr 12, 2025 am 12:10 AM

Linux 운영을 마스터하는 이유는 광범위한 응용 프로그램 시나리오와 강력한 기능 때문입니다. 1) Linux는 개발자, 시스템 관리자 및 기술 애호가에게 적합하며 서버 관리, 임베디드 시스템 및 컨테이너화 기술에 사용됩니다. 2) Learning Linux는 파일 시스템 구조, 쉘 사용, 사용자 권한 관리 및 프로세스 관리로 시작할 수 있습니다. 3) Linux 명령 줄은 핵심 도구로 LS, MKDIR, CD 등과 같은 쉘을 통해 명령을 실행하고 리디렉션 및 파이프 라인 작업을 지원합니다. 4) 고급 사용법에는 TAR 명령 및 조건부 판단을 사용한 백업 스크립트와 같은 자동 스크립트 작성이 포함됩니다. 5) 일반적인 오류에는 Echo, Set-X 및 $?를 통해 디버깅 할 수있는 권한, 경로 및 구문 문제가 포함됩니다. 6) 성능 최적화 제안

Linux의 5 기둥 : 역할 이해Linux의 5 기둥 : 역할 이해Apr 11, 2025 am 12:07 AM

Linux 시스템의 5 개의 기둥은 다음과 같습니다. 1. Kernel, 2. System Library, 3. Shell, 4. 파일 시스템, 5. 시스템 도구. 커널은 하드웨어 리소스를 관리하고 기본 서비스를 제공합니다. 시스템 라이브러리는 애플리케이션에 대한 사전 컴파일 된 기능을 제공합니다. 쉘은 사용자가 시스템과 상호 작용할 수있는 인터페이스입니다. 파일 시스템은 데이터를 구성하고 저장합니다. 시스템 도구는 시스템 관리 및 유지 보수에 사용됩니다.

리눅스 유지 보수 모드 : 도구 및 기술리눅스 유지 보수 모드 : 도구 및 기술Apr 10, 2025 am 09:42 AM

Linux 시스템에서 시작시 특정 키를 누르거나 "sudosystemctlrescue"와 같은 명령을 사용하여 유지 보수 모드를 입력 할 수 있습니다. 유지 보수 모드는 관리자가 파일 시스템 수리, 비밀번호 재설정, 보안 취약성 패치 등과 같은 간섭없이 시스템 유지 관리 및 문제 해결을 수행 할 수 있습니다.

주요 Linux 운영 : 초보자 가이드주요 Linux 운영 : 초보자 가이드Apr 09, 2025 pm 04:09 PM

Linux 초보자는 파일 관리, 사용자 관리 및 네트워크 구성과 같은 기본 작업을 마스터해야합니다. 1) 파일 관리 : mkdir, touch, ls, rm, mv 및 cp 명령을 사용하십시오. 2) 사용자 관리 : userAdd, passwd, userdel 및 usermod 명령을 사용합니다. 3) 네트워크 구성 : ifconfig, echo 및 ufw 명령을 사용하십시오. 이러한 운영은 Linux 시스템 관리의 기초이며, 마스터하면 시스템을 효과적으로 관리 할 수 ​​있습니다.

Sudo를 사용하여 Linux의 사용자에게 높은 권한을 부여하는 방법은 무엇입니까?Sudo를 사용하여 Linux의 사용자에게 높은 권한을 부여하는 방법은 무엇입니까?Mar 17, 2025 pm 05:32 PM

이 기사는 Linux의 Sudo 권한을 관리하는 방법, 보안 및 보안 모범 사례를 포함하여 Linux의 Sudo 권한을 관리하는 방법을 설명합니다. 주요 초점은 /etc /sudoers를 안전하게 편집하고 액세스를 제한하는 데 중점을 둡니다. 문자 수 : 159

Linux에서 SSH에 대해 2 단계 인증 (2FA)을 구현하려면 어떻게합니까?Linux에서 SSH에 대해 2 단계 인증 (2FA)을 구현하려면 어떻게합니까?Mar 17, 2025 pm 05:31 PM

이 기사는 Google Authenticator를 사용하여 Linux에서 SSH에 대한 2 단계 인증 (2FA) 설정, 설치, 구성 및 문제 해결 단계에 대한 가이드를 제공합니다. Enhanced SEC와 같은 2FA의 보안 이점을 강조합니다.

Top, HTOP 및 VMSTAT와 같은 도구를 사용하여 Linux에서 시스템 성능을 모니터링하려면 어떻게해야합니까?Top, HTOP 및 VMSTAT와 같은 도구를 사용하여 Linux에서 시스템 성능을 모니터링하려면 어떻게해야합니까?Mar 17, 2025 pm 05:28 PM

이 기사는 Linux 시스템 성능을 모니터링하기위한 Top, HTOP 및 VMSTAT 사용에 대해 설명하고 효과적인 시스템 관리를위한 고유 한 기능 및 사용자 정의 옵션을 자세히 설명합니다.

패키지 관리자 (APT, YUM, DNF)를 사용하여 Linux에서 소프트웨어 패키지를 어떻게 관리합니까?패키지 관리자 (APT, YUM, DNF)를 사용하여 Linux에서 소프트웨어 패키지를 어떻게 관리합니까?Mar 17, 2025 pm 05:26 PM

기사는 APT, YUM 및 DNF를 사용하여 Linux의 소프트웨어 패키지 관리, 설치, 업데이트 및 제거를 다루는 것에 대해 설명합니다. 다양한 분포에 대한 기능과 적합성을 비교합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경