协程是一种程序组件(如下称为微线程),一般咱们把协程理解为本身实现调度,用于提升程序运行效率,下降开发复杂度的微线程。协程在用户态实现代码段的调度,不须要像线程同样切换到内核态进行调度,下降了对系统调度的依赖,减小了大量的中断和换页操做,从而下降了开发复杂度。开发者能够用同步的方式去进行代码开发,不须要考虑多线程模型的线程调度和诸多临界资源竞争问题。
协程在处理异步等待事件时有很大的优点,如IO的读写操做每每比较耗时,CPU在遇到IO操做时须要切换线程,等待IO事件准备好以后再继续执行IO操做,如socket的链接,数据的收发,及文件的读写等都是比较频繁却比较耗时的操做,使用协程能够直接再用户态切换微线程,大大下降了微线程直接的调度过程,提升了代码的运行效率。linux
微线程上下文信息结构体,用于建立微线程执行代码段。多线程
RUNQ:队列中存储的是能够被调度运行的微线程,每次调度_st_vp_schedule即从该队列取出一个st_thread去运行。
IOQ:存储处于IO等待状态的threads,当上层调用st_poll时,将该thread放入IOQ中;当底层epoll有IO事件到达时,将该thread从IOQ中移除,并放入RUNQ中。
ZOMBIEQ:当st_thread退出时,放入ZOMBIEQ队列中
SLEEPQ:当st_poll传入大于0的超时参数或者调用st_usleep和st_cond_timewait时,将thread加入到SLEEPQ中。异步
用于监听各类IO事件,会根据系统能力不一样而进行切换(kqueue、epoll、poll、select)socket
用于记录各类超时和st_sleep函数
微线程调度切换函数,每次调用都会完成一次微线程切换。线程
int st_set_eventsys(int eventsys)
设置协程事件通知机制,linux下用epoll,BSD使用kqueue。指针
事件通知机制类型,取值以下:
ST_EVENTSYS_DEFAULT(0) :使用库默认事件通知机制
ST_EVENTSYS_SELECT(1) :使用select事件通知机制
ST_EVENTSYS_POLL(2) :使用poll事件通知机制
ST_EVENTSYS_ALT(3) :使用alternate备用的事件通知机制code
成功返回0,失败返回-1协程
int st_get_eventsys(void)
获取协程事件通知机制,linux下用epoll,BSD使用kqueue。接口
事件通知机制类型,取值以下:
ST_EVENTSYS_DEFAULT(0) :使用库默认事件通知机制
ST_EVENTSYS_SELECT(1) :使用select事件通知机制
ST_EVENTSYS_POLL(2) :使用poll事件通知机制
ST_EVENTSYS_ALT(3) :使用alternate备用的事件通知机制
const char *st_get_eventsys_name(void)
获取协程事件通知机制的函数名称
返回协程事件通知机制的函数名称,如epoll、kqueue、select、poll等
int st_init(void)
初始化协程库全局变量、队列、事件通知机制,并建立一个空闲协程
成功返回0,失败返回-1
_st_netfd_t *_st_netfd_new(int osfd, int nonblock, int is_socket)
根据文件描述符建立一个协程描述符结构体
文件描述符句柄
是否阻塞,1为阻塞,0为非阻塞
是不是socket,1为socket,0为非socket
成功返回0,失败返回-1
int st_netfd_poll(_st_netfd_t *fd, int how, st_utime_t timeout)
让协程等待IO事件的到来,协程将中止执行,直到IO事件到来在继续执行。
协程文件描述符指针
等待事件类型,取值以下:
POLLIN:等待数据写入事件
POLLOUT:等待数据写出事件
等待超时时间,单位为微妙
成功返回0,失败返回-1
_st_netfd_t *st_accept(_st_netfd_t *fd, struct sockaddr *addr, int *addrlen, st_utime_t timeout)
非阻塞式接收链接
协程文件描述符指针
对方socket地址,可为NULL
对方socket地址长度指针,可为NULL
等待超时时间,单位为微妙
成功返回0,失败返回-1
int st_connect(_st_netfd_t *fd, const struct sockaddr *addr, int addrlen, st_utime_t timeout)
非阻塞式接链接socket
协程文件描述符指针
对方socket地址
对方socket地址长度指针
等待超时时间,单位为微妙
成功返回0,失败返回-1
ssize_t st_read(_st_netfd_t *fd, void *buf, size_t nbyte, st_utime_t timeout)
非阻塞式读取socket数据
协程文件描述符指针
接收数据buffer指针
接收buffer大小
等待超时时间,单位为微妙
成功返回0,失败返回-1
ssize_t st_write(_st_netfd_t *fd, const void *buf, size_t nbyte, st_utime_t timeout)
非阻塞式读取socket数据
协程文件描述符指针
发送数据buffer指针
发送buffer大小
等待超时时间,单位为微妙
成功返回0,失败返回-1
void srs_close_stfd(st_netfd_t& stfd)
关闭协程文件描述符
协程文件描述符
无