IO多路复用,网络编程。
IO模型:
- 阻塞式IO模型;
- 非阻塞式IO模型,需要轮询内核,较少使用;
- IO复用模型,阻塞于select;
- 信号驱动式IO模型:内核通知用户进程何时可以启动一个IO操作;
- 异步IO模型:内核通知用户进程操作何时完成。
POSIX标准:可移植操作系统接口,IEEE为各种在unix操作系统上运行的软件制定的一系列API标准的总称。
同步IO模型:导致请求进程阻塞,直到IO操作完成,包含阻塞式IO,非阻塞式IO,IO复用,信号驱动式IO。
异步IO模型:不导致请求进程阻塞异步IO。
select:
- 该函数准许进程指示内核检测多个描述符,在有一个或多个描述符就绪、或经历一段指定的时间后通知进程;
- int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);
- readset,writeset,exceptset中存放感兴趣的描述符(采用位向量实现);
缺点总结:
- 每次调用select,都需要将fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大;
- 内核需要遍历select传递的fd集合,这个开销在fd很多时也很大;
- select支持的文件描述符数量有限,默认是1024。
poll(轮询):
- 实现功能和select类似,只是fd集合的实现方式不同,poll使用pollfd结构而不是select的fd_set结构;
- 效率较高(与select对比)。
epoll:
- select和poll的改进版本;
- 包含三个函数,epoll_create,epoll_ctl和epoll_wait;epoll_create创建一个epoll句柄,epoll_ctl注册要监听的事件,epoll_wait等待事件的产生;
- 解决了select的三个缺点;