自己公司的网站怎么编辑,常州网站建设公司报价,重庆杂酱制作,能在家做的兼职的网站基于异步IO的io_uring
1. io_uring的实现原理
io_uring使用了一种异步IO机制#xff0c;它通过一对环形缓冲区(ring buffer)实现用户态于内核态之间的高效通信#xff0c;用户只需将IO请求放入提交队列#xff0c;当内核完成IO请求时#xff0c;会将结果放入完成队列它通过一对环形缓冲区(ring buffer)实现用户态于内核态之间的高效通信用户只需将IO请求放入提交队列当内核完成IO请求时会将结果放入完成队列然后用户从完成队列中提取结果并进行后序处理。
io_uring中的两个队列是映射到用户态的共享内存区域用户态和内核态可以直接通过这个区域交换数据减少了系统调用上下文切换。用户也可以一次性提交多个IO请求减少了系统调用次数。
io_uring在内核中有专门的work线程来处理用户请求完成IO操作并且worker线程数量也是内核根据cpu核心数和负载情况自己调节的。
io_uring的优点
高并发通过异步IO机制一个线程能够同时进行大量的IO处理不会产生阻塞。高性能低延迟读写操作在内核态完成并且IO请求和IO结果都是通过共享内存来传递的减少了系统调用和上下文切换次数。
2. liburing的使用流程
2.1 多线程设计
每个线程一个io_uring– 不用考虑同步但是浪费资源一个io_uring线程加一个线程池处理任务 -- 需要考虑同步问题多个线程使用一个io_uring同样需要考虑同步问题
2.2 流程 创建 io_uring 实例 int ret io_uring_queue_init(32, ring, 0); // 初始化 io_uring 实例队列深度为 32填充IO请求 sqe io_uring_get_sqe(ring); // 获取一个提交队列入口io_uring_prep_write(sqe, fd, buf, strlen(buf), 0); // 写入文件
io_uring_prep_read(sqe, fd, buf, sizeof(buf), 0); // 异步读取文件提交IO请求 int submitted io_uring_submit(ring); // 提交请求到内核等待IO请求完成 int ret io_uring_wait_cqe(ring, cqe); // 等待完成队列中的一个请求完成
io_uring_cqe_seen(ring, cqe); // 告诉 io_uring 已经处理完该完成队列入口清理资源 io_uring_cqe_seen(ring, cqe); // 告诉 io_uring 已经处理完该完成队列入口3. proactor网络模型
proactor网络模型是一种异步IO事件驱动的模型它向内核提交IO请求然后等待内核完成IO操作后再提取结果。它与reactor一样都是高性能、高并发的网络模型与reactor的区别在于IO事件的处理是在内核态完成的用户直接获取IO操作的结果。
Proactor 模式的关键思想是将 I/O 操作的处理责任交给操作系统应用程序只负责发起请求和处理回调。
proactor的优点
高性能的异步IOIO操作在内核态完成内核完成后将结果通知用户因此能够减少系统调用和上下文切换提高性能。高并发和reactor一样都能够用一个线程同时处理大量连接的IO请求只不过reactor依靠的是IO多路复用机制而proactor依赖的异步IO。线程复用性和reactor一样proactor也可以减少线程的切换、创建、销毁的开销节约线程资源程序的局部性更好对缓存更友好。
4. proactor模式的使用场景
高性能、高并发、内核5.1以上
4.1 reactor对比proactor
IO事件处理上reactor在用户态处理IO操作用户需要注册事件、等待事件发生然后在用户态调用IO操作而proactor模式在内核处理IO操作用户只需提交异步IO请求然后等待和获取IO操作的结果内核态的worker线程会进行实际的IO操作。性能上由于proactor模式由内核来负责处理IO操作减少了系统调用和上下文切换次数性能较强。经过实测在echo回声应用上测试16、64、512、1024长度消息proactor的性能平均要比epoll高10%左右。