1、应用程序将I/O请求提交到提交队列中,每个请求可以理解为提交队列中的一个节点(SQE)。
2、内核处理。
3、当I/O操作完成,内核将结果放到完成队列中,每个结果为完成队列中的一个节点(CQE)。
异步操作:
io_uring允许用户将I/O操作提交给内核,内核在后台异步处理这些操作。用户不需要等待操作完成,而是可以在稍后查询完成队列以获取操作结果。
举例:
应用程序要做的就是往请求队列中抛任务,从完成队列中取结果。
原理图:
问题描述:每个任务频繁添加到请求队列,这里会有频繁的拷贝过程?
用户空间和内核之间共享一块内存区域,用于传递提交的I/O请求和完成的I/O请求事件,使用了mmap映射内存来避免频繁拷贝,所以不需要拷贝。
对于io_uring的队列来说,多线程操作不需要加锁,io_uring使用了无锁环形队列,支持多个线程可以安全且高效的并发处理I/O请求。
io_uring提供了3个系统函数,io_uring_setup,io_uring_enter,io_uring_register。liburing对其封装了一层。liburing主要函数介绍:
io_uring_queue_init_params
初始化io_uring环境,包括初始化提交队列(SQ)和完成队列(CQ),内部会调用io_uring_setup
io_uring_prep_*系列函数
、、、 等,将I/O操作放到提交队列中
io_uring_submit
将提交队列中的操作提交给内核,触发内核执行操作,内部依赖io_uring_enter系统调用
io_uring_wait_cqe
阻塞等待至少一个操作完成,并返回完成的CQE,这一步是阻塞的
io_uring_peek_batch_cqe
批量获取完成队列中的操作结果, 返回值表示已经完成的操作数量
io_uring_cq_advance
这个函数通知io_uring,应用程序已经处理完这些事件,可以从完成队列中释放了
io_uring只是个异步I/O框架,可以处理网络通信(socket),也可以处理文件操作(读写文件)等 epoll专门用于处理网络通信(socket)
io_uring可以批量提交多个I/O操作,然后一次性等待他们的完成,大大的减少了系统调用的数量。
io_uring利用共享内存在用户空间和内核空间传递数据,减少了频繁的拷贝。
epoll使用时需要多次系统调用,例如:epoll_ctrl注册或修改文件描述符事件
epoll每次等待事件,都需要从用户空间切换到内核空间。
学习链接:https://github.com/0voice
到此这篇libmain.so是什么(somali是什么意思)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/rgzn-aibigd/65394.html