说实话,确实有点难

2023-12-26 15:59
文章标签 确实 有点 说实话

本文主要是介绍说实话,确实有点难,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天刷到一个帖子,看到之后有点唏嘘,现在 实习面试题 都这么难啊!

搁我那时候,一个 SSH 杀到底,都问些啥面向对象三大特性,然后三次握手啥的差不多了。

我们来看下这位小伙伴面试字节跳动技术中台暑期实习一面的面试题:

TCP 有什么值得改进的地方

这个问题其实挺考验人的。

能答出这个问题首先需要了解 tcp 的所有特性,然后对一些场景有自己的思考。

TCP 身为传输层协议,已叱咤江湖多年,本身没有什么严重的缺陷,无非是因为有些场景,导致 TCP 的特点变成缺点。

比如直播的业务场景下,更适合用 UDP,TCP 的可靠性传输在这个场景反而是缺点。

所以,我们要基于 TCP 的特性出发,结合实际,从另一个方面考虑这个特性可能产生的问题。

我举个例子,比如 TCP 是基于四元组的(源IP地址、目的IP地址、源端口、目的端口),那假设我们网络切换了(从外面回到家,5G变wifi),或者之前的连接超时了,后面重连了个,但是 IP 换了,这种情况,四元组变了。

而四元组的变化就导致之前的连接不可用,于是需要重新建连,建连我们都知道有时延(三次握手),所以这是不是一个值得改进的地方(追求体验极致)?

还有 TCP 保证有序性,导致队头阻塞的情况,我们拿 HTTP 使用 TCP 来说说。

我们都知道 HTTP1.1 有个 Pipelining 机制,允许基于一条 TCP 连接同时发送多次 HTTP 请求

图来自网络

但是对 HTTP 响应的顺序还是有要求的,必须等待第一个 HTTP 请求返回,后面的请求才能返回。

基于这一点 HTTP2.0 利用多路复用,将请求拆成多个帧来传输,但是这其实没有解决 TCP 队头阻塞的情况,因为底层还是利用 TCP 传输的,TCP 是有序的。

虽然拆成了多个帧,但是前面的帧没返回,后面的帧其实也会被阻塞,在这种场景下 TCP 也需要改进。

还有 TCP 的拥塞控制算法,我看帖子评论区很多同学提到了 BBR,这挺好的,但是这拥塞算法是 TCP 的一部分,不能认为不是一个值得改进的地方。

小贴士:BBR 是Google 2016年发布的拥塞算法,之前大部分拥塞算法是基于丢包的情况来降低传输效率,而 BBR 会基于模型主动探测。

但是我们可以从拥塞控制算法的 灵活替换 来说, TCP 其实有好多拥塞控制算法的实现:

  1. TCP Tahoe 和 Reno

  2. TCP Vegas

  3. TCP New Reno

  4. TCP Hybla

  5. TCP BIC 和 CUBIC

  6. TCP Westwood和Westwood+

  7. Compound TCP

  8. TCP PRR

  9. TCP BBR

我在维基百科上面看到有这么多算法实现,不同算法其实有不同的适配场景,比如:

我们都知道,TCP 相对而言是比较底层的,不像我们 HTTP 协议,身处应用层可以很方便的替换,所以它不太方便我们基于不同场景灵活替换合适的拥塞控制算法,要扯的话其实这也是一方面。

好了,不吹牛了,以上其实就是 QUIC 协议针对当前 HTTP/TCP 协议的缺点作的一些优化。

QUIC 协议底层用的是 UDP,然后自己实现了一套机制保准了传输的可靠性,从这个角度理解,其实就是嫌弃 TCP 不好,所以这个问题从 QUIC 解决 TCP 的一些问题来回答是再合适不过啦。

更多细节同学们自行去查阅 QUIC 相关资料吧!

给你一个四核CPU 计算圆周率,你的最大线程池参数和核心线程数会怎么设计呢

给你一个四核CPU 计算圆周率

