一线互联网公司字节跳动后端开发视频架构面经总结
wptr33 2025-01-23 21:52 26 浏览
这篇文章主要介绍了字节跳动后端开发视频架构面经总结,觉得挺不错的,现在分享给大家,也给大家做个参考。一起过来看看吧
背景
面试方式:视频面(一面)
部门:字节跳动-视频架构-后端开发
主要根据简历上的内容(项目和技能)来问
面试题
1. 视频流的传输方式?(项目)
答:点对点传输,第三方流媒体服务器传输,自主搭建流媒体服务器传输;
2. 项目中是采用UDP-Socket实现心跳包,为什么采用UDP?(项目)
答:心跳包它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。其实TCP和UDP都可以实现心跳包,心跳包采用TCP还是UDP根据项目需要,采用UDP是因为它的速度快,占资源少。
速度快:TCP必须建立连接,而UDP是一个非连接的协议,所以UDP更快;
占资源少:UDP的数据报头部只有8个字节,而TCP数据报头部是20个字节;
3. TCP与UDP的区别?
答:1 基于连接和无连接;
2 TCP是可靠,保证数据正确;UDP不可靠,不保证数据正确;
3 TCP保证数据顺序到达;UDP不保证数据顺序到达;
4 TCP速度慢,因为TCP必须创建连接;UDP速度较快,不需要建立连接;
5 因为上述开销,TCP是一个重量级协议;UDP是一个轻量级的协议;
6 一个TCP数据包报头的大小是20字节;一个UDP数据报报头是8个字节;
7 TCP有流量控制和拥塞控制;UDP不能进行流量控制;
8 TCP面向字节流;UDP面向报文;
9 应用场景不同,TCP适合对效率要求相对低,但对准确性要求相对高或者是有连接的场景,TCP一般用于文件传输(HTTP,HTTPS,FTP等协议),邮件(POP,SMTP等协议),远程登录等场景;UDP更适合对效率要求相对高,对准确性要求相对低的场景,UDP一般用于即时通信(QQ聊天),在线视频(rtsp流速度一定要快,偶尔丢包没关系),网络语音电话等场景;
4. TCP四次挥手讲下?为什么有TIME_WAIT?
答:
1. A不能保证最后的ACK能达到B,如果最后的ACK丢失, 那么B显然收不到, B于是发起了重传FIN的操作, 此时如果A处于CLOSED的状态, 就没办法给对端发ACK了,所以A应该等一段时间,这段时间就是所谓的TIME_WAIT。
2. 保证新旧四元组互不干扰,假设tcp连接是:A(1.2.3.4:8888)------B(6.7.8.9:9999), 这就是一个tcp四元组。
当tcp连接关闭后, 四元组释放。 后面的新连接可能会重用到这个四元组(有这个可能性), 那么问题就来了: 新四元组和旧四元组完全一致, 他们的网络包会混乱吗?
所以,可以考虑这样一个机制:让旧四元组对应的所有网络包都消失后(等一段时间),才允许新四元组建立,颇有点锁的味道。这个等一段时间就是2MSL。
5. TCP比UDP多消耗哪些系统资源?
答:TCP建立连接时三次握手,断开连接时四次挥手;TCP数据包头部20字节,UDP数据包头部8字节;TCP有流量控制和拥塞控制。
6. UDP在内网下有几种NAT方式?
答:NAT(Network Address Translation)即网络地址转换,NAT能将其本地地址转换成全球IP地址。 考虑到UDP的无状态特性,目前针对其的NAT实现大致可分为Full Cone、Restricted Cone、Port Restricted Cone和Symmetric NAT四种。
7. 你了解DDoS攻击吗?
答:拒绝服务攻击(简称DoS攻击),亦称洪水攻击,其目的在于使目标计算机的网络或系统资源耗尽,使服务暂时中断或停止,导致其正常用户无法访问。
当黑客使用网络上两个或以上被攻陷的计算机作为“僵尸”向特定的目标发动“拒绝服务”式攻击时,称为分布式拒绝服务攻击(distributed denial-of-service attack,简称DDoS攻击)。
8. Nginx了解吗,讲一下?
答:Nginx 采用的是多进程(单线程) & 多路IO复用模型。
工作模式:
(1)、Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程。
(2)、接收来自外界的信号,向各worker进程发送信号,每个进程都有可能来处理这个连接。
(3)、master 进程能监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动启动新的 worker 进程。
9. Nginx中master进程和worker进程是怎么通信的?
答:nginx的进程通信分为三种类别:linux 系统与nginx 通信(信号),master 进程与worker进程通信(套接字),worker进程间通信(共享内存)。
(1) linux 系统与nginx 通信
答:linux 系统与nginx是通过信号进行通信的,通过信号控制nginx重启、关闭以及加载配置文件等。比如:./nginx –s quit 向master进程发送信号。
(2) master 进程与worker进程通信
答:master进程与worker进程通过频道(channel)进行通信。创建频道,其实就是socketpair,在启动worker进程时创建频道;
发送消息,master进程通过ngx_signal_woker_processes向worker进程发送消息;响应消息,worker进程通过ngx_read_channel读取消息,然后根据command判断是什么消息。
(3) worker进程间通信
答:worker进程间则是通过共享内存进行通信。它通过 mmap 或者 shmgat 系统调用在内存中创建了一块连续的线性地址空间,而通过 munmap 或者 shmdt 系统调用可以释放这块内存。
使用共享内存的好处是当多个进程使用同一块共享内存时,在任何一个进程修改了共享内存中的内容后,其他进程通过访问这段共享内存都能够得到修改后的内容。
10. 为什么worker进程数和CPU数一致?
答:一是Nginx一般只做高并发代理,基本没用IO操作,算是CPU密集型操作,所以在处理时基本是瞬间完成的,很少出现IO阻塞。
二是进程与CPU调度的关系,单个核心处理多个进程的时候,是排队处理的,所以将worker进程数量设置超过核心数会造成不必要的上下文切换。
11. 多进程上下文切换讲下?
答:上下文切换:为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。
因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的。 从一个进程的运行转到另一个进程上运行,这个过程中经过下面这些变化:
1. 保存处理机上下文,包括程序计数器和其他寄存器。
2. 更新PCB信息。
3. 把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。
4. 选择另一个进程执行,并更新其PCB。
5. 更新内存管理的数据结构。
6. 恢复处理机上下文。 注:总而言之就是很耗资源。
12. 讲一下同步,异步,阻塞,非阻塞,多路IO复用?
答:当一个同步调用发出后,调用者要一直等待返回消息(结果)通知后,才能进行后续的执行;当一个异步过程调用发出后,调用者不能立刻得到返回消息(结果)。
实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务。
非阻塞是指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
13. Nginx属于以上哪种类型?
答:Nginx采用异步非阻塞的事件处理机制,由进程循环处理多个准备好的事件,从而实现高并发和轻量级。
14. 讲一下epoll?
答:epoll是在2.6内核中提出的,是之前的select和poll的增强版本。
相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。
15. 讲下epoll和select的区别?
答:1.select单个进程能够监视的文件描述符数量一般是1024,有数量限制,可以通过修改宏定义甚至重新编译内核来修改,但是会造成效率的降低。
epoll监视的描述符数量不受限制,支持的FD是最大可以打开文件数目。在1GB内存的机器上大约是10万左右。
2.select每次调用都会对socket集合中所有的socket,如果socket集合较大,效率就会线性下降;
epoll不存在这个问题,epoll只会对“活跃”的socket进行操作,
每个fd上有个callback函数,只有“活跃”的socket才会主动去调用callback函数,其他idle状态socket不会。
3.epoll使用mmap加速内核态与用户态的消息传递;Epoll是通过内核与用户空间mmap处于同一块内存实现的。避免了不必要的内存拷贝。
两个编程题:
1 给一个有向图,判断有向图中是否有环,如果有环,环的数量是多少?
2 给一个大小为n的数组,寻找比k小的最大数的位置。
面试经验总结
建议:
1 简历上的东西一定要非常熟悉再熟悉;
2 算法题一定要多刷再多刷;
到此这篇关于字节跳动后端开发视频架构面经总结的文章就介绍到这了,更多相关视频架构面试内容整理了 1000 道 2020年多家公司 java 面试题 400 多页 pdf 文档,还有几百页的Java核心知识点PDF。
关注私信【555】获取,还可领取更多Java面试题资料
相关推荐
- 开发者必看的八大Material Design开源项目
-
MaterialDesign是介于拟物和扁平之间的一种设计风格,自从它发布以来,便引起了很多开发者的关注,在这里小编介绍在Android开发者当中里最受青睐的八个MaterialDesign开源项...
- 另类插这么可爱,一定是…(另类t恤)
-
IT之家(www.ithome.com):另类插图:这么可爱,一定是…OSXMavericks和Yosemite打破了苹果对Mac操作系统传统的命名方式,使用加州的某些标志性景点来替换猫...
- Android常用ADB命令(安卓adb工具是什么)
-
杀死应用①根据包名获取APP的PIDadbshellps|grep应用包名②执行kill命令...
- 微软Mac版PowerPoint测试Reading Order Pane功能
-
IT之家5月20日消息,微软公司昨日(5月19日)发布博文,邀请Microsoft365Insiders成员,测试macOS新版PowerPoint演示文稿应用,重点引入...
- Visual Studio跨平台开发实战(4):Xamarin Android控制项介绍
-
前言不同于iOS,Xamarin在VisualStudio中针对Android,可以直接设计使用者界面.在本篇教学文章中,笔者会针对Android的专案目录结构以及基本控制项进行介绍,包...
- 用云存储30分钟快速搭建APP,你信吗?
-
背景不管你承认与否,移动互联的时代已经到来,这是一个移动互联的时代,手机已经是当今世界上引领潮流的趋势,大型的全球化企业和中小企业都把APP程序开发纳入到他们的企业发展策略当中。但随着手机APP上传的...
- 谷歌P图神器来了!不用学不用教,输入一句话,分分钟给结果
-
Pine发自凹非寺量子位|公众号QbitAI当你拍照片时,“模特不好好配合”怎么办?...
- iOS文本编辑控件UITextField和UITextVie
-
记录一个菜鸟的IOS学习之旅,如能帮助正在学习的你,亦枫不胜荣幸;如路过的大神如指教几句,亦枫感激涕淋!细心的朋友可能已经注意到了,IOS学习之旅系列教程在本篇公众号的文章中,封面已经换成美女图片了,...
- Android入门图文教程集锦(android 入门教程)
-
Android入门视频教程集锦AndroidStudio错误gradientandroid:endXattributenotfound...
- 如何使用Android自定义复合视图(如何使用android自定义复合视图)
-
在最近的一个客户应用中,我遇到了一个需求,根据选定的值来生成指定数量的编辑框字段,这样用户可以输入人物信息。最初我的想法是把这些逻辑放到Fragment中,只是根据选中值的变化来向线性布局容器中增加编...
- 原生安卓开发app的框架frida常用关键代码定位
-
前言有时候可能会对APP进行字符串加密等操作,这样的话你的变量名等一些都被混淆了,看代码就可能无从下手...
- 教程10 | 三分钟搞定一个智能输入法程序
-
一案例描述1、考核知识点网格布局线性布局样式和主题Toast2、练习目标掌握网格布局的使用掌握Toast的使用掌握线性布局的使用...
- (Android 8.1) 功能与新特性(android的功能)
-
和你一起终身学习,这里是程序员AndroidAndroid8.1(API级别27)为用户和开发人员引入了各种新特性和功能。本文档重点介绍了开发人员的新功能。通过本章阅读,您将获取到以下内容:Andr...
- 怎样设置EditText内部文字被锁定不可删除和修改
-
在做项目的时候,我曾经遇到过这样的要求,就是跟百度贴吧客户端上的一样,在回复帖子的时候,在EditText中显示回复人的名字,而且这个名字不可以修改和删除,说白了就是不可操作,只能在后面输入内容。在E...
- 如何阻止 Android 活动启动时 EditText 获得焦点
-
技术背景在Android开发中,当活动启动时,EditText有时会自动获得焦点并弹出虚拟键盘,这可能不是用户期望的行为。为了提升用户体验,我们需要阻止...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
-
- 开发者必看的八大Material Design开源项目
- 另类插这么可爱,一定是…(另类t恤)
- Android常用ADB命令(安卓adb工具是什么)
- 微软Mac版PowerPoint测试Reading Order Pane功能
- Visual Studio跨平台开发实战(4):Xamarin Android控制项介绍
- 用云存储30分钟快速搭建APP,你信吗?
- 谷歌P图神器来了!不用学不用教,输入一句话,分分钟给结果
- iOS文本编辑控件UITextField和UITextVie
- Android入门图文教程集锦(android 入门教程)
- 如何使用Android自定义复合视图(如何使用android自定义复合视图)
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)