
select系统调用是检测一个已打开的文件描述符的集合(这个集合是一个fd_set类型的数据结构),服务器程序需要创建这个集合,创建时需要用listen调用让套接字处于监听状态,只有这样当有一个新的连接发生时,描述符才会有活动发生,才能够被检测到。
linux下,抛开性能上的影响,程序监听套接字的数量限制主要几个方面:1: *** 作系统方面限制是句柄数量的限制,也就是65535个可用句柄去掉预先保留的,大概在5万个左右,注意文件句柄和套接字句柄是共用的,都在这65535个里面。
2:进程方面的限制,linux系统对单个进程的默认打开句柄数量限制是1024,考虑到文件 *** 作也会占用句柄,可用于socket监听的句柄大概1000个,这个限制可以修改,不同linux版本可能有点不一样,centos是通过命令 ulimit -n 的方式去修改,要改成10240,就是
3:IO模型的限制,select模型的限制是1024,个,epoll是无限制的,完全根据上面2个的最大值。
楼主是不是没有学过 *** 作系统原理。 设计 *** 作系统的人可没这么傻。recv这个API是 *** 作系统实现的。当recv调用时,这个线程会进入 *** 作系统的阻塞队列。就是此时 *** 作系统不再处理这个线程,再是转去运行其它线程。而当接收消息到来时, *** 作系统再把这个线程从阻塞队列移到Ready队列,继续运行。 所以根本不浪费CPU时间。
while(1){
recv()//此时该线程阻塞,只有等到数据来了的时候继续运行。
处理数据
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)