# LinuxSelect **Repository Path**: zhujilun_0/linux-select ## Basic Information - **Project Name**: LinuxSelect - **Description**: Linux Select C&S - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2021-10-26 - **Last Updated**: 2021-11-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: Socket, Linux ## README 当服务器需要处理多个客户端请求时 1.多线程 每个传上来的请求都是一个线程,但弊端是CPU要上下文切换,要处理句柄,此时上下文切换的代价很大 2.单线程 当服务器处理一个请求后,第二个请求到来时会被放进DMA,保障数据不丢失 用在实现层面就是轮询,服务器循环处理所有的请求,有数据就处理,没有就换下一个请求 3.select 先创建好socket 创建足够的文件描述符 select监听bitmap中fd为1的位 select将bitmap交给内核处理(拷贝),也就是方法2中判断有没有数据的部分,这样不用每一次都在用户态和内核态间切换,效率更高 如果一直没有数据来,那程序就一直阻塞在select 如果有数据来了,那内核将fd置位,select返回 然后我们看哪个fd被置位了,并将置位的fd中的数据读出来并处理 //其实就是法2里交给内核处理了,整体思路还是一样的 总而言之,当服务器监听到连接请求后,就调用accept函数接受它,分配一个逻辑单元为这个新连接服务(fork) 逻辑单元读取客户请求,处理请求,将处理结果返回给客户端 客户端接收到服务器反馈的结果后可以继续请求,也可以主动关闭,如果客户端主动关闭了,那么服务端被动关闭,双方通信结束 服务器在处理一个客户请求的同时还会继续监听其他客户请求 缺点: bitmap有上限 每次循环都要重新创建bitmap,这个map不可重用 bitmap从用户态切换到内核态(拷贝)仍有较大开销 select返回的map我还是不知道具体哪一个有数据,我还得O(n)遍历