scheduler和channel里面都与gopark和goready这两个函数紧密相关,但是站在上层可以理解这两个函数的作用,但是出于对源码探索,我们要明白这两个函数不仅仅做了啥,还要知道怎么做的。本文主要内容是从底层源码分析这两个函数原理:
在TCP 连接中, SIGIO 信号将会在这个时候产生: l 在一个监听某个端口的套接字上成功的建立了一个新连接。 l 一个断线的请求被成功的初始化。 l 一个断线的请求成功的结束。 l 套接字的某一个通道(发送通道或是接收通道)被关闭。 l 套接字接收到新数据。 l 套接字将数据发送出去。 l 发生了一个异步I/O 的错误。 举例来说,如果一个正在进行读写操作的TCP 套接字处于信号驱动I/O 状态下,那么 每当新数据到达本地的时候,将会产生一个SIGIO 信号,每当本地套接字发出的数据被远 程确认后,也会产生一个SIGIO 信号。对于我们的程序来讲,是无法区分这两个SIGIO 有 什么区别的。在这种情况下使用SIGIO,TCP 套接字应当被设置为无阻塞模式来阻止一个 阻塞的read 和write(recv 和send)操作。我们可以考虑在一个只进行监听网络连接操作 的套接字上使用异步I/O,这样当有一个新的连接的时候,SIGIO 信号将会产生。