那么主从模式的核心思想就在于,主reactor上只监听acceptor上成功建立的连接事件,并将其分发给从reactor线程,从reactor线程只需要负责已连接套接字上的IO事件 。
文章插图
主从reactor模型 + worker threads.png
总结:我们通过主reactor线程来分发成功建立的套接字,通过从reactor线程来分发已连接套接字上的IO事件,通过工作线程来处理耗时操作! 更进一步---通过用户态自己建立的协程机制来调度业务处理程序,用户态自己管理协程间切换,避免了CPU切换线程,又能为程序带来更高的处理效率!
3. 五种网络IO简介
- 阻塞IO
- 非阻塞IO
- IO多路复用
- 异步IO
- 信号驱动IO
当应用程序调用阻塞IO完成某个操作时,应用程序会被挂起,感觉上应用程序像是被“阻塞”了一样 。实际上,内核所做的事情是将CPU时间切换给了其他有需要的进程,网络应用程序在这种情况下就会得不到CPU时间做该做的事情 。
非阻塞IO:
当应用程序调用非阻塞IO完成某个操作时,内核立即返回,不会把CPU时间让出给其他进程,应用程序在返回后可以得到足够的CPU时间做其他的事情 。
IO多路复用:
我们可以把标准输入、套接字都看作IO的一路,多路复用的意思,就是在任何一路IO有“事件”发生的情况下,通过应用程序去处理相应的IO事件,这样我们的程序就“好像”在同一时刻处理多个IO事件 。
异步IO:
当一个异步过程调用发出后,调用者不能立刻得到结果 。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者 。
信号驱动IO:
应用进程使用 sigaction 系统调用,内核立即返回,应用进程可以继续执行 。当数据报准备好读取时,内核就为该进程产生一个SIGIO信号,我们随后可以在信号处理函数中读取数据报,也可以立即通知主循环,让他读取数据 。
4.网络IO的本质网络IO的本质就是socket流的读取,通常一次IO读操作会涉及到两个对象和两个阶段 。
两个对象:
- 用户进程(线程)
- 内核对象
- 等待数据流准备
- 从内核向进程复制数据
- 第一步通常涉及等待网络上的数据分组到达,然后被复制到内核的某个缓冲区 。
- 第二步把数据从内核缓冲区复制到进程缓冲区 。
文章插图
阻塞IO.png
非阻塞IO的read请求在数据为准备的情况下立即返回,应用程序可以不断查询内核,直到数据准备好,内核将数据拷贝到应用程序缓冲区并完成这次read调用 。
文章插图
非阻塞IO.png
6. 如何区分同步和异步同步调用与 异步调用 是对于获取数据的过程而言的,前面的几种最后获取数据的read操作调用,都是同步的,即在read调用时,内核将数据从内核空间拷贝到应用程序空间,这个过程是在read函数中同步进行的 。
文章插图
同步调用.png
当我们发起异步读(aio_read)之后,就立即返回,内核自动将数据从内核空间拷贝到应用程序空间,这个拷贝过程是异步的,内核自动完成的,和前面的同步操作不一样,应用程序并不需要主动发起拷贝动作 。
文章插图
异步调用.png
【从网络IO看高性能框架】
推荐阅读
- 小小协议大大用处,网络通信桥梁,如何查看ARP协议并清除ARP表项
- 写给开发人员的Web无障碍标准
- 网络安全技术知识分享
- 路由器要不要开启IPv6?这次网络升级究竟有多大改变
- 茶梅盆景怎么造型好看,宜兴壶古典造型与现代造型
- 秘书|职场故事——谁说职场没有捷径?就看你愿不愿意走?诛心九问
- 生意参谋免费版如何查关键词 在生意参谋中可以通过搜索排行查看以下哪些关键词数据
- 四维彩超看性别
- 服装自制淘宝店好做吗 服装店好不好做
- 从诗书画到烟酒茶,常人天宜饮多少茶