Kqueue背景
Kqueue是unix系统上高效的IO多路复用技术,关于IO多路复用的原理网上有很多优秀的理解,这里不再赘述。
常见的io复用有select、poll、epoll、kqueue等。其中epoll为Linux系统独有,kqueue则在众多unix系统中存在,我们这里选择Kqueue进行切入主要是方便mac上IDE即时编译调试,其原理与epoll类似。
Kqueue参数概览
go语言中kqueue相关代码位于syscall库中
event_t
是Kevent()
操作的最基本的事件结构。
kqueue
是freebsd
内核中的一个事件队列kernel queue
。
Kevent()
是一个系统调用,也是kqueue
的用户界面,是对kqueue
进行添加,删除操作的用户态的界面。
接下来介绍event_t这个结构体成员和Kevent的参数
type Kevent_t struct {
Ident uint64 //该事件关联的描述符,常见的有socket fd,file fd, signal fd等
Filter int16 //事件的类型,比如读事件EVFILT_READ,写事件EVFILT_WRITE,信号事件EVFILT_SIGNAL
Flags uint16 //事件的行为,也就是对kqueue的操作,下面介绍几个常用的
//如EV_ADD:添加到kqueue中,EV_DELETE从kqueue中删除
//EV_ONESHOT:一次性或事件,kevent返回后从kqueue中删除
//EV_CLEAR:事件通知给用户后,事件的状态会重置,
Fflags uint32
Data int64
Udata *byte //用户指定的数据
}
func Kevent(kq int, //Kqueue返回的唯一参数值,标记着一个内核队列
changes, //需要对kqueue进行修改的事件集合,kqueue通过此参数完成对事件的修改
events []Kevent_t, //返回的已经就绪的事件列表
timeout *Timespec) //超时控制,不指定事件表示一直等待事件发生,否则只等待一段时间
(n int, err error)