Golang网络库中socket阻塞调度源码剖析

Posted by 夏泽民
  1. TCP的连接对象: 连接对象: 在net.go中有一个名为Conn的接口,提供了对于连接的读写和其他操作:


gopark goready

Posted by 夏泽民

scheduler和channel里面都与gopark和goready这两个函数紧密相关,但是站在上层可以理解这两个函数的作用,但是出于对源码探索,我们要明白这两个函数不仅仅做了啥,还要知道怎么做的。本文主要内容是从底层源码分析这两个函数原理:



eagain accept

Posted by 夏泽民

在Linux环境下开发经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中)。



Socket 源码

Posted by 夏泽民

Kernel提供了一组内核态的socket API,基本上在用户态的sockt API在内核中都有对应的API。 在net/socket.c中可以看到如下导出符号:



SIGIO

Posted by 夏泽民

在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 信号将会产生。



Search

Popular posts

Anything in here will be replaced on browsers that support the canvas element

Recent posts

This blog is maintained by 夏泽民

Get in touch with me at 465474307@qq.com

Subscribe to our mailing list

* indicates required