这篇文章主要介绍Memcached中,基于libevent构造的主线程和worker线程所处理连接的状态互相转换的过程(不涉数据的存取等操作),也就是drive_machine的主要业务逻辑了。状态转换过程没有涉及所有状态,同时,由于自己能力问题,一些状态转换还可能有错,还请各位前辈指正。转换条件限定:TCP,ASCII协议。(状态不包括conn_swallow,二进制协议才会用到此状态)
首先介绍连接,连接是Memcached自己定义的连接conn。的所有状态,drive_machine()主要就是对这些状态的转换进行操作:
1
2
3
4
5
6
7
8
9
10
11
12
13 |
enum
conn_states { conn_listening, /**< the socket which listens for connections /主线程等待链接*/ conn_new_cmd, /**< Prepare connection for next command /worker线程等待命令*/ conn_waiting, /**< waiting for a readable socket /worker线程等待sdf中有可读信息*/ conn_read, /**< reading in a command line /worker线程读命令*/ conn_parse_cmd, /**< try to parse a command from the input buffer /woker线程*/ conn_write, /**< writing out a simple response /worker线程*/ conn_nread, /**< reading in a fixed number of bytes /worker线程由于命令没读完,继续读取*/ conn_swallow, /**< swallowing unnecessary bytes w/o storing /worker线程,ASCII协议不涉及此状态*/ conn_closing, /**< closing this connection */ conn_mwrite, /**< writing out many items sequentially /worker线程,响应内容中写出*/ conn_max_state /**< Max state value (used for assertion) /用于标记conn_states边界,超出说明states有错*/ }; |
在Memcached.c的main()中,主线程以及worker线程完成必要初始化,绑定相应libevent事件,随后主线程监听绑定监听相应端口,正式做好循环的准备。下图是总体连接状态的总体转换图。
以上就是整个连接状态的转换情况了,分析不到位或者有误的地方还请大家指正。总体来说,感觉Memcached对libevent的应用写的十分标准,后续使用libevent时,也可以从Memcached中学习到很多知识。
Memcached源码分析——连接状态变化分析,布布扣,bubuko.com
原文:http://www.cnblogs.com/ilfmonday/p/memcached_conn.html