这一句话表明你这个线程池将要运行的任务是 CPU 密集型,也就是说基本上 CPU 在做纯运算,不需要等待。

与之对应的是 IO 密集型,IO 密集型的话,CPU 的利用率就不会很高,因为 CPU 跑着跑着需要等待 IO (数据库的读取,文件的读写,网络请求等)的返回。

基于这两种特性,线程池的参数是不一样的。

你可能会在网上或者书上看到很多配置公式,比如:

  • CPU 密集型的话,核心线程数设置为 CPU核数+1

  • I/O 密集型的话,核心线程数设置为 2*CPU核数

不过, 线程数真的很难通过一个公式一劳永逸,以上只是一个理论值 ,线程数的设定是一个迭代的过程,需要 压测 调整,以上的公式做个初始值开始调试是 ok 的。

所以初步判断核心线程池其实 4 就够了,最大线程数可以设置为 5。

总结下这题的回答思路:跟面试官分析下是 CPU 密集型,然后说初始值可以设置为 CPU核数, 最后设定还是需要压测,根据实际业务场景的情况再来调整线程数 。

线程和进程的区别,除了它们资源持有者和调度单位外

其实我也不知道这个问题面试官打算问啥,因为它们之间最显著的区别就是资源和调度。

线程是程序执行的最小单位,进程是操作系统分配资源的最小单位 。

既然这两个最显著的区别排除了,我们就从别的角度入手,比如我们常提到的上下文切换。

其实一开始是没有线程的,只有进程的概念。

而随着计算机的发展,对运行的要求越来越高,计算机同时运行的程序也越来越多, 进程作为最小调度单位就显得太大了 。

因为进程是资源分配的最小单位,切进程其实就是切资源,再具体点(影响最大的)其实就是虚拟地址空间的切换。

每个进程都有自己的虚拟地址空间,即需要有页表,把虚拟地址映射到物理地址,而这个页表需要频繁访问,所以 CPU 会做 cache,即 TLB(Translation Lookaside Buffer)。

如果切换进程,页表就换了,这个 cache 就失效了,失效了之后,虚拟地址转换为物理地址就变慢,这就导致程序变慢。

所以后面抽象出线程,我们知道一个进程里的线程是共享内存空间的,所以一个进程内部线程切换是不需要更换页表的。

因此,这个问题我们可以从线程和进程上下文切换的角度入手来回答。

当然,我也不知道这是不是面试官想要的答案,仅供参考。

最后

好了,我个人认为这类问题对暑期实习同学来说,确实有点难。

换位思考下,如果是身处大学的我肯定答不出来。

但是,从帖子评论区有这么多同学能说出 QUIC 等关键词来看,其实这类问题也真不是为难人。

因为有人可以联想到这块,说明有人可以答出来。

近年来网上的资料越来越多,像我以前看 B 站都是看鬼畜,现在上面源码讲解的一大堆,对应到面试官身上,需要通过更难、更复杂的问题来筛选候选人。

你想想,你要是面试官,你问个题目,100个人里面有99个能答出来,那问的意义就比较小,总不可能 99 个都招进来吧?

所以,只能出一些 100个人里面只有几个人能答出来的,这样才便于企业筛选合适的候选人,这是没办法的。

那怎么办呢?只能学咯,平日学习还要多思考,其实很多问题你只要有自己的想法,就很容易进行联想,进行延伸,能跟面试官多来个几回合,这样更容易脱颖而出,拿下 offer!

最后祝各位 offer 拿到手软, 我这边提供一个有关面试的服务,最近大概跟10多位小伙伴操作了下,反响还行,有兴趣的可以看看 :

这篇关于说实话,确实有点难的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/540046

相关文章

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

最近心情有点复杂:论心态

一月一次的彷徨又占据了整个身心;彷徨源至不自信;而不自信则是感觉自己的价值没有很好的实现亦或者说是自己不认可自己的目前的生活和状态吧。 我始终相信一句话:任何人的生活形态完全是由自己决定的;外在的总归不能直达一个人的内心深处。所以少年 为了自己想要的生活 多坚持努力吧、不为别人只为自己心中的那一丝执着。 由此我看到了一个故事: 一个心情烦躁的人去拜访禅师。他问禅师:我这辈子就这么注定了吗?您

