近日在了解学习并发服务器基础时,了解到了io多路复用。
io多路复用是,单线程,进程同时监测若干文件描述符是否执行io操作的能力。
相较于前面了解的多线程,多进程并发服务器,节省更多资源。
资源消耗来自于,线程进程创建,cpu使用切换成本,多线程资源竞争。
因此新了解的io多路复用,让我们用更少资源解决更多问题。
linux系统提供多种io模型
阻塞io
非阻塞io
io多路复用
信号驱动io
异步io。
今天了解的是io多路复用的select函数
select的调用会阻塞到有文件描述符可以进行IO操作或被信号打断或者超时才会返回。
select将监听的文件描述符分为三组,每一组监听不同的需要进行的IO操作。readfds是需要进行读操作的文件描述符,writefds是需要进行写操作的文件描述符,exceptfds是需要进行异常事件处理的文件描述符。这三个参数可以用NULL来表示对应的事件不需要监听。
当select返回时,每组文件描述符会被select过滤,只留下可以进行对应IO操作的文件描述符。
FD_xx的函数是用来操作文件描述符组和文件描述符的关系。
FDFD_SET添加一个文件描述符到组中,FD_CLR对应将一个文件描述符移出组中_ZERO用来清空文件描述符组。每次调用select前都需要清空一次。
FD_ISSET检测一个文件描述符是否在组中,我们用这个来检测一次select调用之后有哪些文件描述符可以进行IO操作
select可同时监听的文件描述符数量是通过FS_SETSIZE来限制的,在Linux系统中,该值为1024,当然我们可以增大这个值,但随着监听的文件描述符数量增加,select的效率会降低,我们会在不同IO多路复用方案优缺点一节中展开。
记于8.11日
华清远见培训