重写muduo库
muduo网络库
- 目的
- 知识储备
- 阻塞、非阻塞、同步、异步
- Unix/Linux上的五种IO模型
- 阻塞 blocking(同步)
- 非阻塞 non-blocking(同步)
- IO复用(IO multiplexing)(同步阻塞/非阻塞)
- 信号驱动(signal-driven)
- 异步(asynchronous)
目的
1、理解阻塞、非阻塞、同步、异步
2、理解Unix/Linux上的五种IO模型
3、epoll的原理以及优势
4、深刻理解Reactor模型
5、从开源C++网络库,学习优秀的代码设计工
6、掌握基于事件驱动和事件回调的epoll+线程池面向对象编程
7、通过深入理解muduo源码,加深对于相关项目的深刻理解
知识储备
《linux高性能服务器编程》
1、TCP协议和UDP协议
2、TCP编程和UDP编程步骤
3、IO复用接口编程select、poll、epoll编程
4、Linux的多线程编程pthread、进程和线程模型,c++20协程
阻塞、非阻塞、同步、异步
典型的一次IO的两个阶段是什么? 数据准备 和 数据读写
- 数据准备:根据系统IO操作的就绪状态
- 阻塞
- 非阻塞
- 数据读写:根据应用程序和内核的交互方式
- 同步
- 异步
陈硕大神原话:在处理 IO 的时候,阻塞和非阻塞都是同步 IO。只有使用了特殊的 API 才是异步IO。
一个典型的网络IO接口调用,分为两个阶段,分别是“数据就绪”和“数据读写”,数据就绪阶段分为阻塞和非阻塞,表现得结果就是,阻塞当前线程或是直接返回。
同步表示A向B请求调用一个网络IO接口时(或者调用某个业务逻辑API接口时),数据的读写都 是由请求方A自己来完成的(不管是阻塞还是非阻塞);异步表示A向B请求调用一个网络IO接口时(或者调用某个业务逻辑API接口时),向B传入请求的事件以及事件发生时通知的方式,A就 可以处理其它逻辑了,当B监听到事件处理完成后,会用事先约定好的通知方式,通知A处理结果。
Unix/Linux上的五种IO模型
阻塞 blocking(同步)
非阻塞 non-blocking(同步)
IO复用(IO multiplexing)(同步阻塞/非阻塞)
信号驱动(signal-driven)
异步(asynchronous)
struct aiocb {
int aio_fildes
off_t aio_offset
volatile void *aio_buf
size_t aio_nbytes
int aio_reqprio
struct sigevent aio_sigevent
int aio_lio_opcode
}
典型的异步非阻塞状态,Node.js采用的网络IO模型。