最近在研究 Linux 内核的时间子系统,为下一篇长文《服务器程序中的日期与时间》做准备,无意中注意到了 Linux 新增的几个系统调用的对编写服务器代码的影响,先大致记录在这里。这篇博客也可算作前一篇《多线程服务器的常用编程模型》的一个注脚。
1. 服务器程序的风格可能在变
新的创建文件描述符的 syscall 一般都支持额外的 flags 参数,可以直接指定 O_NONBLOCK 和 FD_CLOEXEC,例如:
- accept4 – 2.6.28
- eventfd2 – 2.6.27
- inotify_init1 – 2.6.27
- pipe2 – 2.6.27
- signalfd4 – 2.6.27
- timerfd_create 2.6.25
以上 6 个 syscalls,除了最后一个是新功能,其余的都是增强原有的调用,把数字尾号去掉就是原来的 syscall。
O_NONBLOCK 的功能是开启“非阻塞IO”,而文件描述符默认是阻塞的。
这些创建文件描述符的系统调用能直接设定 O_NONBLOCK 选项,或许能反映当前 Linux (服务端)开发的风向,那就是我在前一篇博客《多线程服务器的常用编程模型》里推荐的 one loop per thread + (non-blocking IO with IO multiplexing)。从这些内核改动来看,non-blocking IO 已经主流到让内核增加