lJ
2024-12-27
来自江苏
1. 老师能讲一讲io_uring吗,有哪些知名的应用,大厂的态度,Golang的支持情况等 2. epoll ET模式存在数据丢失的风险,如果接收缓冲区足够大的情况下,还存在丢失吗,后续新的数据到达重新触发通知,应用程序应该可以读取到之前未读完的数据吧 3. golang net是如何解决数据丢失的风险的,在使用epoll ET编程时有哪些开发规范或最佳实践应对这个问题 4. 思考题 golang net设计了 BIO模式的 API,为每个连接都分配一个 goroutine。 这在高并发下,会产生大量的 goroutine,需要频繁的上下文切换,增大Goroutine 调度器的开销。 a. evio,使用事件驱动模型,采用单线程或多线程事件循环,比协程并发模型更轻量。 b. netpoll,使用gopool池、高效的内存复用、支持检查连接是否存活,可以及时清理池中失效的连接,降低资源占用。 c. gnet,也是使用ants池,高效、可重用而且自动伸缩的内存 buffer。 以上三个库没有看过源码,简单看了官方文档。个人觉得,evio与netpoll,gnet的不同之处是抛开了协程并发模型,完全基于epoll事件循环模型。而后两者还是采用协程模型,主要使用了协程池,内存池优化达到资源复用,减轻了调度器和GC开销。
展开
CodeFish-Xiao
2024-12-27
来自广东
感觉这篇的质量跟之前比下降了,Golang运行时的网络实现和Linux本身的IO复用优化,但是实际上我们用Golang进行网络编程该进行哪些优化没有讲到