网络轮训器

[TOC]

问题及思考

IO 模型

操作系统的IO模型主要有:

同步:调用端会一直等待服务端响应,直到返回结果

异步:调用端发起调用之后不会立刻返回,不会等待服务端响应

阻塞:服务端返回结果之前,客户端线程会被挂起,此时线程不可被 CPU 调度,线程暂停运行

非阻塞:在服务端返回前,函数不会阻塞调用端线程,而会立刻返回

阻塞与非阻塞 I/O

阻塞非阻塞是描述调用者的,根据调用者是否阻塞自身运行,可以把 I/O 分为阻塞 I/O 和非阻塞 I/O。

同步 I/O 和异步 I/O

根据 I/O 响应的通知方式的不同,可以把 I/O 分为同步 I/O 和异步 I/O。同步IO和异步IO是描述被调用者的状态。

为什么这么分类

阻塞/非阻塞和同步/异步,其实就是两个不同角度的 I/O 划分方式。它们描述的对象也不同,

比如在 Linux I/O 调用中,

在网络套接字的接口中,

I/O 多路复

I/O 多路复用被用来处理同一个事件循环中的多个 I/O 事件。I/O 多路复用需要使用特定的系统调用支持,不同的操作系统也都实现了自己的 I/O 多路复用函数,例如:select, poll, epollkqueueevport 等。

select

poll

select/poll缺点

epoll

Go IO

Go 语言在网络轮询器中使用 I/O 多路复用模型处理 I/O 操作。Go 也根据不同的操作系统实现了不同的多路复用实现。

src/runtime/netpoll_epoll.go
src/runtime/netpoll_kqueue.go
src/runtime/netpoll_solaris.go
src/runtime/netpoll_windows.go
src/runtime/netpoll_aix.go
src/runtime/netpoll_fake.go

TODO