前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android面试题 之 网络通信基础面试题

Android面试题 之 网络通信基础面试题

作者头像
AntDream
发布2024-06-24 20:13:50
660
发布2024-06-24 20:13:50
举报

本文是自己学习的总结,应对面试足够,建议收藏保存

序列化
判断标准
  • 序列化后的码流大小
  • 性能
  • 跨语言
Serializable方式
  • 码流偏大
  • 性能较低
XML方式
  • 人机可读性好
  • 文件格式复杂、占带宽
JSON
  • 轻量级、兼容性好、格式简单,人机可读性较好
  • 可读性没有XML好,额外空间消耗比较大
ProtoBuff
如何让单机的应用程序支持几十万至百万级别的长连接?
  • 首先要突破系统对应用进程的线程数限制:ulimit -n 1000000
  • 还要突破软限制和硬限制:cat /etc/security/limits.conf;改完以后还要该so,让系统重新加载这个文件
  • 操作系统的限制,所有进程的文件连接数的限制
  • socket通信时,每个socket都有2个缓冲区,一般是4K*2,连接数过大,内存就会很高,就需要把这个缓冲区调小一点:SO_SNDBUF;SO_RCVBUF
select、poll、epoll的区别?
  • 都是操作系统实现的IO多路复用的机制
  • select是操作系统都支持的,poll和epoll主要是在类UNiX的操作系统中支持
  • 支持一个进程所能打开的连接数限制不一样:selector是1024个(64位上面可以变成2048);poll和select没有太大区别,不过连接上select是用数组来维护,poll是链表维护,最大连接数上poll是没限制的;epoll没有什么限制,只受限于机器内存的大小
  • 连接数激增时的效率不同:当连接数上升到几十万百万的时候,select和poll性能会急剧下降,而epoll跟总连接数没有关系,只能活跃的连接有关,性能基本不变
  • 消息的传递方式:select和poll在每次消息调用中都需要将很多数据从用户空间拷贝到内核空间;epoll不需要(共享一块内存)
  • 怎么选择?:连接数比较少又比较活跃的时候,select和poll可能性能更好
  • select、poll只支持水平触发,epoll默认是水平触发,也支持边缘触发
水平触发(LT)和边缘触发(ET)?

水平触发:socket的接收缓冲区里有数据来了,只要缓冲里有数据,select、poll或者epoll就都会一直收到通知

边缘触发:只有在有新数据到达socket的缓冲区时才会触发

直接内存比堆内存快在哪里?

直接内存避免了二次拷贝,如果buffer在堆上,就需要先从堆拷贝到应用进程缓冲区,再从应用进程缓冲区拷贝到内核套接字缓冲区,再发送到网络,直接内存少了从堆拷贝到应用进程的这一步。

数据从应用进程缓冲区拷贝到套接字发送缓冲区时,内存是不允许发生变化的,不能失效的

什么是零拷贝

指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。

DMA:direct memory access,用于接收CPU的指令负责去IO拷贝。会把文件数据拷贝到内核缓冲区,再拷贝到用户空间

零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除传输数据在存储器之间不必要的中间拷贝次数,从而提高数据传输效率

传统数据传送过程

磁盘 -->DMA拷贝到内核文件读取缓冲区 -->CPU拷贝到应用进程缓冲区 --> CPU拷贝到套接字发送缓冲区(应用进程到内核进程) --> DMA拷贝到网络设备(网卡)

4次拷贝,4次上下文切换

内存映射:MMAP

把文件映射到应用进程的某段内存区域里面,减少CPU拷贝到应用进程的步骤

Linux之sendfile

DMA将文件拷贝到文件读取缓冲区后,直接进行CPU拷贝到套接字发送缓冲区,都在内核空间中,省去了从应用进程周转的拷贝

3(2)次拷贝2次上下文切换

Linux之slice

在上面的基础上,文件缓冲区和套接字缓冲区之间用了管道机制PIPE,管道实际上就是共用了一段内存

2次拷贝,2次上下文切换

Java JDK里面的零拷贝主要是MMAP和sendfile,sendfile比如FileChannel的transferFrom

END

点亮【赞和在看】,让钱和爱都流向你。

作者介绍

中年程序猿,十年移动端开发老司机,分享一线开发经验和知识,正在探索通过副业渡过中年危机

越努力越幸运,加油💪,一起遇见更好的自己

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AntDream 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 序列化
    • 判断标准
      • Serializable方式
      • XML方式
      • JSON
      • ProtoBuff
      • 传统数据传送过程
  • 如何让单机的应用程序支持几十万至百万级别的长连接?
  • select、poll、epoll的区别?
  • 水平触发(LT)和边缘触发(ET)?
  • 直接内存比堆内存快在哪里?
  • 什么是零拷贝
    • 内存映射:MMAP
      • Linux之sendfile
        • Linux之slice
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档