关于跳槽,是我心浮气躁?还是我确实该离开了?

最近可能要跳槽了所以准备整理一下JVM、多线程、I/O、设计模式、内存管理以及使用过的一些框架知识点以应付笔试面试吧。即便不为面试,也是必须要整理并学习的。只是现在需要急促点罢了。原本想细细品味,现在只能粗糙阅读了。即便不能细细品味,这些东西的了解也要准备一两个月左右吧。 说到跳槽,博主刚毕业不够一年就想着跳槽,似乎有点太心浮气躁了,然而其实博主还是一个比较慎重的人,此决定是经过深思熟虑的,原因

9:00面试,9:05就出来了,问的问题有点出乎意料!

从小厂跳槽出来,本以为能在新公司大展拳脚,没想到没多久就再次遭遇困境。 入职初期,加班成了家常便饭,尽管如此,考虑到薪酬还算可观,我并没有过多抱怨。然而,到了六月,一纸通知打破了平静——公司宣布薪资要下调百分之四十。这样一来,连基本的生活开销都成了问题。 这一连串的变故让我措手不及,原本满怀期待的心情瞬间跌入谷底。面对突如其来的挑战,我不得不重新审视自己的职业规划,并思考下一步该何去何从。

电脑丢失dll文件一键修复之dll确实损坏影响电脑运行

在使用电脑过程中,DLL文件丢失或损坏是一个常见的问题,它可能导致程序无法正常运行,甚至影响整个系统的稳定性。本文将详细介绍如何一键修复丢失的DLL文件,探讨常见的DLL丢失报错原因,并提供详细的修复步骤和预防措施。 例如以下问题:启动某个程序的时候,系统弹出以下弹窗。 电脑丢失dll文件修复方法一、DLL文件丢失的一键修复 DLL文件丢失时,最直接的方法是使用DLL修复工具进行一键

做测开的第4年,开始有点失望了

大家好,我是洋子,看到新一年的毕业季,意味着我工作马上满4年了 从一毕业就进入测试行业到现在,我已经褪去学生的气息,成为一名社畜工具人 这4年当中,我有3年半都在同一家互联网大厂工作,岗位是测开,厂内大家都叫QA 2024年已经过半了,整个就业大环境依然对打工人很不友好,裁员还是家常便饭,唯一看到的风口还是大模型,大模型的快速发展,激起了广泛讨论,未来究竟自己会不会被AI所取代? 说到大模

「Debug R」明明我用的是数据框,为啥运行结果有点不对劲

在「Debug R」有些你认为的报错不是报错(error),是警告(warnnings)里,我解决了一个使用者在 tibble 数据结构赋予行名出现的问题。 这次问题和上次类似,也是没有注意到自己用的数据结构其实不是普通的数据框了,只不过这次的问题的主角是 data.table。 果子老师很喜欢用data.table的一个函数---fread, 它的读取速度非常快,而且使用非常方便,基本不怎么

SwipeCardView有点类似于stackview的控件

业余时间写了一个类似stackview的控件,可以循环抽取.还不是很完善,算是给有需要的朋友提供个基本思路吧.有更好的建议请告知. github地址:https://github.com/X-FAN/SwipeCardView 先上效果图 源码作了简单注释 public class SwipeCardView extends ViewGroup {private int mInitX

c#基础,有点懵,麻烦各位进来看看

这两种写法就是一个在方法中,一个在方法外。 第一种在方法中的写法,方法执行完了的list会被释放掉吗? 抛去在在方法中创建list的消耗,在性能、内存、堆栈上是一样的吗? 本来我一直用的是第一种,今天被领导说了一下,有点懵。 这一种方法执行完了以后list有没有被释放掉 全网传媒http://quanwangif.com/