• Linux内核将所有外设看作文件,文件的读写操作会返回一个文件描述符fd(file descriptor)
  • socket的响应描述符为socketfd
  • 描述符就是一个数字指向内核中的一个结构体(文件区域、路径属性等)
阻塞IO模型 非阻塞IO模型 IO复用模型 信号驱动IO模型 异步IO
所有文件操作阻塞执行,执行完一个在执行下一个 多个文件操作可以一起处理,各自应用进程轮询对应的内核数据 通过Linux提供的select/poll处理,进程将多个fd传给select或者poll系统调用,阻塞在select,这样select/poll就可以检测是否有fd处于就绪状态。 当数据准备就绪时,为该进程生成一个SIGIO信号,通知进程来读取数据。
以socket接口为例:进程空间调用recvFrom,其系统调用知道数据包到达且被写到应用进程缓冲区或者发生错误时返回,在此期间一直在等待。进程从开始调用recvFrom开始一直被占用所以叫阻塞模型。 recvFrom从应用到内核,如果缓冲区没有数据的话,就会返回一个EWOULDBLOCK错误,一般都对非阻塞IO模型进行轮询检查内核是不是有数据到来。 顺序扫描,支持的fd有限;还提供epoll系统调用,基于事件驱动方式代替顺序扫描,性能更好