libevent是一个事件通知库,需要编译成动态库或静态库,不能单独启动,封装了reactor;reactor中的io,事件以及他们之间的关系是怎样的呢?
reactor中的io分为io检测,io操作;reactor的主体思想是将网络io的处理转化为对事件的处理,事件分为读事件和写事件;io是同步,事件是异步的;事件先要注册,然后有事件循环去检测事件是否就绪,如果就绪才会处理事件;
libevent使用层次
1)在事件中是否需要自己处理io,基于libevent对事件的处理;
2)libevent内部处理io,只需要负责业务逻辑的处理;
3)事件处理流程需要熟悉;
封装层次
面向用户使用框架,提供相关接口;
libevent解决了哪些痛点
1)高效的网络缓冲区,通过readv和writev函数可一次读写多个数组;
2)io函数使用与网络原理;
3)多线程,buffer加锁时,读要读取一个完整的包,写要写完整的数据包,通过readv和writev函数可一次读写多个数组;
write(fd, buff, 1024);系统调用流程:用户态调用write,write是标准库函数,write是软中断,会调用system_call,system_call会记录系统调用号存入exa寄存器中,会调用int 0x80中断,int 0x80中断会引起cpu上下文环境保存到内核中的task_struct结构中,为什么write会需要上下文切换呢?因为write实际做的工作不是在用户态完成的,而是在内核态完成的,所以要通过int 0x80中断切换到内核态,内核会把要运行的上下文加载到cpu的寄存器上,接下来调用就进入了内核内部,内核内部会调用sys_write函数,sys_write是根据系统调用号找到向量表,从向量表中查找sys_write函数,就开始执行该函数,执行sys_write函数时分阻塞io和非阻塞io,阻塞io可能还会引起线程切换;非阻塞io不会引起线程切换,把数据发送出去后,会调用中断由内核态切换到用户态;